我对Recordset和Script Component有一个好奇的问题,所以我要解释一下这种情况。
在我的第一步中,我有一个数据流任务,我从SQL读取一个表并将结果存储在Recordset目的地中,并将此Recordset保存在变量中。
在我的第二步中,我使用此组件进行数据流任务:
在步骤b中,我为每一行启动一个事件,并在广告EventHandler中使用脚本任务捕获此事件 此脚本任务中出现此问题。这是代码:
public void Main()
{
...
string messaggio = GetMessaggio(connection, EventNumber);
...
}
private string GetMessaggio(string eventNumber)
{
using (var adapt = new OleDbDataAdapter())
using (var dt = new DataTable())
{
adapt.Fill(dt, Dts.Variables["User::RS_EventType"].Value);
return dt.AsEnumerable()
.Where(r => r.Field<int>("ev_number").ToString() == eventNumber)
.Select(r => r.Field<string>("ev_message"))
.FirstOrDefault() ?? "ND";
}
}
第一次,数据表加载了正确的记录,但这只是第一次出现。 当再次调用方法时,Dts.Variables [&#34; User :: RS_EventType&#34;]。值似乎仍然有效,但是apply.Fill不填充数据表。
可能是什么问题?
答案 0 :(得分:0)
我找到了解读这篇文章的解决方案:SSIS Script Task - Reading RecordSet object in a loop is failing
现在这是代码:
private string GetMessaggio(string eventNumber)
{
using (var adapt = new OleDbDataAdapter())
using (var dt = new DataTable())
{
var stm = new ADODB.Stream();
var rsCopy = new ADODB.Recordset();
var rs = ((ADODB.Recordset)Dts.Variables["User::RS_EventType"].Value).Clone();
rs.Save(stm);
rsCopy.Open(stm);
adapt.Fill(dt, rsCopy);
rs.Close();
stm.Close();
rsCopy.Close();
Marshal.ReleaseComObject(stm);
Marshal.ReleaseComObject(rsCopy);
Marshal.ReleaseComObject(rs);
return dt.AsEnumerable()
.Where(r => r.Field<int>("ev_number").ToString() == eventNumber)
.Select(r => r.Field<string>("ev_message"))
.FirstOrDefault() ?? "ND";
}
}