【问题标题】:How to send Dts information messages SSIS from event handler?如何从事件处理程序发送 Dts 信息消息 SSIS?
【发布时间】:2020-04-30 20:49:32
【问题描述】:

我有一个带有Script Task 的SSIS 包,它调用了一些基本的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 + "]");
}

下面的缩写 main 方法显示了我如何调用事件处理程序。

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...
}

【问题讨论】:

  • "这行不行。发件人是Transfer" 帮帮我,扩展方法将成为Transfer对象模型的一部分?

标签: c# ssis sql-server-data-tools smo script-task


【解决方案1】:

我可能没有正确理解...但是您不能删除static 并且它会起作用吗?这是您的一种方法,您需要对其他方法执行相同的操作。 Sender 仍将是您订阅事件的 Transfer 对象。

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

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

【讨论】:

  • 天啊!比我尝试做的要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2019-06-07
  • 1970-01-01
  • 2019-01-15
  • 2021-09-23
  • 2012-09-15
相关资源
最近更新 更多