private void GenerateExternalColumns() { var tableName = this.GetMemberTableName(); using (DataTable metaData = this.GetMemberTableMetaData(tableName)) { if (metaData != null) { var input = this.ComponentMetaData.InputCollection[INPUT_NAME]; var external = input.ExternalMetadataColumnCollection; var count = metaData.Rows.Count; for (int i = 0; i < count; i++) { var dataRow = metaData.Rows[i]; var externalColumn = external.NewAt(i); externalColumn.Name = (string)dataRow["ColumnName"]; var type = (Type)dataRow["DataType"]; var dataType = PipelineComponent.DataRecordTypeToBufferType(type); if ((bool)dataRow["IsLong"]) { switch (dataType) { case DataType.DT_BYTES: dataType = DataType.DT_IMAGE; break; case DataType.DT_STR: dataType = DataType.DT_TEXT; break; case DataType.DT_WSTR: dataType = DataType.DT_NTEXT; break; } } int length = 0; if (dataType == DataType.DT_WSTR || dataType == DataType.DT_STR || dataType == DataType.DT_BYTES || dataType == DataType.DT_IMAGE || dataType == DataType.DT_NTEXT || dataType == DataType.DT_TEXT) { length = (int)dataRow["ColumnSize"]; } int codePage = 0; if (dataType == DataType.DT_STR) { codePage = -1; } int precision = 0; int num = 0; if (dataType == DataType.DT_NUMERIC || dataType == DataType.DT_DECIMAL) { if (dataRow.IsNull("NumericPrecision")) { precision = 29; } else { precision = (int)Convert.ToInt16(dataRow["NumericPrecision"]); } if (dataRow.IsNull("NumericScale")) { num = 0; } else { num = (int)Convert.ToInt16(dataRow["NumericScale"]); } if (num == 255) { num = 0; } } externalColumn.DataType = dataType; externalColumn.Length = length; externalColumn.Precision = precision; externalColumn.Scale = num; externalColumn.CodePage = codePage; IDTSCustomProperty100 propType = externalColumn.CustomPropertyCollection.New(); propType.Name = POSTGRES_TYPE; propType.Value = dataRow["ProviderType"]; } } } }