У меня есть пакет служб 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...
}