如何在SSIS脚本任务中遍历用户变量内的自定义类集合提取属性
解决SSIS中遍历自定义对象ArrayList变量的问题
一、先修正主脚本任务的变量作用域问题
你当前的主脚本任务中,wopList是在InputWOProduct_ProcessInputRow方法内部定义的,每次处理行数据时都会新建一个ArrayList,最终赋值给变量的只会是最后一次创建的空/单元素集合。需要将wopList提升为脚本任务类的成员变量,才能累积所有行的对象:
// 在脚本任务类的顶部定义成员变量 private ArrayList wopList = new ArrayList(); public override void InputWOProduct_ProcessInputRow(InputWOProductBuffer Row) { WorkOrderProduct wop = new WorkOrderProduct(); wop.workOrderId = pWorkOrderID; wop.workOrderProductId = pWorkOrderProductID; wopList.Add(wop); }
二、在第二个脚本任务中遍历变量的步骤
1. 确保自定义类可访问
如果两个脚本任务属于同一SSIS项目,建议将WorkOrderProduct类定义在项目级脚本文件中(右键项目→添加→新建项→脚本文件),这样所有脚本任务都能直接引用。如果是独立脚本任务,需要在第二个脚本任务的代码中重新定义完全一致的类:
public class WorkOrderProduct { public Guid workOrderId; public Guid workOrderProductId; public static Guid WorkOrderId { get; set; } public static Guid WorkOrderProductId { get; set; } }
2. 遍历并转换元素类型
由于ArrayList是弱类型集合,存储的元素默认是object类型,必须强制转换为WorkOrderProduct后才能访问其成员。在第二个脚本任务的Main方法中编写如下代码:
public void Main() { bool fireAgain = true; // 读取变量并转换为ArrayList ArrayList wopList = Dts.Variables["User::WorkOrderProductIdList"].Value as ArrayList; if (wopList != null && wopList.Count > 0) { foreach (var item in wopList) { // 将object强制转换为WorkOrderProduct WorkOrderProduct wop = item as WorkOrderProduct; if (wop != null) { // 访问实例字段(注意是小写的workOrderId,不是静态的WorkOrderId) Guid workOrderId = wop.workOrderId; Guid workOrderProductId = wop.workOrderProductId; // 示例:输出到SSIS日志 Dts.Events.FireInformation(0, "遍历WorkOrderProduct", $"WorkOrderId: {workOrderId}, WorkOrderProductId: {workOrderProductId}", "", 0, ref fireAgain); } } } Dts.TaskResult = (int)ScriptResults.Success; }
关键说明
ArrayList中的元素默认是object类型,无法直接通过点操作符访问WorkOrderProduct的成员,必须通过强制类型转换将元素转为具体的WorkOrderProduct类型,才能正常访问其字段或属性。
内容的提问来源于stack exchange,提问作者gymcode
相关产品推荐
相关产品推荐

