array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 【译】第十篇 Integration Services:高级事件行为 - 爱码网

本篇文章是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

相关文章: