Search code examples
c#-4.0sql-server-2012ssis-2012

Derived column was not map to output column? How can i do?


Package is successfully generated. but derived column showing the error bellow- Validation error. This is a programmed DataFlowTask Derived Column [2]: Attempt to parse the expression "Empid" failed and returned error code 0xC00470A2. The expression cannot be parsed. It might contain invalid elements or it might not be well-formed. There may also be an out-of-memory error. MyProgrammedDataflowTaskWithDerivedColumn.dtsx

bellow is my code-

// Create an application Application app = new Application(); // Create a package Package pkg = new Package(); //Setting some properties pkg.Name = @"MyProgrammedDataflowTaskWithDerivedColumn"; //Adding a connection to the database AdventureWorksLT2008R2 ConnectionManager ConnMgrAdvent = pkg.Connections.Add("OLEDB"); ConnMgrAdvent.ConnectionString = "Data Source=412-1682;Initial Catalog=Empdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"; ConnMgrAdvent.Name = @"AdventureWorks2008R2"; ConnMgrAdvent.Description = @"SSIS Connection Manager for OLEDB Source"; //Adding a connection to the database Import_DB ConnectionManager ConnMgrImport_DB = pkg.Connections.Add("OLEDB"); ConnMgrImport_DB.ConnectionString = "Data Source=412-1682;Initial Catalog=stgEmpdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"; ConnMgrImport_DB.Name = @"Import_DB"; ConnMgrImport_DB.Description = @"SSIS Connection Manager for OLEDB Source";

        //Adding the dataflow task to the package
        Executable exe = pkg.Executables.Add("STOCK:PipelineTask");
       TaskHost TKHSQLHost = (TaskHost)exe;
        TKHSQLHost.Name = "This is a programmed DataFlowTask";
        MainPipe dataFlowTask = (MainPipe)TKHSQLHost.InnerObject;

        // Create the source component.
        IDTSComponentMetaData100 source =
        dataFlowTask.ComponentMetaDataCollection.New();
        source.ComponentClassID = "DTSAdapter.OleDbSource.3";
        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["AdventureWorks2008R2"].ID;
        }

        // Set the custom properties of the source.
        srcDesignTime.SetComponentProperty("AccessMode", 0);
        srcDesignTime.SetComponentProperty("OpenRowset", "[dbo].[emp1]");

        // 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.3";
        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["Import_DB"].ID;
        }

        // Set the custom properties of the destination
        destDesignTime.SetComponentProperty("AccessMode", 0);
        destDesignTime.SetComponentProperty("OpenRowset", "[dbo].[emp1]");

        // 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]);

 //       derivedColumns.SetUsageType(dInput.ID, vdInput, vColumn.LineageID, DTSUsageType.UT_READONLY);
        //Give me an output column

        IDTSInput100 dInput;
        IDTSVirtualInput100 vdInput;
        //Get this components default input and virtual input                    
        dInput = derived.InputCollection[0];
        vdInput = dInput.GetVirtualInput();
        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";// + vColumn.LineageID;
               myProp = myCol.CustomPropertyCollection.New();

               myProp.Name = "FriendlyExpression";
               myProp.Value = "Empid";


        //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);

            destDesignTime.MapInputColumn(destinationinput.ID, vCol.ID, destinationinput.ExternalMetadataColumnCollection[vColumn.Name].ID);
        }

       app.SaveToXml(String.Format(@"D:\{0}.dtsx", pkg.Name), pkg, null); 

Solution

  • solved this by adding bellow code to validate derived column component :-

                IDTSInput100 DerivedColumnInput = derived.InputCollection[0];
                IDTSVirtualInput100 DerivedColumnVirtualInput = DerivedColumnInput.GetVirtualInput();
                IDTSVirtualInputColumnCollection100 DerivedColumnVirtualInputColumns = DerivedColumnVirtualInput.VirtualInputColumnCollection;
    
                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);
                    }
            }