如何从事件处理程序发送Dts信息消息SSIS?

问题描述 投票:1回答:1

我有一个带有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 + "]");
}

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

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...
}
c# ssis sql-server-data-tools smo script-task
1个回答
0
投票

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

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

    Dts.Events.FireInformation(2, "MySubComponent", "My Message Test", "", 0, ref fireAgain);
}
© www.soinside.com 2019 - 2024. All rights reserved.