Как отправить Dts информационные сообщения SSIS из обработчика событий? - PullRequest
1 голос
/ 30 апреля 2020

У меня есть пакет служб SSIS с Script Task, который вызывает некоторый базовый c C# код. Я использую SQL SMO для копирования списка таблиц из DB1 в DB2.

У меня это работает, но я пытаюсь подписаться на обработчики событий SMO и отправить сообщения о ходе выполнения обратно SSIS, чтобы во время работы пакета SSIS я знал, что он делает.

Я нашел обработчики событий для использования, но проблема в том, что я не могу получить доступ к переменной Dts для отправлять сообщения ... что я делаю не так?

public static void DataTransferReport(object sender, DataTransferEventArgs args)
{
    bool fireAgain = false;

    // This line does not work. sender is `Transfer`
    var Dts = sender as Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel;            

    Dts.Events.FireInformation(2, "MySubComponent", "My Message Test", "", 0, ref fireAgain);
}
protected static void DiscoveryProgressReport(object sender, ProgressReportEventArgs args)
{
    Console.WriteLine("1[" + args.Current.Value + "]");
}
protected static void ScriptingProgressReport(object sender, ProgressReportEventArgs args)
{
    Console.WriteLine("2[" + args.Current.Value + "]");
}
protected static void ScriptingErrorReport(object sender, ScriptingErrorEventArgs args)
{
    Console.WriteLine("3[" + args.Current.Value + "]");
}

Сокращенный основной метод ниже, который показывает, как я вызываю обработчики событий.

public void Main()
{
    // Some code above...

    // Setup the transfer and parameters
    Transfer transfer = new Transfer
    {
        Database = sourceDatabase,

        //set destination server and database
        DestinationServer = edwConnection.Name,
        DestinationDatabase = edwConnection.Databases[targetDatabaseName].Name
    };

    //include data
    transfer.CopyData = true;

    bool fireAgain = false;

    // Loop over each table candidate var
    foreach (string tableName in tableNames)
    {
        // Create a table object
        Table table = sourceDatabase.Tables[tableName];

        // verify it exists and is not a system table
        if (table != null && !table.IsSystemObject)
        {
            // Add table object to transfer list
            transfer.ObjectList.Add(table);
        }
    }

    // Subscribe event handlers 
    transfer.DataTransferEvent += new DataTransferEventHandler(DataTransferReport);
    transfer.DiscoveryProgress += new ProgressReportEventHandler(DiscoveryProgressReport);
    transfer.ScriptingProgress += new ProgressReportEventHandler(ScriptingProgressReport);
    transfer.ScriptingError += new ScriptingErrorEventHandler(ScriptingErrorReport);

    // DO THE WORK!           
    transfer.TransferData();

    // More code below...
}

1 Ответ

1 голос
/ 01 мая 2020

Возможно, я не правильно понимаю ... но не могли бы вы просто удалить static, и это сработало бы? Вот один из ваших методов, вам нужно сделать то же самое для других. Sender по-прежнему будет Transfer объектом, на который вы подписываете событие.

public void DataTransferReport(object sender, DataTransferEventArgs args)
{
    bool fireAgain = false;       

    Dts.Events.FireInformation(2, "MySubComponent", "My Message Test", "", 0, ref fireAgain);
}
...