如何在SSIS的Foreach循环容器内通过脚本任务为System.Object变量添加值?
SSIS 循环内修改System.Object类型变量(DataTable)失败问题解决
问题场景
外部脚本任务中成功为User::LISTA_CONTACTOS(System.Object类型,实际存储DataTable)赋值,但在Foreach循环容器内的脚本任务中,尝试给该变量添加列和行时操作无效。
已尝试代码
外部初始化脚本:
DataTable myDataTable = new DataTable("LISTA_CONTACTOS"); myDataTable.Columns.Add(new DataColumn("columnText", typeof(string))); DataRow myDataRow = myDataTable.NewRow(); myDataRow["columnText"] = "1"; myDataTable.Rows.Add(myDataRow); Dts.Variables["User::LISTA_CONTACTOS"].Value = myDataTable; Dts.TaskResult = (int)ScriptResults.Success;
循环内修改脚本:
DataTable dataTable = (DataTable)Dts.Variables["User::LISTA_CONTACTOS"].Value; dataTable.Columns.Add(new DataColumn("contact_id", typeof(string))); DataRow newRow = dataTable.NewRow(); newRow["contact_id"] = "8535939"; dataTable.Rows.Add(newRow); Dts.Variables["User::LISTA_CONTACTOS"].Value = dataTable; Dts.TaskResult = (int)ScriptResults.Success;
解决步骤
修正脚本任务的变量读写权限
打开循环内的脚本任务编辑器,在ReadWriteVariables列表中添加User::LISTA_CONTACTOS——默认如果只在ReadOnlyVariables里,修改后的内容无法写回变量,这是最常见的原因。简化代码(避免不必要的变量赋值)
DataTable是引用类型,直接修改内存中的实例即可,无需重新赋值给变量。同时建议增加列存在性判断,避免重复添加报错:DataTable dataTable = (DataTable)Dts.Variables["User::LISTA_CONTACTOS"].Value; // 先判断列是否已存在,防止重复添加抛出异常 if (!dataTable.Columns.Contains("contact_id")) { dataTable.Columns.Add(new DataColumn("contact_id", typeof(string))); } DataRow newRow = dataTable.NewRow(); newRow["contact_id"] = "8535939"; dataTable.Rows.Add(newRow); Dts.TaskResult = (int)ScriptResults.Success;检查Foreach循环的变量映射
确认Foreach循环的变量映射没有错误覆盖User::LISTA_CONTACTOS——如果循环的迭代变量和目标变量冲突,会导致修改后被循环值覆盖。确认变量作用域
保证User::LISTA_CONTACTOS的作用域是包含外部脚本和Foreach循环的父容器,而非循环内部的局部作用域,否则外部赋值的变量和循环内操作的不是同一个实例。
内容的提问来源于stack exchange,提问作者vani
相关产品推荐
相关产品推荐

