protected virtual void MatchInputColumns(Dictionary <string, int> converted, bool needschema)
        {
            IDTSComponentMetaData100 comp  = this.MetadataCollection;
            CManagedComponentWrapper dcomp = comp.Instantiate();

            IDTSInput100        input  = comp.InputCollection[0];
            IDTSVirtualInput100 vInput = input.GetVirtualInput();
            IDTSVirtualInputColumnCollection100     vColumns  = vInput.VirtualInputColumnCollection;
            IDTSExternalMetadataColumnCollection100 exColumns = input.ExternalMetadataColumnCollection;

            if (exColumns != null && exColumns.Count > 0)
            {
                bool hasMatch = false;
                foreach (IDTSExternalMetadataColumn100 exColumn in exColumns)
                {
                    int inputColId;
                    if (converted.ContainsKey(exColumn.Name.ToLower()))
                    {
                        inputColId = (int)converted[exColumn.Name.ToLower()];
                    }
                    else
                    {
                        inputColId = FindVirtualInputColumnId(vColumns, exColumn.Name);
                    }

                    if (inputColId == 0)
                    {
                        //the column wasn't found if the Id is 0, so we'll print out a message and skip this row.
                        PrintOutput.PrintToOutput("DE could not map external column " + exColumn.Name + ". Skipping column.", DERun.Debug);
                    }
                    else
                    {
                        // create input column
                        IDTSInputColumn100 vCol = dcomp.SetUsageType(input.ID, vInput, inputColId, DTSUsageType.UT_READONLY);
                        // and then we'll map it to the input row.
                        dcomp.MapInputColumn(input.ID, vCol.ID, exColumn.ID);
                        hasMatch = true;
                    }
                }
                if (!hasMatch)
                {
                    throw new InvalidArgumentException("Unable to map input to destination");
                }
            }
            //if output schema is required and not provided
            else if (needschema)
            {
                //PrintOutput.PrintToError("No destination columns available");
                throw new InvalidArgumentException("No destination columns available");
            }
            //otherwise use virtual inputs
            else
            {
                foreach (IDTSVirtualInputColumn100 vColumn in vColumns)
                {
                    // create input column for all virtual input columns
                    dcomp.SetUsageType(input.ID, vInput, vColumn.LineageID, DTSUsageType.UT_READONLY);
                }
            }
        }
        //checks if output metadata matches external output metadata
        public override bool isExternalMetadataValid()
        {
            //get default output
            IDTSOutput100 output = null;

            for (int i = 0; i < ComponentMetaData.OutputCollection.Count; i++)
            {
                if (!ComponentMetaData.OutputCollection[i].IsErrorOut)
                {
                    output = ComponentMetaData.OutputCollection[i];
                }
            }

            //get default output external metadata
            IDTSExternalMetadataColumnCollection100 externalMetaData = output.ExternalMetadataColumnCollection;

            //return false if output column metadata does not match external column metadata
            foreach (IDTSOutputColumn100 col in output.OutputColumnCollection)
            {
                IDTSExternalMetadataColumn100 ecol = externalMetaData.GetObjectByID(col.ExternalMetadataColumnID);

                if (col.DataType != ecol.DataType ||
                    col.Precision != ecol.Precision ||
                    col.Length != ecol.Length ||
                    col.Scale != ecol.Scale)
                {
                    return(false);
                }
            }

            return(true);
        }
Exemple #3
0
        public override IDTSComponentMetaData100 AddSourceAdapter(IDTSPipeline100 pipeline, ConnectionManager srcConnMgr)
        {
            if (String.IsNullOrEmpty(quotedTableName))
            {
                throw new ArgumentException("Source table name is empty");
            }
            IDTSComponentMetaData100 srcComp = pipeline.ComponentMetaDataCollection.New();
            srcComp.ComponentClassID = OLEDB_SRC_GUID;
            srcComp.ValidateExternalMetadata = true;
            IDTSDesigntimeComponent100 srcDesignTimeComp = srcComp.Instantiate();
            srcDesignTimeComp.ProvideComponentProperties();
            srcComp.Name = "OleDB Source - Sql Server";
            srcDesignTimeComp.SetComponentProperty("AccessMode", 0);
            srcDesignTimeComp.SetComponentProperty("OpenRowset", quotedTableName);

            // set connection
            srcComp.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(srcConnMgr);
            srcComp.RuntimeConnectionCollection[0].ConnectionManagerID = srcConnMgr.ID;
            
            // get metadata
            srcDesignTimeComp.AcquireConnections(null);
            srcDesignTimeComp.ReinitializeMetaData();
            srcDesignTimeComp.ReleaseConnections();

            extCols = srcComp.OutputCollection[0].ExternalMetadataColumnCollection;

            return srcComp;
        }
        public override IDTSComponentMetaData100 AddDestAdapter(IDTSPipeline100 pipeline, ConnectionManager destConnMgr, out IDTSDesigntimeComponent100 destDesignTimeComp)
        {
            if (String.IsNullOrEmpty(quotedTableName))
            {
                throw new ArgumentException("Destination table name is empty");
            }
            IDTSComponentMetaData100 destComp = pipeline.ComponentMetaDataCollection.New();

            destComp.ComponentClassID         = OLEDB_DEST_GUID;
            destComp.ValidateExternalMetadata = true;
            destDesignTimeComp = destComp.Instantiate();
            destDesignTimeComp.ProvideComponentProperties();
            destComp.Name = "OleDB Destination - Sql Server";
            destDesignTimeComp.SetComponentProperty("AccessMode", 0);
            destDesignTimeComp.SetComponentProperty("OpenRowset", quotedTableName);

            // set connection
            destComp.RuntimeConnectionCollection[0].ConnectionManager   = DtsConvert.GetExtendedInterface(destConnMgr);
            destComp.RuntimeConnectionCollection[0].ConnectionManagerID = destConnMgr.ID;

            // get metadata
            destDesignTimeComp.AcquireConnections(null);
            destDesignTimeComp.ReinitializeMetaData();
            destDesignTimeComp.ReleaseConnections();

            extCols = destComp.InputCollection[0].ExternalMetadataColumnCollection;

            return(destComp);
        }
        public override bool  isExternalMetadataValid()
        {
            IDTSExternalMetadataColumnCollection100 exColumns = ComponentMetaData.InputCollection[0].ExternalMetadataColumnCollection;
            Layer       OGRLayer      = this.getLayer();
            FeatureDefn OGRFeatureDef = OGRLayer.GetLayerDefn();

            // Get Geometry column name
            string geomtryColumn = (OGRLayer.GetGeometryColumn() != "") ? OGRLayer.GetGeometryColumn() : "GEOMETRY";

            //check for correct number of external metadata columns
            if (OGRFeatureDef.GetFieldCount() + 1 != exColumns.Count)
            {
                return(false);
            }

            //validate each external metadata column
            for (int i = 0; i < exColumns.Count; i++)
            {
                IDTSExternalMetadataColumn100 col = exColumns[i];

                if (col.Name == geomtryColumn)
                {
                    if (col.DataType != DataType.DT_IMAGE)
                    {
                        return(false);
                    }
                    // Check geometry column custom property against source
                    if ((string)ComponentMetaData.CustomPropertyCollection["Geometry Column"].Value != geomtryColumn)
                    {
                        return(false);
                    }
                }
                else
                {
                    //check if ogr field exists by name
                    int OGRFieldIndex = OGRFeatureDef.GetFieldIndex(col.Name);
                    if (OGRFieldIndex == -1)
                    {
                        return(false);
                    }

                    //check if ogr column matches output column type
                    FieldDefn OGRFieldDef  = OGRFeatureDef.GetFieldDefn(OGRFieldIndex);
                    FieldType OGRFieldType = OGRFieldDef.GetFieldType();
                    if (this.OGRTypeToBufferType(OGRFieldType) != col.DataType)
                    {
                        //check for case where OFTString -> DT_NTEXT
                        if (!(OGRFieldType == FieldType.OFTString && col.DataType == DataType.DT_NTEXT))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
Exemple #6
0
        /// <summary>
        /// Constructs an external metadata column and adds it to the provided collection, using the column metadata from the provided output column.
        /// </summary>
        /// <param name="externalMetadataColumnCollection"></param>
        /// <param name="outputColumn"></param>
        /// <returns></returns>
        private IDTSExternalMetadataColumn100 BuildExternalMetadataColumn(IDTSExternalMetadataColumnCollection100 externalMetadataColumnCollection, IDTSOutputColumn100 outputColumn)
        {
            IDTSExternalMetadataColumn100 externalColumnToPopulate = externalMetadataColumnCollection.New();

            externalColumnToPopulate.Name      = outputColumn.Name;
            externalColumnToPopulate.Precision = outputColumn.Precision;
            externalColumnToPopulate.Length    = outputColumn.Length;
            externalColumnToPopulate.DataType  = outputColumn.DataType;
            externalColumnToPopulate.Scale     = outputColumn.Scale;
            externalColumnToPopulate.CodePage  = outputColumn.CodePage;
            return(externalColumnToPopulate);
        }
        /// <summary>
        /// Create an external metadata column for each output. Map the two
        /// by setting the ExternalMetaDataColumnID property of the output to the external metadata column.
        /// </summary>
        /// <param name="output">The output the columns are added to.</param>
        private static void CreateExternalMetaDataColumn(IDTSExternalMetadataColumnCollection100 externalCollection, IDTSOutputColumn100 column)
        {
            // For each output column create an external meta data columns.
            IDTSExternalMetadataColumn100 eColumn = externalCollection.New();

            eColumn.Name      = column.Name;
            eColumn.DataType  = column.DataType;
            eColumn.Precision = column.Precision;
            eColumn.Length    = column.Length;
            eColumn.Scale     = column.Scale;

            column.ExternalMetadataColumnID = eColumn.ID;
        }
Exemple #8
0
        public static IDTSExternalMetadataColumn100 FindExternalColumnByName(string name, IDTSExternalMetadataColumnCollection100 externalColumnCollection, bool ignoreCase)
        {
            if (externalColumnCollection != null)
            {
                foreach (IDTSExternalMetadataColumn100 ec in externalColumnCollection)
                {
                    StringComparison comparisonType = ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture;
                    if (ec.Name.Equals(name, comparisonType))
                    {
                        return ec;
                    }
                }
            }

            return null;
        }
        public override bool  isMetadataValid()
        {
            IDTSExternalMetadataColumnCollection100 externalMetaData = ComponentMetaData.InputCollection[0].ExternalMetadataColumnCollection;

            foreach (IDTSInputColumn100 col in ComponentMetaData.InputCollection[0].InputColumnCollection)
            {
                IDTSExternalMetadataColumn100 ecol = externalMetaData.GetObjectByID(col.ExternalMetadataColumnID);

                if (col.DataType != ecol.DataType ||
                    col.Precision > ecol.Precision ||
                    col.Length > ecol.Length ||
                    col.Scale > ecol.Scale)
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #10
0
        private void createDataTable()
        {
            m_table        = new DataTable();
            m_table.Locale = CultureInfo.InvariantCulture;
            IDTSInput100 iDTSInput = ComponentMetaData.InputCollection[0];
            IDTSExternalMetadataColumnCollection100 iDTSExtCols =
                iDTSInput.ExternalMetadataColumnCollection;
            IDTSInputColumnCollection100 iDTSInpCols =
                iDTSInput.InputColumnCollection;
            int cInpCols = iDTSInpCols.Count;

            m_tableCols = new DataColumn[cInpCols];
            IDTSExternalMetadataColumn100[] mappedExtCols =
                new IDTSExternalMetadataColumn100[cInpCols];
            m_bufferIdxs = new int[cInpCols];
            for (int iCol = 0; iCol < cInpCols; iCol++)
            {
                IDTSInputColumn100 iDTSInpCol = iDTSInpCols[iCol];
                int      metaID   = iDTSInpCol.MappedColumnID;
                DataType dataType = iDTSInpCol.DataType;
                Type     type;
                bool     isLong = false;
                dataType = ConvertBufferDataTypeToFitManaged(dataType,
                                                             ref isLong);
                type = BufferTypeToDataRecordType(dataType);
                m_tableCols[iCol] = new DataColumn(iDTSInpCol.Name, type);
                int lineageID = iDTSInpCol.LineageID;
                try
                {
                    m_bufferIdxs[iCol] = BufferManager.FindColumnByLineageID(
                        iDTSInput.Buffer, lineageID);
                }
                catch (Exception)
                {
                    bool bCancel;
                    //ErrorSupport.FireErrorWithArgs(HResults.DTS_E_ADODESTNOLINEAGEID,
                    //    out bCancel, lineageID, iDTSInpCol.Name);
                    //throw new PipelineComponentHResultException(HResults.
                    //    DTS_E_ADODESTNOLINEAGEID);
                }
            }

            m_table.Columns.AddRange(m_tableCols);
        }
Exemple #11
0
        public override IDTSComponentMetaData100 AddSourceAdapter(IDTSPipeline100 pipeline, ConnectionManager srcConnMgr)
		{
			IDTSComponentMetaData100 srcComp = pipeline.ComponentMetaDataCollection.New();
			srcComp.ComponentClassID = EXCEL_SRC_GUID;
			srcComp.ValidateExternalMetadata = true;
			IDTSDesigntimeComponent100 srcDesignTimeComp = srcComp.Instantiate();
			srcDesignTimeComp.ProvideComponentProperties();
			srcComp.Name = "OleDB Source - Excel";
			srcDesignTimeComp.SetComponentProperty("AccessMode", 0);
			// OleDb provider does not recognize OpenRowSet name quoted with ` 
            srcDesignTimeComp.SetComponentProperty("OpenRowset", UnquotedSheetName);

			// set connection
			srcComp.RuntimeConnectionCollection[0].ConnectionManager = DtsConvert.GetExtendedInterface(srcConnMgr);
			srcComp.RuntimeConnectionCollection[0].ConnectionManagerID = srcConnMgr.ID;
			// get metadata
			srcDesignTimeComp.AcquireConnections(null);
			srcDesignTimeComp.ReinitializeMetaData();
			srcDesignTimeComp.ReleaseConnections();
            extCols = srcComp.OutputCollection[0].ExternalMetadataColumnCollection;
            return srcComp;
		}
        public static bool DoesExternalMetaDataMatchOutputMetaData(IDTSOutput100 output)
        {
            if (output == null)
            {
                throw new ArgumentNullException("output");
            }

            IDTSExternalMetadataColumnCollection100 externalMetaData
                = output.ExternalMetadataColumnCollection;

            foreach (IDTSOutputColumn100 column in output.OutputColumnCollection)
            {
                if (!DoesColumnMetaDataMatch(
                        column,
                        externalMetaData.GetObjectByID(column.ExternalMetadataColumnID)))
                {
                    return(false);
                }
            }

            return(true);
        }
        protected virtual bool needDataTypeChange(IDTSVirtualInput100 vinput, IDTSInput100 input)
        {
            IDTSExternalMetadataColumnCollection100 exColumns = input.ExternalMetadataColumnCollection;

            foreach (IDTSExternalMetadataColumn100 exColumn in exColumns)
            {
                int vColumnID = FindVirtualInputColumnId(vinput.VirtualInputColumnCollection, exColumn.Name);
                if (vColumnID != 0)
                {
                    IDTSVirtualInputColumn100 vColumn = vinput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(vColumnID);
                    if (exColumn.DataType != vColumn.DataType ||
                        exColumn.Length != vColumn.Length ||
                        exColumn.Precision != vColumn.Precision ||
                        exColumn.Scale != vColumn.Scale
                        )
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
        public override IDTSComponentMetaData100 AddDestAdapter(IDTSPipeline100 pipeline, ConnectionManager destConnMgr, out IDTSDesigntimeComponent100 destDesignTimeComp)
        {
            IDTSComponentMetaData100 destComp = pipeline.ComponentMetaDataCollection.New();

            destComp.ComponentClassID         = EXCEL_DEST_GUID;
            destComp.ValidateExternalMetadata = true;
            destDesignTimeComp = destComp.Instantiate();
            destDesignTimeComp.ProvideComponentProperties();
            destComp.Name = "OleDB Destination - Excel";
            destDesignTimeComp.SetComponentProperty("AccessMode", 0);
            // OleDb provider does not recognize OpenRowSet name quoted with `
            destDesignTimeComp.SetComponentProperty("OpenRowset", UnquotedSheetName);

            // set connection
            destComp.RuntimeConnectionCollection[0].ConnectionManager   = DtsConvert.GetExtendedInterface(destConnMgr);
            destComp.RuntimeConnectionCollection[0].ConnectionManagerID = destConnMgr.ID;
            // get metadata
            destDesignTimeComp.AcquireConnections(null);
            destDesignTimeComp.ReinitializeMetaData();
            destDesignTimeComp.ReleaseConnections();
            extCols = destComp.InputCollection[0].ExternalMetadataColumnCollection;
            return(destComp);
        }
        public static void FixExternalMetaDataColumns(IDTSOutput100 output)
        {
            if (output == null)
            {
                throw new ArgumentNullException("output");
            }

            IDTSExternalMetadataColumnCollection100 externalMetaData
                = output.ExternalMetadataColumnCollection;

            externalMetaData.RemoveAll();

            foreach (IDTSOutputColumn100 column in output.OutputColumnCollection)
            {
                IDTSExternalMetadataColumn100 exColumn = externalMetaData.New();
                exColumn.Name      = column.Name;
                exColumn.DataType  = column.DataType;
                exColumn.Precision = column.Precision;
                exColumn.Scale     = column.Scale;
                exColumn.Length    = column.Length;

                column.ExternalMetadataColumnID = exColumn.ID;
            }
        }
        public void BuildExternalMetadataColumnTest()
        {
            PrivateObject p = new PrivateObject(typeof(MongoDataSource.MongoDataSource));

            IDTSOutputColumn100 outputColumn = Mock.Create <IDTSOutputColumn100>(Constructor.Mocked);

            String   expectedName      = "name";
            int      expectedPrecision = 1;
            int      expectedLength    = 2;
            int      expectedScale     = 3;
            DataType expectedDataType  = DataType.DT_TEXT;
            int      expectedCodePage  = 4;

            Mock.Arrange(() => outputColumn.Name).Returns(expectedName);
            Mock.Arrange(() => outputColumn.Precision).Returns(expectedPrecision);
            Mock.Arrange(() => outputColumn.Length).Returns(expectedLength);
            Mock.Arrange(() => outputColumn.DataType).Returns(expectedDataType);
            Mock.Arrange(() => outputColumn.Scale).Returns(expectedScale);
            Mock.Arrange(() => outputColumn.CodePage).Returns(expectedCodePage);

            IDTSExternalMetadataColumnCollection100 outputCollection = Mock.Create <IDTSExternalMetadataColumnCollection100>(Constructor.Mocked);
            IDTSExternalMetadataColumn100           expected         = Mock.Create <IDTSExternalMetadataColumn100>(Constructor.Mocked);

            Mock.Arrange(() => outputCollection.New()).Returns(expected);

            Mock.ArrangeSet(() => expected.Name      = Arg.Matches <String>(x => x == expectedName)).OccursOnce();
            Mock.ArrangeSet(() => expected.Precision = Arg.Matches <int>(x => x == expectedPrecision)).OccursOnce();
            Mock.ArrangeSet(() => expected.Length    = Arg.Matches <int>(x => x == expectedLength)).OccursOnce();
            Mock.ArrangeSet(() => expected.DataType  = Arg.Matches <DataType>(x => x == expectedDataType)).OccursOnce();
            Mock.ArrangeSet(() => expected.Scale     = Arg.Matches <int>(x => x == expectedScale)).OccursOnce();
            Mock.ArrangeSet(() => expected.CodePage  = Arg.Matches <int>(x => x == expectedCodePage)).OccursOnce();

            IDTSExternalMetadataColumn100 actual = (IDTSExternalMetadataColumn100)p.Invoke("BuildExternalMetadataColumn", new object[] { outputCollection, outputColumn });

            Mock.Assert(expected);
        }
        /// <summary>
        /// Create an external metadata column for each output. Map the two 
        /// by setting the ExternalMetaDataColumnID property of the output to the external metadata column.
        /// </summary>
        /// <param name="output">The output the columns are added to.</param>
        private static void CreateExternalMetaDataColumn(IDTSExternalMetadataColumnCollection100 externalCollection, IDTSOutputColumn100 column)
        {
            // For each output column create an external meta data columns.
            IDTSExternalMetadataColumn100 eColumn = externalCollection.New();
            eColumn.Name = column.Name;
            eColumn.DataType = column.DataType;
            eColumn.Precision = column.Precision;
            eColumn.Length = column.Length;
            eColumn.Scale = column.Scale;

            column.ExternalMetadataColumnID = eColumn.ID;
        }
        private void CreateExternalMetaDataColumn(IDTSExternalMetadataColumnCollection100 output, IDTSOutputColumn100 outputColumn)
        {
            // Set the properties of the external metadata column.
            IDTSExternalMetadataColumn100 externalColumn = output.New();
            externalColumn.Name = outputColumn.Name;
            externalColumn.Precision = outputColumn.Precision;
            externalColumn.Length = outputColumn.Length;
            externalColumn.DataType = outputColumn.DataType;
            externalColumn.Scale = outputColumn.Scale;

            // Map the external column to the output column.
            outputColumn.ExternalMetadataColumnID = externalColumn.ID;
        }
		// set ExternalMetadataColumnCollection given the schema table
		private void SetExternalMetadataInfos(
			IDTSExternalMetadataColumnCollection100 iDTSExtCols, 
			DataTable metadataTbl)
		{
			int cCols = metadataTbl.Rows.Count;
			string name = string.Empty;
			int codePage = 0;
			int length = 0;
			int precision = 0;
			int scale = 0;
			DataType dtsType = DataType.DT_EMPTY;
					
			for (int iCol = 0; iCol < cCols; iCol++)
			{
				DataRow currRow = metadataTbl.Rows[iCol];
				IDTSExternalMetadataColumn100 iDTSExtCol = iDTSExtCols.NewAt(iCol);
				SetMetadataValsFromRow(currRow, ref name, ref codePage, ref length, 
					ref precision, ref scale, ref dtsType);
				iDTSExtCol.Name = name;
				iDTSExtCol.CodePage = codePage;
				iDTSExtCol.Length = length;
				iDTSExtCol.Precision = precision;
				iDTSExtCol.Scale = scale;
				iDTSExtCol.DataType = dtsType;
			}
			metadataTbl.Dispose();
		}
        /// <summary>
        /// The mappingGridView aims at enabling the user to define column mappings
        /// from source to target (the MERGE command is created automatically in the background).
        /// This method populates this table. The source columns are populated using
        /// the InputColumnCollection of the input.
        /// The target columns are populated using ExternalMetadataColumnCollection.
        /// Before the target columns are populated, ReinitializeMetadata() is called
        /// to set up ExternalMetadataColumnCollection.
        /// </summary>
        private void populateMappingGridView()
        {
            // The table-name should have been just set
            // Therefore, call ReinitializeMetadata to setup the external metadata columns
            // Which will be used to display the destination columns
            // and to set up the column mapping

            CManagedComponentWrapper pipelineComponent = this.component_.Instantiate();

            pipelineComponent.AcquireConnections(null);
            pipelineComponent.ReinitializeMetaData();
            pipelineComponent.ReleaseConnections();

            needsNewMetaData_ = false;

            IDTSInput100        input        = this.component_.InputCollection[0];
            IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
            IDTSVirtualInputColumnCollection100 virtualColumns = virtualInput.VirtualInputColumnCollection;

            IDTSExternalMetadataColumnCollection100 externalColumns = input.ExternalMetadataColumnCollection;

            // Initialize data structures for creating the MERGE statement
            joinClauses               = new List <string>();
            updateClauses             = new List <string>();
            mappedExternalColumnNames = new List <string>();

            // First, clear all rows in the table
            this.mappingGridView.Rows.Clear();
            mapColumnNameToLineageID_  = new Dictionary <string, int>();
            mapExternalColumnNameToID_ = new Dictionary <string, int>();

            // Now, create a list of external metadata column names
            List <string> externalColumnNames = new List <string>();

            foreach (IDTSExternalMetadataColumn100 externalColumn in externalColumns)
            {
                externalColumnNames.Add(externalColumn.Name);
                mapExternalColumnNameToID_.Add(externalColumn.Name, externalColumn.ID);
            }

            this.TargetColumn.Items.Clear();
            this.TargetColumn.Items.AddRange(externalColumnNames.ToArray());

            // Create a list of actions (join or update) that could be performed on each attribute
            string[]      actions     = new string[] { "Join", "Update" };
            List <string> actionNames = new List <string>();

            foreach (string action in actions)
            {
                actionNames.Add(action);
            }

            this.JoinOrUpdateColumn.Items.Clear();
            this.JoinOrUpdateColumn.Items.AddRange(actionNames.ToArray());

            foreach (IDTSVirtualInputColumn100 virtualColumn in virtualColumns)
            {
                DataGridViewRow row = new DataGridViewRow();
                row.CreateCells(mappingGridView,
                                virtualColumn.UsageType != DTSUsageType.UT_IGNORED,
                                virtualColumn.Name);

                mappingGridView.Rows.Add(row);


                // also, cache the lineage id of this virtual column
                mapColumnNameToLineageID_.Add(virtualColumn.Name, virtualColumn.LineageID);
            }

            // Advanced section

            // Build the first two lines of the merge statement

            IDTSCustomProperty100 propTableName = component_.CustomPropertyCollection[TABLE_OR_VIEW_NAME];
            string tableName = (string)propTableName.Value;

            String mergeStatementPrefix =
                String.Format("MERGE INTO {0} AS TARGET \n USING INPUT-BUFFER AS SOURCE", tableName);

            mergeStatementLabel.Text = mergeStatementPrefix;
        }
        public static IDTSExternalMetadataColumn100 FindExternalColumnByName(string name, IDTSExternalMetadataColumnCollection100 externalColumnCollection, bool ignoreCase)
        {
            if (externalColumnCollection != null)
            {
                foreach (IDTSExternalMetadataColumn100 ec in externalColumnCollection)
                {
                    StringComparison comparisonType = ignoreCase ? StringComparison.InvariantCultureIgnoreCase : StringComparison.InvariantCulture;
                    if (ec.Name.Equals(name, comparisonType))
                    {
                        return(ec);
                    }
                }
            }

            return(null);
        }
        public void AddPathsAndConnectColumns(Hashtable colPairs)
        {
            IDTSOutput100 srcOutput = srcComp.OutputCollection[0];
            IDTSOutputColumnCollection100 srcOutputCols = srcOutput.OutputColumnCollection;
            IDTSInput100 destInput = destComp.InputCollection[0];
            IDTSInputColumnCollection100            destInputCols = destInput.InputColumnCollection;
            IDTSExternalMetadataColumnCollection100 destExtCols   = destInput.ExternalMetadataColumnCollection;

            Hashtable destColtable = new Hashtable(destExtCols.Count);

            foreach (IDTSExternalMetadataColumn100 extCol in destExtCols)
            {
                destColtable.Add(extCol.Name, extCol);
            }

            bool useMatch = (colPairs != null && colPairs.Count > 0);
            // colConvertTable stores a pair of columns which need a type conversion
            // colConnectTable stores a pair of columns which dont need a type conversion and can be connected directly.
            Hashtable colConvertTable = new Hashtable(srcOutputCols.Count);
            Hashtable colConnectTable = new Hashtable(srcOutputCols.Count);

            foreach (IDTSOutputColumn100 outputCol in srcOutputCols)
            {
                // Get the column name to look for in the destination.
                // Match column by name if match table is not used.
                String colNameToLookfor = String.Empty;
                if (useMatch)
                {
                    colNameToLookfor = (String)colPairs[outputCol.Name];
                }
                else
                {
                    colNameToLookfor = outputCol.Name;
                }

                IDTSExternalMetadataColumn100 extCol = (String.IsNullOrEmpty(colNameToLookfor)) ? null : (IDTSExternalMetadataColumn100)destColtable[colNameToLookfor];
                // Does the destination column exist?
                if (extCol != null)
                {
                    // Found destination column, but is data type conversion needed?
                    if (NeedConvert(outputCol.DataType, extCol.DataType))
                    {
                        colConvertTable.Add(outputCol.ID, extCol);
                    }
                    else
                    {
                        colConnectTable.Add(outputCol.ID, extCol);
                    }
                }
            }
            if (colConvertTable.Count > 0)
            {
                // add convert component
                AddConvertComponent(colConvertTable, colConnectTable);
                pipeline.PathCollection.New().AttachPathAndPropagateNotifications(convertComp.OutputCollection[0], destInput);
            }
            else
            {
                // Convert transform not needed. Connect src and destination directly.
                pipeline.PathCollection.New().AttachPathAndPropagateNotifications(srcOutput, destInput);
            }

            IDTSVirtualInput100 destVirInput = destInput.GetVirtualInput();

            foreach (object key in colConnectTable.Keys)
            {
                int colID = (int)key;
                IDTSExternalMetadataColumn100 extCol = (IDTSExternalMetadataColumn100)colConnectTable[key];
                // Create an input column from an output col of previous component.
                destVirInput.SetUsageType(colID, DTSUsageType.UT_READONLY);
                IDTSInputColumn100 inputCol = destInputCols.GetInputColumnByLineageID(colID);
                if (inputCol != null)
                {
                    // map the input column with an external metadata column
                    destDesignTimeComp.MapInputColumn(destInput.ID, inputCol.ID, extCol.ID);
                }
            }
        }
        public IDictionary <int, int> PropagateInputColumns(IDTSExternalMetadataColumnCollection100 exColumns)
        {
            Dictionary <int, int>    converted = new Dictionary <int, int>();
            IDTSComponentMetaData100 comp      = MetadataCollection;
            CManagedComponentWrapper dcomp     = comp.Instantiate();

            IDTSInput100        input  = comp.InputCollection[0];
            IDTSVirtualInput100 vInput = input.GetVirtualInput();
            IDTSVirtualInputColumnCollection100 vColumns = vInput.VirtualInputColumnCollection;

            IDTSOutput100 output = comp.OutputCollection[0];

            output.TruncationRowDisposition = DTSRowDisposition.RD_NotUsed;
            output.ErrorRowDisposition      = DTSRowDisposition.RD_NotUsed;

            //create input columns for destination external
            foreach (IDTSExternalMetadataColumn100 exColumn in exColumns)
            {
                int vColumnID = FindVirtualInputColumnId(vColumns, exColumn.Name);
                if (vColumnID != 0)
                {
                    //do type conversion
                    IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection.GetVirtualInputColumnByLineageID(vColumnID);
                    if (exColumn.DataType != vColumn.DataType ||
                        vColumn.Length != exColumn.Length ||
                        exColumn.Precision != vColumn.Precision ||
                        exColumn.Scale != vColumn.Scale)
                    {
                        dcomp.SetUsageType(input.ID, vInput, vColumnID, DTSUsageType.UT_READONLY);

                        IDTSOutputColumn100 oColumn = dcomp.InsertOutputColumnAt(output.ID, 0, exColumn.Name, String.Empty);
                        //IDTSOutputColumn100 oColumn = output.OutputColumnCollection.New();
                        //oColumn.Name = exColumn.Name;
                        oColumn.SetDataTypeProperties(exColumn.DataType, exColumn.Length, exColumn.Precision, exColumn.Scale, exColumn.CodePage);
                        oColumn.ExternalMetadataColumnID = 0;
                        oColumn.MappedColumnID           = 0;
                        oColumn.ErrorRowDisposition      = DTSRowDisposition.RD_FailComponent;
                        oColumn.TruncationRowDisposition = DTSRowDisposition.RD_FailComponent;
                        //IDTSCustomProperty100 property = oColumn.CustomPropertyCollection.New();
                        //property.Name = "SourceInputColumnLineageID";
                        //property.Value = vColumnID;
                        //property = oColumn.CustomPropertyCollection.New();
                        //property.Name = "FastParse";
                        //property.Value = false;

                        dcomp.SetOutputColumnProperty(
                            output.ID,
                            oColumn.ID,
                            "SourceInputColumnLineageID",
                            vColumnID);

                        dcomp.SetOutputColumnProperty(
                            output.ID,
                            oColumn.ID,
                            "FastParse",
                            false);


                        //set of derived columns
                        converted.Add(exColumn.ID, oColumn.LineageID);
                    }
                    //else
                    //{
                    //    m_converted.Add(exColumn.ID, vColumnID);
                    //}
                }
                else
                {
                    //the column wasn't found if the Id is 0, so we'll print out a message and skip this row.
                    //PrintOutput.PrintToOutput("Converter: Could not map external column " + exColumn.Key + ". Skipping column.");
                }
            }
            return(converted);
        }
Exemple #24
0
 /// <summary>
 /// Constructs an external metadata column and adds it to the provided collection, using the column metadata from the provided output column.
 /// </summary>
 /// <param name="externalMetadataColumnCollection"></param>
 /// <param name="outputColumn"></param>
 /// <returns></returns>
 private IDTSExternalMetadataColumn100 BuildExternalMetadataColumn(IDTSExternalMetadataColumnCollection100 externalMetadataColumnCollection, IDTSOutputColumn100 outputColumn)
 {
     IDTSExternalMetadataColumn100 externalColumnToPopulate = externalMetadataColumnCollection.New();
     externalColumnToPopulate.Name = outputColumn.Name;
     externalColumnToPopulate.Precision = outputColumn.Precision;
     externalColumnToPopulate.Length = outputColumn.Length;
     externalColumnToPopulate.DataType = outputColumn.DataType;
     externalColumnToPopulate.Scale = outputColumn.Scale;
     externalColumnToPopulate.CodePage = outputColumn.CodePage;
     return externalColumnToPopulate;
 }
Exemple #25
0
 internal BipsProxyIDTSExternalMetadataColumnCollection100(IDTSExternalMetadataColumnCollection100 innerObject)
 {
     _innerObject = innerObject;
 }