【问题标题】:SSIS - Use a Object variable (Recordset) in Script Task: only one time [duplicate]SSIS - 在脚本任务中使用对象变量(记录集):仅一次[重复]
【发布时间】:2016-05-19 12:59:43
【问题描述】:

我对记录集和脚本组件有一个奇怪的问题,所以我将解释一下情况。

在我的第一步中,我有一个数据流任务,我从 SQL 读取一个表并将结果存储在 Recordset Destination 中,并将此 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["User::RS_EventType"].Value 似乎仍然有效,但 adapt.Fill 不填充数据表。

可能是什么问题?

【问题讨论】:

  • 您是否尝试过在语句块末尾执行 dt.Close() 以指示数据写入结束,以便下一条记录将具有新的 dt 实例
  • dt.Close()?这个方法在哪里??

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


【解决方案1】:

我在阅读这篇文章时找到了解决方案: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";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2016-12-03
    相关资源
    最近更新 更多