SSIS 2005:我有一个DataFlow任务,包括一个IDataReader源,从Oracle数据源获取零行或多行,并将这些行推送到用作目标的脚本组件。我的目标是将这些记录加载到DataSet中,因此我重写Script Component的PreExecute方法来构建DataSet和将保存记录的子DataTable。然后在InputRow方法中,我向DataSet添加一行,在PostExecute方法中,我将DataSet加载到ReadWriteVariable中。
我的问题是,如果从IDataReader返回零行并且我从C#代码启动包(使用Dts对象模型),则DataSet永远不会在ReadWriteVariable中设置。如果我更改查询以便始终将行返回到IDataReader,则DataSet将加载到变量中,但如果返回零行,则变量仍然只是一个简单的System.Object。
令人沮丧的是,如果我添加一些System.Windows.Forms.MessageBox.Show()调用我的PreExecute和PostExecute方法并从VisualStudio运行包,则会显示消息。在将其设置为DataSet并在MessageBox中返回DataTables的计数之后,我甚至已经远远地检查了脚本组件中的变量。它每次都适用于设计师。
当我以编程方式运行包时,有人可以解释为什么PostExecute方法似乎没有被触发,而当我从设计器运行它时它工作得很好吗?这是在DataFlow任务中完成的一些优化吗?理想情况下,如果没有返回记录,我希望看到一个空的DataSet放入变量中。
提前致谢。
答案 0 :(得分:0)
设计环境使用的运行时与直接执行包稍有不同,因此这些类型的差异并不是非常罕见。您可能需要移动逻辑以将DataSet填充到ProcessInout方法中 - 您需要覆盖默认实现。在那里,检查是否所有行都已处理过(请参阅Michael Entin关于如何检查的帖子 - http://blogs.msdn.com/michen/archive/2007/08/31/Buffer.EndOfRowset.aspx),然后进行所有最终处理。
我已经了解到在PostExecute中执行最后的处理步骤并不是一个好习惯 - 所以现在我只将其用于清理和记录。