You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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映射选项卡无目标列


问题解决步骤

你的代码仅创建了外部元数据列,但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:05:27