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); }
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); }
/// <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; }
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); }
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); }
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); }
/// <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; }
internal BipsProxyIDTSExternalMetadataColumnCollection100(IDTSExternalMetadataColumnCollection100 innerObject) { _innerObject = innerObject; }