C# SSIS只读变量已更改
我有一个包,里面有两个组件:第一个是要执行并获取ADO结果集的SQL任务,第二个是脚本任务,我将结果集转换为C# SSIS只读变量已更改,c#,sql-server,ssis,etl,script-task,C#,Sql Server,Ssis,Etl,Script Task,我有一个包,里面有两个组件:第一个是要执行并获取ADO结果集的SQL任务,第二个是脚本任务,我将结果集转换为System.Data.DataTable两次,类似于: System.Data.DataTable t1= new System.Data.DataTable(); OleDbDataAdapter adp = new OleDbDataAdapter(); adp.Fill(t1, Dts.Variables["ResultSet"].Value); System.Data.
System.Data.DataTable
两次,类似于:
System.Data.DataTable t1= new System.Data.DataTable();
OleDbDataAdapter adp = new OleDbDataAdapter();
adp.Fill(t1, Dts.Variables["ResultSet"].Value);
System.Data.DataTable t2= new System.Data.DataTable();
OleDbDataAdapter adp2 = new OleDbDataAdapter();
adp2.Fill(t2, Dts.Variables["ResultSet"].Value);
结果是t1已正确填充,但t2仍为空;更重要的是,我已经显式地将[User::ResultSet]
设置为只读变量,看起来该变量只是变空了,即使我以后再添加一个脚本任务并再次执行相同的操作,填充的数据表仍然是空的
有很多方法可以绕过我的案子,所以我不希望在这里找到解决办法。但是我想澄清这些事情:OleDbDataAdapter.Fill
对原始数据集有副作用吗?我的只读变量是如何改变其值的?Fill使用指针来知道它从源数据集中的何处读取的。在第一次填充之后,您就到了变量数据集的末尾。首先将DTS变量分配给脚本变量:
var d = Dts.Variables["ResultSet"].Value.ToList();
应该让你多次使用它。看见 我不认为这会改变只读记录集变量值,问题是当使用Adapter.Fill方法用记录集填充数据表时,记录集仍然打开,您必须显式地关闭它才能在其他适配器中再次使用它。(当您再次尝试从中读取时,将完成提供行,因此您尝试从末尾读取)
来自以下Microsoft文章:
- :
注意:当将ADO记录集或记录对象与.NET Framework应用程序结合使用时,请务必在完成后调用Close。这可以确保及时释放到数据源的底层连接,还可以防止在现有引用仍然存在时,由于垃圾回收回收非托管ADO对象而导致可能的访问冲突
请注意,当填充操作完成时,接受数据集和ADO对象的OleDbDataAdapter.Fill重载会隐式调用ADO对象上的Close。调用OleDbDataAdapter.Fill重载后,需要显式关闭ADO记录集或记录对象,该重载接受数据表
在使用Fill方法后,我没有找到如何关闭SSIS记录集,但我找到了一个类似问题的链接,其中有一个解决方法: