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
相关产品推荐
相关产品推荐

