Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS脚本任务-读取循环中的记录集对象失败_Ssis - Fatal编程技术网

SSIS脚本任务-读取循环中的记录集对象失败

SSIS脚本任务-读取循环中的记录集对象失败,ssis,Ssis,我收集了一个数据集,并使用记录集目标将其分配给一个对象变量 根据数据集中记录的数量,我需要在数据集中循环并将记录吐出到文件中。例如,如果原始数据集中有5000条记录,我需要在其中循环5次,以创建一个包含1000条记录的文件,称为MyFile_1.txt、MyFile_2.txt等 在数据流中的脚本组件任务中,我用记录集中的列填充输出缓冲区。为此,我创建了一个新的OleDbAdapter和DataTable,然后用对象变量填充它们 这第一次效果很好。但是,第二次,DataAdapter.Fill(

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

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

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

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


有人有什么想法吗?

这是一个有效的脚本任务。它需要对Microsoft ActiveX数据对象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;
        }

您可以根据需要多次将数据从流中拉入新记录集中。

关于没有提供实际代码的代码的问题对于调试来说是相当具有挑战性的。也就是说,我相信通过调用
Fill
方法,您正在使用整个记录集对象。标记现在位于记录集的末尾。您可能需要将标记重置为最后一个“已使用”点,或者只使用每次通过数据流所需的行;DataTable dt=新的DataTable();da.Fill(dt,Variables.MyRecordSet);第一次传递包含记录,第二次激发时没有记录。如何将标记重置为上次使用的点?我不知道,这就是为什么我将其作为评论而不是答案发布的原因。我的方法是不使用
Fill
方法,而是在我达到极限之前逐行使用它。为什么要对记录集进行第二次检查?另外,您使用的SSI版本是什么?您确实需要使用脚本记录集吗?您是否可以使用
从表中选择COUNT(*)来首先获取记录集计数,然后使用类似
行数的方法来获取记录编号并相应地拆分它。这些数据的来源是什么?