Dela via


Hantera händelser programmatiskt

gäller för:SQL Server SSIS Integration Runtime i Azure Data Factory

SSIS-körningen innehåller en samling händelser som inträffar före, under och efter valideringen och körningen av ett paket. Dessa händelser kan fångas in på två sätt. Den första metoden är att implementera IDTSEvents-gränssnittet i en klass och ange klassen som en parameter till Execute and Validate methods of the package . Den andra metoden är att skapa DtsEventHandler objekt, som kan innehålla andra SSIS-objekt, till exempel uppgifter och loopar, som körs när en händelse i IDTSEvents inträffar. Det här avsnittet beskriver dessa två metoder och innehåller kodexempel som visar hur de används.

Ta emot IDTSEvents-återanrop

Utvecklare som skapar och kör paket programmatiskt kan ta emot händelsemeddelanden under validerings- och körningsprocessen med hjälp av IDTSEvents-gränssnittet. Detta görs genom att skapa en klass som implementerar -gränssnittet och tillhandahåller den här klassen som en parameter till Validate and Execute methods of a package (Kör-metoder för ett paket). Metoderna för klassen anropas sedan av körningsmotorn när händelserna inträffar.

Klassen DefaultEvents är en klass som redan implementerar IDTSEvents-gränssnittet. Därför är ett annat alternativ till att implementera IDTSEvents direkt att härleda från DefaultEvents och åsidosätta de specifika händelser som du vill svara på. Sedan anger du klassen som en parameter för Verifiera och Kör metoder för Package för att ta emot händelseåteranrop.

Följande kodexempel visar en klass som härleds från DefaultEventsoch åsidosätter metoden OnPreExecute. Klassen tillhandahålls sedan som en parameter för Validate and Execute methods of the package (Verifiera och Execute methods of the package).

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  

Skapa DtsEventHandler-objekt

Körningsmotorn ger ett robust, mycket flexibelt händelsehanterings- och meddelandesystem via DtsEventHandler-objektet. Med de här objekten kan du utforma hela arbetsflöden i händelsehanteraren, som endast körs när händelsen som händelsehanteraren tillhör inträffar. Det DtsEventHandler objektet är en container som körs när motsvarande händelse på det överordnade objektet utlöses. Med den här arkitekturen kan du skapa isolerade arbetsflöden som körs som svar på händelser som inträffar i en container. Eftersom DtsEventHandler objekt är synkrona återupptas inte körningen förrän händelsehanterarna som är kopplade till händelsen har återvänt.

Följande kod visar hur du skapar ett DtsEventHandler objekt. Koden lägger till en FileSystemTask i paketets Executables samling och skapar sedan ett DtsEventHandler objekt för aktivitetens OnError händelse. En FileSystemTask läggs till i händelsehanteraren, som körs när händelsen OnError inträffar för den första FileSystemTask. Det här exemplet förutsätter att du har en fil med namnet C:\Windows\Temp\DemoFile.txt för testning. Första gången du kör exemplet, om kopierar filen och händelsehanteraren inte anropas. Den andra gången du kör exemplet kan den första FileSystemTask inte kopiera filen (eftersom värdet för OverwriteDestinationFile är falskt), anropas händelsehanteraren, den andra FileSystemTask tar bort källfilen och paketrapporterna misslyckas på grund av felet som inträffade.

Exempel

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  

Se även

händelsehanterare för Integration Services (SSIS)
Lägga till en händelsehanterare i ett paket