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

Script Component transformation使用变量配合Row引用列值失败问题

问题解决:SSIS Script Component动态获取Row对象列值

错误根因

你原有代码无法运行的核心原因有3个:

  • C#是强类型静态编译语言,Row.var写法会被编译器识别为读取Row对象下名为var的属性,不会将var变量存储的字符串作为属性名动态匹配
  • FieldValue数组未初始化长度,直接赋值会触发索引越界错误
  • 循环关键字For首字母大写,不符合C#语法规范,正确写法为小写for

解决方案:使用反射动态读取属性值

通过反射获取Row对象的对应属性,再取值即可实现动态列名读取,修正后的代码如下:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    // 列名大小写要和输入列定义完全一致
    string[] FieldNames = {"SourceID","SourceName","SourceTrnDate"};
    // 初始化数组长度和字段名数组一致
    string[] FieldValue = new string[FieldNames.Length];
    // 提前获取Row的类型,避免循环内重复获取提升性能
    Type rowType = Row.GetType();

    for(int i=0;i<FieldNames.Length;i++)
    {
        string fieldName = FieldNames[i];
        // 先判断当前列是否为空,避免空值报错
        var isNullProp = rowType.GetProperty(fieldName + "_IsNull");
        if (isNullProp != null && (bool)isNullProp.GetValue(Row))
        {
            FieldValue[i] = string.Empty;
            // 可根据业务需求修改为空时的默认值
        }
        else
        {
            // 获取对应列的属性并取值,转成字符串
            var fieldProp = rowType.GetProperty(fieldName);
            if (fieldProp != null)
            {
                FieldValue[i] = fieldProp.GetValue(Row)?.ToString() ?? string.Empty;
            }
        }
    }
}

注意事项

  • 列名大小写必须和输入列的定义完全一致,否则反射无法找到对应属性
  • 如果需要处理非字符串类型的列,可根据业务需求修改取值后的类型转换逻辑

内容的提问来源于stack exchange,提问作者SRR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:30:00