Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SSIS只读变量已更改_C#_Sql Server_Ssis_Etl_Script Task - Fatal编程技术网

C# SSIS只读变量已更改

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.

我有一个包,里面有两个组件:第一个是要执行并获取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.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记录集,但我找到了一个类似问题的链接,其中有一个解决方法: