我想要使用SSIS项目与数据库中的条目进行比较。
在我的ControlFlow中,我有“执行SQL任务”,它从我的“脚本任务”中提取数据库中的结果列表。还有其他的事情发生在这里,我不知道,但在我达到我的'脚本任务'之前有循环。
第一次运行它时工作正常但是一旦它尝试文件中的第二个条目就丢失了数据库结果。我能够通过在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的循环时,我都会丢失此变量.Variables.AccountFilterVariables
我可以通过将“执行SQL任务”放入循环来解决这个问题,但我不希望每次都查询数据库库。我只想查询一次数据库并保留this.Variables.AccountFilterVariables为项目的生命周期。
我该怎么做?我猜它与PostExecute()有关,但我不确定是什么。
答案 0 :(得分:0)
如果我没记错的话,执行SQL任务创建的记录集是forward-only游标类型,这意味着你只能读一遍。
一个简单的解决方法是在执行SQL任务之后立即添加脚本任务。在该脚本任务中,使用记录集加载DataTable并将该DataTable存储在另一个包范围变量中。然后,在各种循环中,您的脚本组件可以引用DataTable,默认情况下允许向前和向后搜索。
有关示例代码,请参阅我对SSIS recordset in script task: cannot use it with subsequent rows的回答。