【问题标题】:SSIS Script Task - Reading RecordSet object in a loop is failingSSIS 脚本任务 - 在循环中读取 RecordSet 对象失败
【发布时间】:2014-08-11 22:17:13
【问题描述】:

我收集了一个数据集并使用 RecordSet 目标将其分配给一个对象变量。

根据数据集中的记录数,我需要遍历数据集并将记录吐出到文件中。例如,如果原始数据集中有 5000 条记录,我需要循环它 5 次以创建一个包含 1000 条记录的文件,称为 MyFile_1.txt、MyFile_2.txt 等。

在数据流中的脚本组件任务中,我使用 RecordSet 中的列填充输出缓冲区。为此,我创建了一个新的 OleDbAdapter 和 DataTable,然后用对象变量填充它们。

这第一次效果很好。但是,第二次,DataAdapter.Fill(DataTable, ObjectVariable) 方法执行没有错误,但 DataTable 中没有行。在调试时,我可以深入查看 Object 变量中仍然有记录。

有人有什么想法吗?

【问题讨论】:

  • 关于不提供实际代码的代码的问题对于调试来说相当具有挑战性。也就是说,我相信通过调用Fill 方法,您正在使用整个记录集对象。标记现在位于记录集的末尾。您要么需要将标记重置为最后一个“使用”点,要么只使用每次通过数据流所需的行。
  • 抱歉,我从脚本任务中以非常基本的方式执行此操作:OleDbDataAdapter da = new OleDbDataAdapter();数据表 dt = 新数据表(); da.Fill(dt, Variables.MyRecordSet);第一次包含记录,第二次触发,没有记录。如何将标记重置为上次使用的点?
  • 我不知道,这就是为什么我发表评论而不是回答的原因。我的方法是不使用Fill 方法,而是逐行使用它,直到达到我的极限
  • 为什么要对记录集进行第二次传递?另外,您使用的是什么版本的 SSIS?
  • 您真的需要使用脚本记录集吗?您可以先使用SELECT COUNT(*) FROM Table 获取记录集计数,然后使用ROWNUMBER 之类的东西获取记录编号并相应地拆分它。这些数据的来源是什么?

标签: ssis


【解决方案1】:

这是一个有效的脚本任务。它需要引用 Microsoft ActiveX Data Objects 2.x

public void Main()
        {

            OleDbDataAdapter da = new OleDbDataAdapter();
            DataTable dt = new DataTable();

            ADODB.Stream stm = new  ADODB.Stream();
            ADODB.Recordset rs = ((ADODB.Recordset)Dts.Variables["User::Variable"].Value).Clone();
            ADODB.Recordset rsCopy = new ADODB.Recordset();

            rs.Save(stm);
            rsCopy.Open(stm);
            da.Fill(dt, rs);
            dt.Clear();
            da.Fill(dt, rsCopy);
            Dts.TaskResult = (int)ScriptResults.Success;
        }

您可以根据需要多次将数据从流中提取到新记录集中。

【讨论】:

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