Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS数据流脚本任务错误处理 我有一个脚本任务,它在SSIS数据流的中间执行转换。如果脚本失败(比如它试图将字母转换为数字),我需要它以“失败”状态停止并返回到主包,然后使用数据流任务事件处理程序OnError轻松退出_Ssis_Scripting_Handler_Dataflow_Onerror - Fatal编程技术网

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

SSIS数据流脚本任务错误处理 我有一个脚本任务,它在SSIS数据流的中间执行转换。如果脚本失败(比如它试图将字母转换为数字),我需要它以“失败”状态停止并返回到主包,然后使用数据流任务事件处理程序OnError轻松退出,ssis,scripting,handler,dataflow,onerror,Ssis,Scripting,Handler,Dataflow,Onerror,此时,我发现数据流中的脚本任务返回一个.net错误弹出窗口,我必须清除该弹出窗口。我尝试了一个关于代码的Try-Catch,它似乎停止了调试窗口的出现,但我似乎无法让它以“失败状态”退出脚本,这将导致包失败。Dts.TaskResult=Dts.Results.Failure在数据流任务中似乎无效。目前我正在尝试: Catch e As System.Exception Me.ComponentMetaData.FireError(-1, "", "Error: ", e

此时,我发现数据流中的脚本任务返回一个.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错误处理程序事件

感谢您的建议。
Glenn

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

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

基本上,错误对象(函数?方法?随便什么!)将允许您模拟错误。也就是说,您可以使用此代码使程序包出错。

我已经搜索了一段时间,以找到此问题的答案。弹出错误对我来说太烦人了!为了避免这种情况,一个“简单”的解决方案(hack)是:

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

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

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

这可能是一个黑客,但除非有人想出更好的主意


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

回顾过去,不需要零除错误

在我当前的解决方案中,我捕获错误,然后执行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个错误后失败,它也可以在转换脚本中工作。如果没有,脚本将需要实现一个错误输出路径,坦白地说,我没有时间…

下面是我在循环中创建的脚本任务。这不是对你问题的直接回答,但总体思路会有所帮助

脚本任务保存在序列容器中。序列容器的
变量
名为
Propagate
,设置为false。此外,对于序列容器,
MaximumErrorCount
属性设置为零。因此,当序列容器内发生错误时,它会显示为红色,触发OnError事件,但循环将继续。为序列容器创建onerror事件处理程序以使其正常工作非常重要

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

参考:

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

脚本任务中的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
控制流


顺便说一句,如果它在数据流中,那么它是一个脚本组件,而不是一个脚本任务。谢谢。作为后续行动,我意识到在我的任期内出现了一些混乱。弹出错误实际上是可取的,并且可能是前端了解问题所在所必需的。我放弃了脚本中的所有Try-Catch代码,让包自行失败,当我在前端运行它时,VS中的调试窗口被替换为一个web错误(这是正常的),在后端,包继续执行OnError事件(清理一些表)。混淆源于需要在VS中单击OK以清除错误,但是当您在VS外部运行包时,当然这不是一个要求。您是对的,删除Try-Catch块将允许失败自动失败。大约一个月前,我遇到了这个问题,得出了相同的结论。我首先通过在Try-Catch块中强制执行一个错误来找到解决方案。然后我在Catch块中添加了一个错误。当我用这个来强迫失败时,我意识到问题完全在于试抓块。让SSI处理异常,而不是自己处理。