自定义SSIS目标组件中如何实现输入列映射?
自定义SSIS目标组件列映射问题
我正在构建一个自定义SSIS目标组件,用于将姓名数据上传至Web服务。用户会通过OLE DB源读取包含“First name”和“Last name”列的SQL表,再将该源连接到我的自定义目标组件。我需要实现的核心功能是:让用户能将源组件的输出列(First name、Last name)映射到我的组件输入列(Name、Surname),以便在ProcessInput方法中追踪并使用这些列的数据。
之前参考过类似问题的解决方案但无效,目前编写的创建外部列代码如下,但这些列并未显示在映射选项卡中:
public override void ProvideComponentProperties() { // Reset the component. RemoveAllInputsOutputsAndCustomProperties(); ComponentMetaData.RuntimeConnectionCollection.RemoveAll(); IDTSInput100 input = ComponentMetaData.InputCollection.New(); input.Name = "Input"; IDTSExternalMetadataColumn100 externalNameColumn = input.ExternalMetadataColumnCollection.New(); externalNameColumn.Name = "Name"; externalNameColumn.Description = "The name of the customer"; IDTSExternalMetadataColumn100 externalSurnameColumn = input.ExternalMetadataColumnCollection.New(); externalSurnameColumn.Name = "Surname"; externalSurnameColumn.Description = "The surname of the customer"; IDTSRuntimeConnection100 connection = ComponentMetaData.RuntimeConnectionCollection.New(); connection.Name = "MyConnectionManager"; }

问题解决步骤
你的代码仅创建了外部元数据列,但SSIS目标组件需要同时配置输入列并关联外部元数据,才能在映射选项卡中显示目标列。按以下方式修改代码:
1. 修改ProvideComponentProperties方法
添加输入列并关联外部元数据,同时启用外部元数据的必填映射属性:
public override void ProvideComponentProperties() { // 重置组件 RemoveAllInputsOutputsAndCustomProperties(); ComponentMetaData.RuntimeConnectionCollection.RemoveAll(); IDTSInput100 input = ComponentMetaData.InputCollection.New(); input.Name = "Input"; // 启用外部元数据列作为必填映射目标 input.ExternalMetadataColumnCollectionUsageType = DTSExternalMetadataColumnCollectionUsageType.ECUT_REQUIRED; // 创建外部元数据列(指定数据类型和长度,匹配源列类型) IDTSExternalMetadataColumn100 externalNameColumn = input.ExternalMetadataColumnCollection.New(); externalNameColumn.Name = "Name"; externalNameColumn.Description = "客户的名字"; externalNameColumn.DataType = DataType.DT_WSTR; externalNameColumn.Length = 100; IDTSExternalMetadataColumn100 externalSurnameColumn = input.ExternalMetadataColumnCollection.New(); externalSurnameColumn.Name = "Surname"; externalSurnameColumn.Description = "客户的姓氏"; externalSurnameColumn.DataType = DataType.DT_WSTR; externalSurnameColumn.Length = 100; // 创建输入列并绑定到对应外部元数据列 IDTSInputColumn100 nameInputCol = input.InputColumnCollection.New(); nameInputCol.Name = externalNameColumn.Name; nameInputCol.ExternalMetadataColumnID = externalNameColumn.ID; nameInputCol.MappedColumnID = 0; // 初始未映射,由用户在UI配置 IDTSInputColumn100 surnameInputCol = input.InputColumnCollection.New(); surnameInputCol.Name = externalSurnameColumn.Name; surnameInputCol.ExternalMetadataColumnID = externalSurnameColumn.ID; surnameInputCol.MappedColumnID = 0; IDTSRuntimeConnection100 connection = ComponentMetaData.RuntimeConnectionCollection.New(); connection.Name = "MyConnectionManager"; }
2. 重写Validate方法验证映射完整性
确保用户完成所有列的映射,否则包无法通过验证:
public override DTSValidationStatus Validate() { DTSValidationStatus status = DTSValidationStatus.VS_ISVALID; IDTSInput100 input = ComponentMetaData.InputCollection[0]; foreach (IDTSInputColumn100 inputCol in input.InputColumnCollection) { if (inputCol.MappedColumnID == 0) { ComponentMetaData.FireError(0, ComponentMetaData.Name, $"列 {inputCol.Name} 未映射到源列", "", 0); status = DTSValidationStatus.VS_ISBROKEN; } } return status; }
3. 在ProcessInput中获取映射后的数据
通过输入列的LineageID读取对应源列的数据:
public override void ProcessInput(int inputID, PipelineBuffer buffer) { IDTSInput100 input = ComponentMetaData.InputCollection.GetObjectByID(inputID); while (buffer.NextRow()) { // 获取映射后的Name列值 string name = buffer.GetString(input.InputColumnCollection["Name"].LineageID); // 获取映射后的Surname列值 string surname = buffer.GetString(input.InputColumnCollection["Surname"].LineageID); // 此处添加调用Web服务上传数据的逻辑 // UploadToWebService(name, surname); } }
关键说明
- 外部元数据列定义了目标组件的期望列结构,输入列是数据流中实际参与传输的载体,必须一一关联。
- 设置
ECUT_REQUIRED会强制用户完成所有列的映射,避免未映射的错误数据流入组件。 - 务必为外部元数据列指定与源列匹配的数据类型和长度,否则会出现数据转换错误。
内容的提问来源于stack exchange,提问作者Suxsem
相关产品推荐
相关产品推荐

