我在数据流中进行了脚本组件转换。 在此脚本组件中,我从对象变量中读取了一个表。通过脚本的第一条记录可以正常工作。该变量可以正确读取并完美加载到列表对象中。
下一条记录传递到脚本中,出现了问题。
查看变量,它的记录计数为44,当它尝试加载到我的列表中时,我得到的行数= 0
下面是加载列表的脚本
restwebservices
我想念什么吗?有人遇到过这个问题吗?
答案 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,但是我将尝试提供一些可能的解决方法:
在下面的链接中,他们提到了以下解决方法:
一旦我的记录集
@[User::FilePath]
被填充,我就使用脚本任务,并使用OledbDataAdapter和将其填充到DataSet ds中。 数据表。然后,在同一脚本任务中,将ds的值放到新的 对象类型
@[User::FilePathDataTable]
的变量。这样做,
FilePathDataTable
的数据类型将变为System.Data.DataTable
。该数据表可以轻松地在内部使用任意次数 每次循环。
我不在sis的ForEach循环内使用
DataAdapter.Fill()
方法 现在。我只是将@[User::FilePathDataTable]
的值分配给新 数据集,并将其用于迭代。
参考
与其使用脚本组件从Object变量生成行,不如尝试使用RecordSet Source来做到这一点。
我没有测试这种方法,并且不确定是否可以与对象变量一起使用
它需要对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