Udostępnij za pośrednictwem


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