1

我有一个文件要与使用 SSIS 项目的数据库中的条目进行比较。

在我的 ControlFlow 中,我有“执行 SQL 任务”,它从数据库中获取我想要在“脚本任务”中进行比较的结果列表。这里发生了其他我不知道的事情,但在我到达我的“脚本任务”之前有 for 循环。

我第一次运行它时它工作正常,但是一旦它尝试文件中的第二个条目,它就会丢失数据库结果。我可以通过在 PreExecute() 中填充数据库结果来解决这个问题

private DataTable dt = new DataTable();

public override void PreExecute()
{
    base.PreExecute();

    OleDbDataAdapter adapter = new OleDbDataAdapter();
    //filling results from database into DataTable object
    adapter.Fill(dt, this.Variables.AccountFilterVariables); 

}

但现在每次它进入 ControlFlow 中的循环时,我都会丢失保存在 this.Variables.AccountFilterVariables 中的结果

我可以通过将“执行 SQL 任务”放入循环中来解决此问题,但我不希望它每次都查询数据库库。我只想查询一次数据库并在项目的整个生命周期内保留 this.Variables.AccountFilterVariables。

我该怎么做呢?我猜它与 PostExecute() 有关,但我不确定是什么。

控制流

数据流

4

1 回答 1

0

如果我没记错的话,Execute SQL Task 创建的记录集是只进游标类型,这意味着您只能读取一次。

一个简单的解决方法是在执行 SQL 任务之后立即添加一个脚本任务。在该脚本任务中,加载带有记录集的 DataTable 并将该 DataTable 存储在另一个包范围变量中。然后,在您的各种循环中,您的脚本组件可以引用 DataTable,默认情况下允许向前和向后搜索。

有关示例代码,请参阅我在脚本任务中对 SSIS 记录集的回答:不能将其与后续行一起使用

于 2013-10-26T17:20:19.980 回答