SSIS 只读变量被更改
SSIS read-only variable get changed
我有一个包,里面有两个组件:第一个是要执行并获取 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]
设置为只读变量,看起来变量只是变空了,即使我稍后再添加一个脚本任务并再次执行相同的操作,填充的 DataTable
仍然存在空.
有很多方法可以规避我的情况,所以我不希望在这里找到解决方案。但我想弄清楚这些事情:OleDbDataAdapter.Fill
是否对原始数据集有副作用,我的只读变量如何更改其值?
Fill 使用一个指针来了解它正在从源数据集中读取的位置。第一次填充后,您位于变量数据集的末尾。首先将 DTS 变量分配给脚本变量:
var d = Dts.Variables["ResultSet"].Value.ToList();
应该让你多次使用。参见 DataReader cursor rewind
我不认为这会改变只读记录集变量值,问题是当使用 Adapter.Fill 方法用记录集填充数据表时,记录集仍然打开,您必须明确关闭它以便能够与其他适配器再次使用它。 (当您再次尝试读取它时,它已完成提供行,因此您正尝试从末尾读取)
来自以下 Microsoft 文章:
CAUTION When using ADO Recordset or Record objects in conjunction with .NET Framework applications, always call Close when you are finished. This ensures that the underlying connection to a data source is released in a timely manner, and also prevents possible access violations due to unmanaged ADO objects being reclaimed by garbage collection when existing references still exist.
Note that the OleDbDataAdapter.Fill overload that takes a DataSet and an ADO object implicitly calls Close on the ADO object when the Fill operation is complete. You need to explicitly close the ADO Recordset or Record object after calling the OleDbDataAdapter.Fill overload that takes a DataTable.
我真的不知道如何在使用 Fill 方法后关闭 SSIS 记录集,但我找到了一个 link 解决类似问题的方法:
我有一个包,里面有两个组件:第一个是要执行并获取 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]
设置为只读变量,看起来变量只是变空了,即使我稍后再添加一个脚本任务并再次执行相同的操作,填充的 DataTable
仍然存在空.
有很多方法可以规避我的情况,所以我不希望在这里找到解决方案。但我想弄清楚这些事情:OleDbDataAdapter.Fill
是否对原始数据集有副作用,我的只读变量如何更改其值?
Fill 使用一个指针来了解它正在从源数据集中读取的位置。第一次填充后,您位于变量数据集的末尾。首先将 DTS 变量分配给脚本变量:
var d = Dts.Variables["ResultSet"].Value.ToList();
应该让你多次使用。参见 DataReader cursor rewind
我不认为这会改变只读记录集变量值,问题是当使用 Adapter.Fill 方法用记录集填充数据表时,记录集仍然打开,您必须明确关闭它以便能够与其他适配器再次使用它。 (当您再次尝试读取它时,它已完成提供行,因此您正尝试从末尾读取)
来自以下 Microsoft 文章:
CAUTION When using ADO Recordset or Record objects in conjunction with .NET Framework applications, always call Close when you are finished. This ensures that the underlying connection to a data source is released in a timely manner, and also prevents possible access violations due to unmanaged ADO objects being reclaimed by garbage collection when existing references still exist.
Note that the OleDbDataAdapter.Fill overload that takes a DataSet and an ADO object implicitly calls Close on the ADO object when the Fill operation is complete. You need to explicitly close the ADO Recordset or Record object after calling the OleDbDataAdapter.Fill overload that takes a DataTable.
我真的不知道如何在使用 Fill 方法后关闭 SSIS 记录集,但我找到了一个 link 解决类似问题的方法: