本篇文章是Integration Services系列的第十篇,详细内容请参考原文


简介
在前一篇, we introduced fault tolerance by examining methods of task execution state management using the MaximumErrorCount and ForceExecutionResult properties.我们还学习了SSIS控制流任务错误、事件处理程序和容器之间的关系。
这一篇我们重点关注事件的行为。在这一篇,我们分享两种用于处理默认事件传输行为(bubbling)的方法。我们还会引入父子模式并演示父子模式中的事件行为。
SSIS任务事件
打开Precedence.dtsx包。你的控制流面板应该如图10.1所示:
【译】第十篇 Integration Services:高级事件行为
图10.1
在第九篇,我们关注在序列容器1.我们在Script Task 4和序列容器1上创建了OnError事件处理程序——我们描述为事件"监听器"。对于每一个OnError事件处理程序,我们添加一个脚本任务来显示包含下面SSIS变量的消息对话框:
->System::ErrorCode
->System::ErrorDescription
->System::SourceName
在我们开始测试前,让我们验证和/或修改之前的Precedence.dtsx包的某些设置。首先,点击序列容器1并按F4显示属性。确保ForceExecutionResult属性保持为"Success"。然后点击Script Task 4并按F4显示属性。修改MaximumErrorCount属性为1.
在我们做更多修改前,通过按F5在BIDS调试器下执行Precedence.dtsx包。对于"Succeed Script Task 2?"的选择不会影响演示的目的,但是现在以及这篇文章剩余部分我们会选择"是"按钮(图10.2)引起 Script Task 2成功。
【译】第十篇 Integration Services:高级事件行为
图10.2
当提示"Succeed Script Task 4?"时,选择否按钮从Script Task 4引起一个错误事件:
【译】第十篇 Integration Services:高级事件行为
图10.3
当Script Task 4产生一个错误事件,在第九篇中配置的OnError事件处理程序监听错误事件,然后执行,显示类似图10.4所示的消息对话框:
【译】第十篇 Integration Services:高级事件行为
图10.4
但是错误事件并不会在这里停止,它会继续向上层冒泡,将执行结果传送到下一级:序列容器1,它包含Script Task 4.我们可以从序列容器1配置的OnError事件处理程序上看到类似图10.5的消息对话框:
【译】第十篇 Integration Services:高级事件行为
图10.5
一旦我们接受这个消息对话框,另一个显示Script Task 3完成的对话框会出现。接受Script Task 3的消息,让Precedence.dtsx包完成执行,最终如图10.6所示:
【译】第十篇 Integration Services:高级事件行为
图10.6
注意序列容器1成功。或者,至少报告成功?
事件和执行状态
第九篇我们设置序列容器1的ForceExecutionResult属性为"Success"并且没有把它修改回默认设置("None")。这是故意用来演示序列容器1的ForceExecutionResult属性与序列容器1对错误事件的响应之前的相互作用。ForceExecutionResult属性重写序列容器1的执行状态,它不会妨碍序列容器1对错误事件的监听能力。当ForceExecutionResult属性设置为"Success"时,序列容器1好像会忽略错误事件,但那是不准确的,我们刚刚证明它。请记住有一种方法可以忽略事件处理程序,我们将在这一篇的最后显示这项功能。事件处理程序和ForceExecutionResult属性之间的相互作用为数据集成开发提供灵活性,有利于容错。这是非常重要的:一个错误可以发生,并且被监听到,但是不会导致控制流失败。
Kicking it Down a Notch
It is important to remember that event bubbling will cause the Error event to continue transmission up the execution stack.在我们的例子,下一级就是Precedence.dtsx包控制流代表SSIS包它自己。
因为我们没有修改Precedence.dtsx包的MaximumErrorCount和ForceExecutionResult属性,当错误冒泡到包容器这个包会失败。
这可能是/可能不是期望的行为。我们面临一个期望决定。我们可以A)在每一个想捕获错误的任务范围级添加容错属性——从而为整个包添加容错属性(不管我们期望与否);B)我们可以打断错误事件的默认冒泡行为。让我们查看选项B.
返回到Script Task 4的OnError事件处理程序,通过点击SSIS下拉菜单中的变量(图10.7),显示变量窗口:
【译】第十篇 Integration Services:高级事件行为
图10.7
一旦打开变量窗口,点击显示系统变量按钮。变量System::Propagate是一个布尔型的变量,默认值是True.如图10.8所示,System::Propagate是事件冒泡控制变量:
【译】第十篇 Integration Services:高级事件行为
图10.8
点击值列将默认值从True修改为Fales,如图10.9所示:
【译】第十篇 Integration Services:高级事件行为
图10.9
在BIDS调试器下执行Precedence.dtsx包。Script Task 2选择是,Script Task 4选择否。Script Task 4的OnError事件处理程序执行如图10.10所示:
【译】第十篇 Integration Services:高级事件行为
图10.10
图10.11显示Script Task 3正在执行,序列容器1的OnError事件处理程序没有执行:
【译】第十篇 Integration Services:高级事件行为
图10.11
Script Task 4产生的错误事件被Script Task 4的OnError事件处理程序监听到,但是它没有冒泡到序列容器1的OnError事件处理程序。
Programmatic Control
We can programmatically control event bubbling inside a Script Task.为了演示,打开Script Task 4的OnError事件处理程序中的脚本任务,将System::Propagate变量添加到ReadWriteVariables属性,如图10.12所示:
【译】第十篇 Integration Services:高级事件行为
图10.12
点击编辑脚本按钮,编辑Public Sub Main()中的代码,在56行添加代码10.1中的IF/Then语句,如图10.13所示:
【译】第十篇 Integration Services:高级事件行为
图10.13

    Public Sub Main()

        Dim iErrorCode As Integer = _
            Convert.ToInt32(Dts.Variables("ErrorCode").Value)
        Dim sErrorDescription As String = _
            Dts.Variables("ErrorDescription").Value.ToString
        Dim sSourceName As String = _
            Dts.Variables("SourceName").Value.ToString

        Dim sSubComponent As String = _
            "Script Task 4 OnError Event Handler"
        Dim sMsg As String = "Source: " & sSourceName & vbCrLf & _
                             "Error Code: " & iErrorCode.ToString & _
                             vbCrLf & _
                             "Error Description: " & _
                             sErrorDescription

        MsgBox(sMsg, , sSubComponent)

        If iErrorCode = 8 Then
            Dts.Variables("Propagate").Value = False
        Else
            Dts.Variables("Propagate").Value = True
        End If

        Dts.TaskResult = ScriptResults.Success
    End Sub
View Code

相关文章: