SSIS:如何以编程方式生成采用输入源列(EmpID)的派生新列(RowKey)? [英] SSIS: how to Programatically genrate derived new column(RowKey) that takes input source column(EmpID)?

查看:33
本文介绍了SSIS:如何以编程方式生成采用输入源列(EmpID)的派生新列(RowKey)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请听我的代码,但会出现错误验证错误.这是一个程序化的

Bellow the my code but that gives the error "Validation error. This is a programmed

  TaskHost TKHSQLHost = (TaskHost)exe;
  TKHSQLHost.Name = "Dataflow Task";
  MainPipe dataFlowTask = (MainPipe)TKHSQLHost.InnerObject;
  // Create the source component.
  IDTSComponentMetaData100 source =dataFlowTask.ComponentMetaDataCollection.New();
  source.ComponentClassID = "DTSAdapter.OleDbSource";
  CManagedComponentWrapper srcDesignTime = source.Instantiate();
  srcDesignTime.ProvideComponentProperties();
  // Assign the connection manager.
  if (source.RuntimeConnectionCollection.Count > 0)
  {
     source.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(ConnMgrAdvent);
     source.RuntimeConnectionCollection[0].ConnectionManagerID =pkg.Connections["EmpCon"].ID;
   }
  // Set the custom properties of the source.
  srcDesignTime.SetComponentProperty("AccessMode", 0);
  srcDesignTime.SetComponentProperty("OpenRowset", "[dbo].[Employee]");
  // Connect to the data source, and then update the metadata for the source.
  srcDesignTime.AcquireConnections(null);
  srcDesignTime.ReinitializeMetaData();
  srcDesignTime.ReleaseConnections();
  // Create the destination component.
  IDTSComponentMetaData100 destination =dataFlowTask.ComponentMetaDataCollection.New();
  destination.ComponentClassID = "DTSAdapter.OleDbDestination";
  CManagedComponentWrapper destDesignTime = destination.Instantiate();
  destDesignTime.ProvideComponentProperties();
  // Assign the connection manager.
  destination.RuntimeConnectionCollection[0].ConnectionManager =DtsConvert.GetExtendedInterface(ConnMgrImport_DB);
  if (destination.RuntimeConnectionCollection.Count > 0)
   {
         destination.RuntimeConnectionCollection[0].ConnectionManager =DtsConvert.GetExtendedInterface(ConnMgrImport_DB);
         destination.RuntimeConnectionCollection[0].ConnectionManagerID =pkg.Connections["stgEmpCon"].ID;
    }
    // Set the custom properties of the destination
     destDesignTime.SetComponentProperty("AccessMode", 0);
     destDesignTime.SetComponentProperty("OpenRowset", "[dbo].[emp12]");
    // Connect to the data source, and then update the metadata for the source.
    destDesignTime.AcquireConnections(null);
    destDesignTime.ReinitializeMetaData();
    destDesignTime.ReleaseConnections();   
    //Derived Column
     IDTSComponentMetaData100 derived =dataFlowTask.ComponentMetaDataCollection.New();
     derived.Name = "Derived Column Component";
     derived.ComponentClassID = "DTSTransform.DerivedColumn.3";
     CManagedComponentWrapper DesignDerivedColumns = derived.Instantiate();
     DesignDerivedColumns.ProvideComponentProperties();        //design time
     derived.InputCollection[0].ExternalMetadataColumnCollection.IsUsed = false;
     derived.InputCollection[0].HasSideEffects = false;
     //update the metadata for the derived columns
     DesignDerivedColumns.AcquireConnections(null);
     DesignDerivedColumns.ReinitializeMetaData();
     DesignDerivedColumns.ReleaseConnections();
     //Create the path from source to derived columns 
     IDTSPath100 SourceToDerivedPath = dataFlowTask.PathCollection.New(); 
   SourceToDerivedPath.AttachPathAndPropagateNotifications(source.OutputCollection[0], derived.InputCollection[0]);
      //Create the path from derived to desitination
      IDTSPath100 DerivedToDestinationPath = dataFlowTask.PathCollection.New();            DerivedToDestinationPath.AttachPathAndPropagateNotifications(derived.OutputCollection[0], destination.InputCollection[0]);                    
      **IDTSOutputColumn100 myCol = derived.OutputCollection[0].OutputColumnCollection.New();
      myCol.Name = "RowKey";               myCol.SetDataTypeProperties(Microsoft.SqlServer.Dts.Runtime.Wrapper.DataType.DT_I4,0 , 0, 0,0);
      myCol.ExternalMetadataColumnID = 0;
      myCol.ErrorRowDisposition = DTSRowDisposition.RD_FailComponent;
      myCol.TruncationRowDisposition = DTSRowDisposition.RD_FailComponent;
      IDTSCustomProperty100 myProp = myCol.CustomPropertyCollection.New();
      myProp.Name = "Expression";        
      myProp.Value = "Empid";         
      myProp = myCol.CustomPropertyCollection.New();**strong text**
      myProp.Name = "FriendlyExpression";
      myProp.Value = "Empid";**
      IDTSInput100 dInput = derived.InputCollection[0];
      IDTSVirtualInput100 vdInput = dInput.GetVirtualInput();//Get this components default input and virtual input                           
      //Create the input columns for the transformation component 
      IDTSInput100 input = derived.InputCollection[0];
      IDTSVirtualInput100 derivedInputVirtual = input.GetVirtualInput();           
      input.ErrorRowDisposition = DTSRowDisposition.RD_NotUsed;
      input.ErrorOrTruncationOperation = "";
      DesignDerivedColumns.ReleaseConnections();
      // Get the destination's default input and virtual input.
      IDTSInput100 destinationinput = destination.InputCollection[0];
      int destinationInputID = input.ID;
      IDTSVirtualInput100 vdestinationinput = destinationinput.GetVirtualInput();
      //Iterate through the virtual input column collection.
      foreach (IDTSVirtualInputColumn100 vColumn in vdestinationinput.VirtualInputColumnCollection)
       {
           IDTSInputColumn100 vCol = destDesignTime.SetUsageType(destinationinput.ID, vdestinationinput, vColumn.LineageID, DTSUsageType.UT_READWRITE);
           String cinputColumnName = vColumn.Name;
           var columnExist = (from item in destinationinput.ExternalMetadataColumnCollection.Cast<IDTSExternalMetadataColumn100>()
                                   where item.Name == cinputColumnName
                                   select item).Count();
                if (columnExist > 0)
                    destDesignTime.MapInputColumn(destinationinput.ID, vCol.ID, destinationinput.ExternalMetadataColumnCollection[vColumn.Name].ID);
       }                
    app.SaveToXml(@"D:\TestEmp.dtsx", pkg, null);  

推荐答案

我在设计时属性的 derivrd 列中添加了以下内容.然后它工作正常.

I added following to derivrd column to the design time properties.Then its working fine.

    IDTSInput100 DerivedColumnInput = derived.InputCollection[0];
    IDTSVirtualInput100 DerivedColumnVirtualInput = DerivedColumnInput.GetVirtualInput();
    IDTSVirtualInputColumnCollection100 DerivedColumnVirtualInputColumns = DerivedColumnVirtualInput.VirtualInputColumnCollection;

    // Added the below to validate input columns
    foreach (IDTSVirtualInputColumn100 virtualInputColumnDT in DerivedColumnVirtualInputColumns)
    {
        // Select column, and retain new input column
        if (virtualInputColumnDT.Name=="EmpID")
        {

            DesignDerivedColumns.SetUsageType(DerivedColumnInput.ID, DerivedColumnVirtualInput, virtualInputColumnDT.LineageID, DTSUsageType.UT_READONLY);

        }

    }

这篇关于SSIS:如何以编程方式生成采用输入源列(EmpID)的派生新列(RowKey)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆