如何在SSIS中为父子包设置OnError事件

时间:2019-06-20 11:47:37

标签: c# ssis event-handling

我正在使用2016版本,并且具有一个主ETL_Extract程序包,其中我使用“执行程序包任务”执行三个子程序包(ABC,DEF,XYZ)。我想捕获System::Error_Description,以防这些子软件包中的任何子软件包发生任何错误,并且必须通过父软件包作为电子邮件通知。

我正在使用带有以下脚本的子程序包上的OnError事件来捕获"System::Error_Description"事件的脚本事件中的OnError,如下所示:

在子脚本任务中将以下系统变量用作只读:

System::PackageName
System::SourceName
System::ErrorDescription


using System;
using System.Data;
using System.IO;
// build our the error message
    string ErrorMessageToPassToParent = "Package Name:  " + Dts.Variables["System::PackageName"].Value.ToString() + Environment.NewLine + Environment.NewLine +
        "Step Failed On:  " + Dts.Variables["System::SourceName"].Value.ToString() + Environment.NewLine + Environment.NewLine +
        "Error Description:  " + Dts.Variables["System::ErrorDescription"].Value.ToString();


// Populate collection of variables.
// This will include parent package variables.
Variables vars = null;
Dts.VariableDispenser.GetVariables(ref vars);

// Lock the variables. 
Dts.VariableDispenser.LockForWrite("User::OnError_Description_FromChild");

Dts.VariableDispenser.GetVariables(ref vars);
vars["User::OnError_Description_FromChild"].Value = ErrorMessageToPassToParent;

vars.Unlock();

enter image description here

然后在我的父包ETL_Extract中声明了字符串变量'OnError_Description_FromChild',并为ETL_Extract包设置了OnError事件。

在“父包”脚本任务中,我将“ OnError_Description_FromChild”用作只读变量。下面是父程序包脚本。

  // get the variable from the parent package for the error
    string ErrorFromChildPackage = Dts.Variables["User::OnError_ErrorDescription_FromChild"].Value.ToString();

    // do a check if the value is empty or not (so we know if the error came from the child package or occurred in the parent package itself
    if (ErrorFromChildPackage.Length > 0)
    {
        // Then raise the error that was created in the child package
        Dts.Events.FireError(0, "Capture Error From Child Package Failure",
                ErrorFromChildPackage   
                , String.Empty, 0);

    } // end if the error length of variable is > 0

我是C#初学者,但是从stackoverflow引用的代码很少,无法编写上述逻辑。当我在一个子程序包上执行某些错误条件的父程序包时,这里发生的事情很少。

首先,在foreach循环容器内的子包上发生错误,并且子包脚本任务执行多次。

第二,当脚本任务在子包上完成时,它没有触发我的父包的On Error事件,而父包也失败了。 我不确定为什么不对父包触发OnError事件。 我一直在寻找有关如何在父包中访问子包变量的信息。

0 个答案:

没有答案