Sdílet prostřednictvím


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