Как настроить событие OnError для родительского и дочернего пакетов в службах SSIS - PullRequest
1 голос
/ 20 июня 2019

Я использую версию 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' и установил событие 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 не запускается для родительского пакета.Я искал информацию о том, как получить доступ к переменной дочернего пакета в родительском пакете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...