您的位置:首页 > 其它

第九篇 Integration Services:控制流任务错误

2015-10-14 21:38 197 查看
本篇文章是Integration Services系列的第九篇,详细内容请参考原文

简介
在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentExecutables属性。我们检查、演示并测试优先约束赋值为"成功"、"完成"、"失败"时对工作流的影响。我们学习了SSIS变量和表达式,并将它们应用到优先约束。
这一篇,we introduce fault tolerance by examining methods of task execution state management using the MaximumErrorCount and ForceExecutionResult properties.我们还会学习SSIS控制流任务错误、事件处理程序和容器之间的关系。
SSIS任务错误
打开Precedence.dtsx包。你的控制流面板如图9.1所示:

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)

Dts.TaskResult = ScriptResults.Success

End Sub


View Code
代码9.1
代码9.1中的VB代码创建三个VB脚本变量-iErrorCode、sErrorDescription and sSourceName-mapping each to similarly-named SSIS variables scoped to the OnError event handler.映射发生在两个步骤。第一个步骤是图9.21配置的ReadOnlyVariables属性。这将SSIS变量暴露给脚本任务。第二个步骤是Dts命名空间中的变量对象,这使我们能够访问脚本任务ReadOnlyVariables属性中的变量集合。
脚本任务ReadOnlyVariables属性中的SSIS变量列表是脚本任务中可用的变量集合。我们使用Dts.Variables对象访问这些可用的SSIS变量:

Dts.Variables("<Variable Name>").Value


代码9.2
从Dts.Variables访问变量的值属性是一个对象。我们要将这个对象转换成其他数据类型(比如String and Integer)。值属性包含一个".ToString"方法会尝试将对象转换为String数据类型。
脚本任务错误
如果脚本任务不能定位脚本任务的ReadOnlyVariables属性中的SSIS变量,它会抛出类似下面的错误:
错误: 无法锁定变量“System::ErrorCod”进行读访问,错误为 0xC0010001“找不到变量。如果在包的执行期间试图从容器的 Variables 集合检索某个变量,但该变量不在此处时,将出现这种情况。变量可能已更改名称,或者并未创建。”。
我通过删除脚本任务的ReadOnlyVariables属性中System::ErrorCode变量的最后一个字母"e"产生这个错误。右击脚本任务选择执行任务,如图9.23所示:



图9.23
任务执行失败,在进度(执行结果)页签出现错误信息,如图9.24所示:



图9.24
为什么错误是:无法锁定变量。这是一个很棒的问题。在脚本任务开始使用SSIS变量,需要锁定它们。这项行为的解释超出了本篇文章。在脚本任务成功锁定SSIS变量后,脚本任务就能访问SSIS变量。
如果你试图在脚本任务访问一个不存在于ReadOnlyVariables或ReadWriteVariables脚本任务属性的SSIS变量名称,或者你拼错了SSIS变量名称,或者甚至是你没有匹配SSIS变量名称的大小写,就会产生另一个脚本任务错误。你可以通过下面方法产生这个错误。首先修正脚本任务的ReadOnlyVariables中的System::ErrorCode变量名称,然后打开脚本任务脚本编辑器。修改iErrorCode变量的声明如代码9.3所示:

Dim iErrorCode As Integer = _
Convert.ToInt32(Dts.Variables("errorCode").Value)


代码9.3
注意唯一的修改是将SSIS变量的名称"ErrorCode"修改为"errorCode"。在进度(执行结果)页签产生的错误非常长,但是以下面开始:
错误: System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> Microsoft.SqlServer.Dts.Runtime.DtsRuntimeException: 在集合中找不到元素。如果在包的执行期间试图从容器的集合检索某个元素,但该元素不在此处,将发生此错误。
在进度(执行结果)页签,错误信息如图9.25所示:



图9.25
这些错误很难解决。
修正脚本任务中的脚本中的拼写"ErrorCode"。在事件处理程序执行脚本任务,结果类似图9.26:



图9.26
观察错误
在BIDS调试器下执行Precedence包。当提示succeed Script Task 4(图9.27),点击No按钮:



图9.27
点击No引起Script Task 4失败,产生一个错误事件。这个错误事件被OnError事件处理程序监听到,引起OnError事件处理程序上的脚本任务执行并显示错误信息,如图9.28所示:



图9.28
更多关于冒泡
前面,我们提到事件冒泡。例子中,Script Task 4产生的错误事件会传输(up the tree)到序列容器1。如果我们为序列容器1配置一个OnError事件处理程序,我们可以观察这个发生。
停止BIDS调试器,在控制流选择序列容器1,点击事件处理程序页签。像以前一样,点击"单击此处为可执行文件"序列容器1"创建一个"OnError"事件处理程序"的链接。在Script Task 4事件处理程序拷贝脚本任务,然后将它粘贴到序列容器1的事件处理程序,如图9.29所示:



图9.29
打开脚本任务编辑器,点击编辑脚本按钮。修改Public Sub Main()中的sSubComponent行为:

Dim sSubComponent As String = _
"Sequence Container 1 OnError Event Handler"


代码9.4
右击脚本任务,选择执行任务。你的结果类似于图9.30:



图9.30
在BIDS调试器下执行整个SSIS包。当提示succeed Script Task 4时,点击No按钮产生一个错误事件。
像以前一样,OnError事件处理程序监听并响应Script Task 4错误事件,如图9.31所示:



图9.31
你可以说它是Script Task 4OnError事件处理程序的响应,因为消息对话框的标题包含"Script Task 4 OnError Event Handler"文本。同样正在执行的脚本任务是黄色的,并且它是在Script Task 4的OnError事件处理程序中。
点击确定,错误事件冒泡到序列容器1的OnError事件处理程序,如图9.32所示:



图9.32
依据消息对话框的标题你可以分辨这是序列容器1的事件处理程序。
注意消息对话框中的内容。错误事件的源是Script Task 4,错误描述和错误代码值没有变更。在SSIS事件中这是非常有趣的行为。当一个SSIS任务最初产生事件就会填充事件属性。一旦事件放到消息总线,它们的值就不会变更。
事件会从序列容器1继续冒泡到Precedence.dtsx包。变量的值将保持静态,任何配置的监听都显示源:Script Task 4,错误代码:8,错误描述:脚本返回了失败结果。
总结
在这一篇,我们学习了SSIS控制流任务错误行为,包括错误事件、OnError事件处理程序和错误冒泡。我们演示了事件冒泡和容器的关系,还介绍了MaximumErrorCount和ForceExecutionResult容错属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: