4

我有一个在 SSIS 数据流中间执行转换的脚本任务。如果脚本失败(比如说它试图将 alpha 转换为数字),我需要它以“失败”状态停止并返回到主包,然后利用 Dataflow 任务事件处理程序OnError正常退出。

目前我发现数据流中的脚本任务返回一个 .net 错误弹出窗口,然后我必须清除它。我在代码周围尝试了一个 Try Catch,这似乎停止了调试窗口的出现,但我似乎无法让它以“失败状态”退出脚本,这将导致包失败。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

4 回答 4

3

脚本转换没有返回成功或失败的相同功能。您可以使用以下代码强制出错:

    If Row.TestColumn = "Value I Want To Error On" Then
        Error (1)
    End If

基本上,Error 对象(函数?方法?随便!)将允许您模拟错误。这意味着,您可以使用此代码使包错误。

于 2009-09-30T22:59:56.640 回答
1

我一直在寻找这个问题的答案。弹出错误对我来说太烦人了!为了避免这种情况,一个“简单”的解决方案(hack)是这样的:

与其在 .FireError 之后抛出错误,不如在脚本转换中创建一个新的 DT_UI1 输出列,例如“ValidationColumn”,并将其设置为 1 或 0(不是布尔值,原因将变得清晰)。

在脚本组件之后,立即添加派生列转换,并将 ValidationColumn 替换为公式:1/ValidationColumn。(这不适用于布尔值)。当然,这会产生除以零错误,并且(使用默认设置)使派生列转换失败,从而立即导致数据流组件失败。瞧!

错误日志包含来自 .FireError 的原始验证失败消息,紧接着是除以零错误。

这可能是一个黑客,但直到有人想出一个更好的主意......

顺便说一句,我正在使用它来检查 Excel 文件是否在正确的位置(或替代位置)具有正确的标题,同时使用 IMEX=1,以便使用单个数据流加载 2 个或更多不同的列变体。 .

于 2011-01-12T17:05:41.343 回答
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 个错误后设置为失败。如果没有,脚本将需要实现一个错误输出路径,坦率地说,我没有时间......

于 2011-03-09T10:10:10.027 回答
0

以下是我在循环中创建的脚本任务。这不是您问题的直接答案——但总体思路会有所帮助。

脚本任务保存在序列容器中。并且序列容器的variable命名Propagate 设置为假。此外,对于sequence containerMaximumErrorCount属性设置为零。因此,当序列容器内发生错误时,它会以红色显示,触发 OnError 事件——但循环继续。为此,为序列容器创建一个 onerror 事件处理程序非常重要。

在脚本任务内部,它在catch块内被强制失败(通过将任务结果设置为失败)。此外,异常消息存储在一个变量中,用于将其存储到错误记录表中。此错误数据插入发生在 OnError 事件处理程序(如上所述)的执行 sql 任务中。

参考:MSDN - ScriptObjectModel.TaskResult 属性

在Script任务代码中使用Dts对象的TaskResult属性来通知包Script任务成功或失败。

脚本任务中的 catch 块如下所示。

  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

控制流

在此处输入图像描述

于 2015-12-09T20:35:34.367 回答