我有一个在SSIS数据流中间执行转换的脚本任务。如果脚本失败(假设它试图将alpha转换为数字)我需要它以“失败”状态停止并返回主包然后利用数据流任务事件处理程序 OnError 优雅地退出
目前我发现数据流中的脚本任务返回一个.net错误弹出窗口,然后我必须清除它。我已尝试围绕代码尝试捕获,似乎停止调试窗口出现,但我似乎无法让它以“失败状态”退出脚本,这将导致程序包失败。 Dts.TaskResult = Dts.Results.Failure在数据流任务中似乎无效。目前我正在尝试这个:
Catch e As System.Exception
Me.ComponentMetaData.FireError(-1, "", "Error: ", e.Message, 1, True)
While Not e.InnerException Is Nothing
e = e.InnerException
Me.ComponentMetaData.FireError(-1, "", "InnerException: ", e.Message, 1, True)
End While
Exit Sub
End Try
...但所有这一切都是跳过坏行。数据流继续。问题是让它以“失败”的形式退出,因此触发了包中的onError错误处理程序事件。
感激地收到任何建议。 格伦
答案 0 :(得分:3)
脚本转换不具有返回成功或失败的相同功能。您可以使用以下代码强制执行错误:
If Row.TestColumn = "Value I Want To Error On" Then
Error (1)
End If
基本上,Error对象(函数?方法?无论如何!)将允许您模拟错误。这意味着,您可以使用此代码使包错误。
答案 1 :(得分:1)
回想起来,没有必要将零除错误。
在我当前的解决方案中,我捕获错误,然后执行FireError,然后重新实现异常处理,如下所示:
If excludeHeader = -1 Then
'Throw New InvalidDataException("Invalid exclude column: " & Variables.excludeColumn)
ComponentMetaData.FireError(0, ComponentMetaData.Name.Trim(), "Invalid exclude column: " & Variables.excludeColumn, String.Empty, 0, True)
excelConnection.Close()
excelConnection.Dispose()
Return
End If
这是有效的,因为它包含在源脚本中,并且也可以在转换脚本中工作,前提是数据流在1次错误后设置为失败。如果没有,脚本将需要实现一个错误输出路径,坦率地说,我没有时间...
答案 2 :(得分:0)
我一直在寻找这个问题的答案。弹出错误对我来说太烦人了!为了避免这种情况,一个“简单”的解决方案(黑客)是这样的:
不是在.FireError之后抛出错误,而是在脚本转换中创建一个新的DT_UI1输出列,例如: “ValidationColumn”,并将其设置为1或0(非布尔值,原因将变得清晰)。
在脚本组件之后,立即添加派生列转换,并将ValidationColumn替换为公式:1 / ValidationColumn。 (这不适用于布尔值)。当然,这会产生除以零的错误,并且(使用默认设置)会导致派生列转换失败,从而导致数据流组件失效。瞧!
错误日志包含来自.FireError的原始验证失败消息,后面紧跟零除错误。
这可能是一个黑客,但直到有人想出一个更好的主意......
BTW,我使用它来检查Excel文件在正确的位置(或替代位置)是否具有正确的标题,与IMEX = 1一起使用,以便使用单个数据加载2个或更多不同的列变体流...
答案 3 :(得分:0)
以下是我在循环中创建的脚本任务。这不是你问题的直接答案 - 但总体思路会有所帮助。
脚本任务保存在序列容器中。名为Propagate
的序列容器sequence container
设置为false。此外,对于MaximumErrorCount
,catch
属性设置为零。因此,当序列容器内发生错误时,它以红色显示,OnError事件被触发 - 但循环继续。为序列容器创建一个onerror事件处理程序,这一点很重要。
在脚本任务中, Catch ex As Exception
Dim exceptionVariable As Microsoft.SqlServer.Dts.Runtime.Variables = Nothing
Dts.VariableDispenser.LockOneForWrite("User::ScriptException", exceptionVariable)
exceptionVariable("User::CustomScriptException").Value = ex.Message
exceptionVariable.Unlock()
Dts.Events.FireError(-1, "Task Name", ex.Message, [String].Empty, 0)
Dts.TaskResult = Dts.Results.Failure
End Try
阻止内部强制失败(通过将任务结果设置为失败)。异常消息也存储在变量中,用于将其存储到错误记录表中。此错误数据插入发生在OnError事件处理程序(如上所述)执行sql任务。
参考:MSDN - ScriptObjectModel.TaskResult Property
在脚本任务代码中使用Dts对象的TaskResult属性来通知程序包脚本任务的成功或失败。
脚本任务中的catch块类似于下面列出的那个。
$('.button').click(function () {
$('#branchmain').show('blind', {direction: 'down'}, 1000);
});
控制流程