SSIS - 在脚本任务中使用对象变量(Recordset):只有一次

时间:2016-05-19 12:59:44

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

我对Recordset和Script Component有一个好奇的问题,所以我要解释一下这种情况。

在我的第一步中,我有一个数据流任务,我从SQL读取一个表并将结果存储在Recordset目的地中,并将此Recordset保存在变量中。

在我的第二步中,我使用此组件进行数据流任务:

  • a - 我使用File Flat Source加载.csv文件
  • b - 我使用脚本组件修改数据
  • c - 我使用OLE DB目的地
  • 在SQL中保存数据

在步骤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不填充数据表。

可能是什么问题?

1 个答案:

答案 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";
    }
}