Я использую версию 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' и установил событие OnError для пакета ETL_Extract.
В задаче «Сценарий родительского пакета» я использую «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, и задача сценария дочернего пакета выполняется несколько раз.
Во-вторых, когда задача сценария была завершена в дочернем пакете, она не выполняласьвызвано событие «Ошибка» для моего родительского пакета, в то время как родительский пакет также потерпел неудачу.Я не уверен, почему событие OnError не запускается для родительского пакета.Я искал информацию о том, как получить доступ к переменной дочернего пакета в родительском пакете.