SSIS 2012-在第二个脚本执行时变量为空

时间:2019-03-22 04:46:24

标签: c# sql-server ssis oledb ssis-2012

我在数据流中进行了脚本组件转换。 在此脚本组件中,我从对象变量中读取了一个表。通过脚本的第一条记录可以正常工作。该变量可以正确读取并完美加载到列表对象中。

下一条记录传递到脚本中,出现了问题。

查看变量,它的记录计数为44,当它尝试加载到我的列表中时,我得到的行数= 0

下面是加载列表的脚本

restwebservices

我想念什么吗?有人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:2)

试图找出问题所在

来自以下OleDbDataAdapter.Fill Method (DataTable, Object) documentation

  

注意
  当将ADO Recordset或Record对象与.NET Framework应用程序结合使用时,请在完成后始终调用Close。这样可以确保及时释放与数据源的基础连接,还可以防止在现有引用仍然存在时,由于垃圾回收回收非托管ADO对象而可能导致的访问冲突。

也指Filling a DataSet with an ADO Recordset or Record - documentation

  

请注意,当Fill操作完成时,采用DataSet和ADO对象的OleDbDataAdapter.Fill重载会隐式调用ADO对象上的Close。在调用采用DataTable的OleDbDataAdapter.Fill重载之后,需要显式关闭ADO Recordset或Record对象。

这意味着在通过RecordSet调用Fill Method时,必须先将其关闭,然后再使用它,否则将不返回任何行。


可能的解决方法

我真的不知道如何从Object变量中关闭Recordset,但是我将尝试提供一些可能的解决方法:

(1)保存到数据表

在下面的链接中,他们提到了以下解决方法:

  
      
  1. 一旦我的记录集@[User::FilePath]被填充,我就使用脚本任务,并使用OledbDataAdapter和将其填充到DataSet ds中。   数据表。

  2.   
  3. 然后,在同一脚本任务中,将ds的值放到新的   对象类型@[User::FilePathDataTable]的变量。

  4.   
     

这样做,FilePathDataTable的数据类型将变为   System.Data.DataTable

     

该数据表可以轻松地在内部使用任意次数   每次循环。

     

我不在sis的ForEach循环内使用DataAdapter.Fill()方法   现在。我只是将@[User::FilePathDataTable]的值分配给新   数据集,并将其用于迭代。

参考

(2)使用记录集源

与其使用脚本组件从Object变量生成行,不如尝试使用RecordSet Source来做到这一点。

(3)将变量强制转换为Recordset

我没有测试这种方法,并且不确定是否可以与对象变量一起使用

它需要对Microsoft ActiveX数据对象的引用。

List<PublicHoliday> PublicHolidays = new List<PublicHoliday>();

var rs = ((ADODB.Recordset)Variables.LISTPublicHolidays);
OleDbDataAdapter A = new OleDbDataAdapter();
DataTable dt = new DataTable();
A.Fill(dt, rs);

foreach (DataRow row in dt.Rows)
{
    object[] array = row.ItemArray;
    var Public = new PublicHoliday()
    {
        DateKey = int.Parse(array[0].ToString()),
        FullDateAlternateKey = DateTime.Parse(array[1].ToString())
    };
    PublicHolidays.Add(Public);
}
rs.Close();

更新1

基于以下注释,请尝试从第一个脚本中删除rs.Close();方法,然后在第二个脚本中执行Fill方法之前,请使用rs.MoverFirst()方法从中检索信息记录集。

基于以下链接删除了第三种方法:

答案 1 :(得分:0)

您应该使用ADO NET而不是Ole Db连接:

Dim dt As Data.DataTable
Dim ds As Data.DataSet = CType(Dts.Variables("Recordset").Value, DataSet)
dt = ds.Tables(0)

参考:https://www.sqlshack.com/execute-sql-tasks-in-ssis-output-parameters-vs-result-sets