SSIS数据流脚本任务错误处理

时间:2009-09-29 03:37:00

标签: ssis scripting handler dataflow onerror

我有一个在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错误处理程序事件。

感激地收到任何建议。 格伦

4 个答案:

答案 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。此外,对于MaximumErrorCountcatch属性设置为零。因此,当序列容器内发生错误时,它以红色显示,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);
  });

控制流程

enter image description here