我正在使用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();
然后在我的父包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事件。 我一直在寻找有关如何在父包中访问子包变量的信息。