Zpracování událostí prostřednictvím kódu programu
platí pro:SQL Server SSIS Integration Runtime ve službě Azure Data Factory
Modul runtime SSIS poskytuje kolekci událostí, ke kterým dochází před, během a po ověření a spuštění balíčku. Tyto události lze zachytit dvěma způsoby. První metodou je implementace rozhraní IDTSEvents ve třídě a poskytnutí třídy jako parametr Execute a Validate metody balíčku. Druhou metodou je vytvoření DtsEventHandler objektů, které mohou obsahovat další objekty SSIS, jako jsou úlohy a smyčky, které se spustí, když dojde k události v IDTSEvents. Tato část popisuje tyto dvě metody a poskytuje příklady kódu, které demonstrují jejich použití.
Příjem zpětných volání IDTSEvents
Vývojáři, kteří sestavují a spouštějí balíčky programově, můžou přijímat oznámení událostí během procesu ověřování a spouštění pomocí rozhraní IDTSEvents. To se provádí vytvořením třídy, která implementuje IDTSEvents rozhraní a poskytuje tuto třídu jako parametr Validate a Execute metody balíčku. Metody třídy se pak volají modulem runtime při výskytu událostí.
Třída DefaultEvents je třída, která již implementuje IDTSEvents rozhraní; další alternativou k implementaci IDTSEvents přímo je odvození od DefaultEvents a přepsání konkrétních událostí, na které chcete reagovat. Potom zadáte třídu jako parametr pro Validate a Execute metody Package přijímat zpětná volání událostí.
Následující ukázka kódu ukazuje třídu, která je odvozena z DefaultEventsa přepíše OnPreExecute metoda. Třída se pak poskytuje jako parametr pro Validate a Execute metody balíčku.
using System;
using Microsoft.SqlServer.Dts.Runtime;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
Package p = new Package();
MyEventsClass eventsClass = new MyEventsClass();
p.Validate(null, null, eventsClass, null);
p.Execute(null, null, eventsClass, null, null);
Console.Read();
}
}
class MyEventsClass : DefaultEvents
{
public override void OnPreExecute(Executable exec, ref bool fireAgain)
{
// TODO: Add custom code to handle the event.
Console.WriteLine("The PreExecute event of the " +
exec.ToString() + " has been raised.");
}
}
}
Imports Microsoft.SqlServer.Dts.Runtime
Module Module1
Sub Main()
Dim p As Package = New Package()
Dim eventsClass As MyEventsClass = New MyEventsClass()
p.Validate(Nothing, Nothing, eventsClass, Nothing)
p.Execute(Nothing, Nothing, eventsClass, Nothing, Nothing)
Console.Read()
End Sub
End Module
Class MyEventsClass
Inherits DefaultEvents
Public Overrides Sub OnPreExecute(ByVal exec As Executable, ByRef fireAgain As Boolean)
' TODO: Add custom code to handle the event.
Console.WriteLine("The PreExecute event of the " & _
exec.ToString() & " has been raised.")
End Sub
End Class
Vytváření objektů DtsEventHandler
Modul runtime poskytuje robustní, vysoce flexibilní systém zpracování událostí a oznámení prostřednictvím objektu DtsEventHandler. Tyto objekty umožňují navrhovat celé pracovní postupy v rámci obslužné rutiny události, která se spouští pouze v případě, že událost, ke které obslužná rutina události patří. Objekt DtsEventHandler je kontejner, který se spustí, když se aktivuje odpovídající událost nadřazeného objektu. Tato architektura umožňuje vytvářet izolované pracovní postupy, které se spouští v reakci na události, ke kterým dochází v kontejneru. Vzhledem k tomu, že DtsEventHandler objekty jsou synchronní, provádění se neobnoví, dokud se obslužné rutiny událostí připojené k události nevrátily.
Následující kód ukazuje, jak vytvořit DtsEventHandler objekt. Kód přidá FileSystemTask do kolekce Executables balíčku a pak vytvoří objekt DtsEventHandler pro OnError událost úlohy. Do obslužné rutiny události se přidá FileSystemTask, která se spustí při OnError události pro první FileSystemTask. Tento příklad předpokládá, že máte soubor s názvem C:\Windows\Temp\DemoFile.txt pro testování. Při prvním spuštění ukázky, pokud se soubor úspěšně zkopíruje a obslužná rutina události není volána. Při druhém spuštění ukázky se první FileSystemTask nepodaří zkopírovat soubor (protože hodnota OverwriteDestinationFile je false), volá se obslužná rutina události, druhá FileSystemTask odstraní zdrojový soubor a balíček hlásí selhání kvůli chybě, ke které došlo.
Příklad
using System;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Tasks.FileSystemTask;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
string f = "DemoFile.txt";
Executable e;
TaskHost th;
FileSystemTask fst;
Package p = new Package();
p.Variables.Add("sourceFile", true, String.Empty,
@"C:\Windows\Temp\" + f);
p.Variables.Add("destinationFile", true, String.Empty,
Path.Combine(Directory.GetCurrentDirectory(), f));
// Create a first File System task and add it to the package.
// This task tries to copy a file from one folder to another.
e = p.Executables.Add("STOCK:FileSystemTask");
th = e as TaskHost;
th.Name = "FileSystemTask1";
fst = th.InnerObject as FileSystemTask;
fst.Operation = DTSFileSystemOperation.CopyFile;
fst.OverwriteDestinationFile = false;
fst.Source = "sourceFile";
fst.IsSourcePathVariable = true;
fst.Destination = "destinationFile";
fst.IsDestinationPathVariable = true;
// Add an event handler for the FileSystemTask's OnError event.
DtsEventHandler ehOnError = (DtsEventHandler)th.EventHandlers.Add("OnError");
// Create a second File System task and add it to the event handler.
// This task deletes the source file if the event handler is called.
e = ehOnError.Executables.Add("STOCK:FileSystemTask");
th = e as TaskHost;
th.Name = "FileSystemTask2";
fst = th.InnerObject as FileSystemTask;
fst.Operation = DTSFileSystemOperation.DeleteFile;
fst.Source = "sourceFile";
fst.IsSourcePathVariable = true;
DTSExecResult vr = p.Validate(null, null, null, null);
Console.WriteLine("ValidationResult = " + vr.ToString());
if (vr == DTSExecResult.Success)
{
DTSExecResult er = p.Execute(null, null, null, null, null);
Console.WriteLine("ExecutionResult = " + er.ToString());
if (er == DTSExecResult.Failure)
if (!File.Exists(@"C:\Windows\Temp\" + f))
Console.WriteLine("Source file has been deleted by the event handler.");
}
Console.Read();
}
}
}
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Tasks.FileSystemTask
Module Module1
Sub Main()
Dim f As String = "DemoFile.txt"
Dim e As Executable
Dim th As TaskHost
Dim fst As FileSystemTask
Dim p As Package = New Package()
p.Variables.Add("sourceFile", True, String.Empty, _
"C:\Windows\Temp\" & f)
p.Variables.Add("destinationFile", True, String.Empty, _
Path.Combine(Directory.GetCurrentDirectory(), f))
' Create a first File System task and add it to the package.
' This task tries to copy a file from one folder to another.
e = p.Executables.Add("STOCK:FileSystemTask")
th = CType(e, TaskHost)
th.Name = "FileSystemTask1"
fst = CType(th.InnerObject, FileSystemTask)
fst.Operation = DTSFileSystemOperation.CopyFile
fst.OverwriteDestinationFile = False
fst.Source = "sourceFile"
fst.IsSourcePathVariable = True
fst.Destination = "destinationFile"
fst.IsDestinationPathVariable = True
' Add an event handler for the FileSystemTask's OnError event.
Dim ehOnError As DtsEventHandler = CType(th.EventHandlers.Add("OnError"), DtsEventHandler)
' Create a second File System task and add it to the event handler.
' This task deletes the source file if the event handler is called.
e = ehOnError.Executables.Add("STOCK:FileSystemTask")
th = CType(e, TaskHost)
th.Name = "FileSystemTask1"
fst = CType(th.InnerObject, FileSystemTask)
fst.Operation = DTSFileSystemOperation.DeleteFile
fst.Source = "sourceFile"
fst.IsSourcePathVariable = True
Dim vr As DTSExecResult = p.Validate(Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("ValidationResult = " + vr.ToString())
If vr = DTSExecResult.Success Then
Dim er As DTSExecResult = p.Execute(Nothing, Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("ExecutionResult = " + er.ToString())
If er = DTSExecResult.Failure Then
If Not File.Exists("C:\Windows\Temp\" + f) Then
Console.WriteLine("Source file has been deleted by the event handler.")
End If
End If
End If
Console.Read()
End Sub
End Module
Viz také
obslužné rutiny událostí služby SSIS (Integration Services)
přidání obslužné rutiny události do balíčku