【问题标题】:SSIS Script Component's PostExecute not firing when no records exist当不存在记录时,SSIS 脚本组件的 PostExecute 不会触发
【发布时间】:2010-02-22 19:53:45
【问题描述】:

SSIS 2005:我有一个 DataFlow 任务,其中包含一个 IDataReader 源,它从 Oracle 数据源获取零个或多个行并将这些行推送到用作目标的脚本组件。我的目标是将这些记录加载到数据集中,因此我重写脚本组件的 PreExecute 方法来构建数据集和将保存记录的子数据表。然后在 InputRow 方法中向 DataSet 添加一行,在 PostExecute 方法中将 DataSet 加载到 ReadWriteVariable 中。

我的问题是,如果从 IDataReader 返回零行并且我从 C# 代码(使用 Dts 对象模型)启动包,则 DataSet 永远不会在 ReadWriteVariable 中设置。如果我更改查询以便始终将行返回到 IDataReader,则 DataSet 将加载到变量中,但如果返回零行,则变量仍然只是一个简单的 System.Object。

令人沮丧的部分是,如果我在我的 PreExecute 和 PostExecute 方法中添加一些 System.Windows.Forms.MessageBox.Show() 调用并从 VisualStudio 运行包,则会出现消息。在将脚本组件设置为 DataSet 并返回 MessageBox 中的 DataTables 计数之后,我什至还检查了脚本组件中的变量。每次在设计器中都能正常工作。

有人可以解释为什么当我以编程方式运行包时 PostExecute 方法似乎没有被触发,而当我从设计器运行它时它工作得很好?这是在 DataFlow 任务中进行的一些优化吗?理想情况下,如果没有返回记录,我希望看到一个空的 DataSet 放入变量中。

提前致谢。

【问题讨论】:

    标签: ssis


    【解决方案1】:

    设计环境使用的运行时与直接执行包略有不同,因此这些类型的差异并不少见。您可能需要移动逻辑以将 DataSet 填充到 ProcessInout 方法中 - 您需要覆盖默认实现。在那里,检查是否所有行都已处理(请参阅 Michael Entin 的这篇关于如何检查的帖子 - http://blogs.msdn.com/michen/archive/2007/08/31/Buffer.EndOfRowset.aspx),然后进行所有最终处理。

    我了解到,在 PostExecute 中执行最后的处理步骤并不是一个好习惯 - 所以现在我只将它用于清理和记录。

    【讨论】:

    • 感谢您的回复。在发布这个问题后我做了一些进一步的实验,第二个问题似乎是我使用父 DataFlow 上的表达式设置的 DataReader Source 的 CommandText 没有用我的字符串变量设置,它本身有变量作为一部分其中。所以我切换到一个 OLEDB Source 并直接在 OLEDB Source 对话框中设置变量,现在它可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多