Programowe obsługa zdarzeń
Dotyczy:sql Server SSIS Integration Runtime w usłudze Azure Data Factory
Środowisko uruchomieniowe usług SSIS udostępnia kolekcję zdarzeń, które występują przed, podczas i po weryfikacji i wykonaniu pakietu. Te zdarzenia można przechwycić na dwa sposoby. Pierwszą metodą jest zaimplementowanie interfejsu IDTSEvents w klasie i podanie klasy jako parametru do Execute i Validate metod pakietu. Drugą metodą jest utworzenie obiektów DtsEventHandler, które mogą zawierać inne obiekty usług SSIS, takie jak zadania i pętle, które są wykonywane, gdy wystąpi zdarzenie w IDTSEvents. W tej sekcji opisano te dwie metody i przedstawiono przykłady kodu do zademonstrowania ich użycia.
Odbieranie wywołań zwrotnych IDTSEvents
Deweloperzy, którzy programowo kompilują i wykonują pakiety, mogą odbierać powiadomienia o zdarzeniach podczas procesu walidacji i wykonywania przy użyciu interfejsu IDTSEvents. W tym celu należy utworzyć klasę, która implementuje interfejs IDTSEvents i dostarcza tę klasę jako parametr do Validate i Execute metod pakietu. Metody klasy są następnie wywoływane przez aparat czasu wykonywania, gdy wystąpią zdarzenia.
Klasa DefaultEvents to klasa, która już implementuje interfejs IDTSEvents; w związku z tym kolejną alternatywą dla implementacji IDTSEvents bezpośrednio jest wyprowadzenie z DefaultEvents i zastąpienie określonych zdarzeń, na które chcesz odpowiedzieć. Następnie należy podać klasę jako parametr do Validate i Execute metod Package odbierania wywołań zwrotnych zdarzeń.
Poniższy przykładowy kod przedstawia klasę pochodzącą z DefaultEventsi zastępuje metodę OnPreExecute. Następnie klasa jest dostarczana jako parametr do Validate i Execute metod pakietu.
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
Tworzenie obiektów DtsEventHandler
Aparat czasu wykonywania zapewnia niezawodną, wysoce elastyczną obsługę zdarzeń i system powiadomień za pośrednictwem obiektu DtsEventHandler. Te obiekty umożliwiają projektowanie całych przepływów pracy w programie obsługi zdarzeń, które są wykonywane tylko wtedy, gdy wystąpi zdarzenie, do którego należy program obsługi zdarzeń. Obiekt DtsEventHandler jest kontenerem, który jest wykonywany, gdy odpowiednie zdarzenie na jego obiekcie nadrzędnym jest uruchamiane. Ta architektura umożliwia tworzenie izolowanych przepływów pracy wykonywanych w odpowiedzi na zdarzenia występujące w kontenerze. Ponieważ DtsEventHandler obiekty są synchroniczne, wykonywanie nie zostanie wznowione, dopóki nie zostaną zwrócone programy obsługi zdarzeń dołączone do zdarzenia.
Poniższy kod pokazuje, jak utworzyć obiekt DtsEventHandler. Kod dodaje FileSystemTask do kolekcji Executables pakietu, a następnie tworzy obiekt DtsEventHandler dla zdarzenia OnError zadania. Do programu obsługi zdarzeń jest dodawana FileSystemTask, która jest wykonywana po wystąpieniu zdarzenia OnError dla pierwszego FileSystemTask. W tym przykładzie przyjęto założenie, że masz plik o nazwie C:\Windows\Temp\DemoFile.txt do testowania. Przy pierwszym uruchomieniu przykładu, jeśli plik zostanie pomyślnie skopiowany i program obsługi zdarzeń nie zostanie wywołany. Po drugim uruchomieniu przykładu pierwsza FileSystemTask nie może skopiować pliku (ponieważ wartość OverwriteDestinationFile jest false), wywoływana jest procedura obsługi zdarzeń, drugi FileSystemTask usuwa plik źródłowy, a pakiet zgłasza błąd z powodu błędu, który wystąpił.
Przykład
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
Zobacz też
Programy obsługi zdarzeń Integration Services (SSIS)
dodawanie programu obsługi zdarzeń do pakietu