Udostępnij za pośrednictwem


Obsługa zdarzeń programowo

SSIS Runtime zawiera kolekcja zdarzeń występujących przed, podczas i po sprawdzania poprawności i realizacji pakiet.Zdarzenia te można przechwycić na dwa sposoby.Pierwsza metoda jest implementując IDTSEvents interfejs w klasie i dostarczenie klasy jako parametr Execute i Validate metody pakiet.Druga metoda polega na DtsEventHandler obiektów, które mogą zawierać inne SSIS obiektów, takich jak zadania i pętli, które są wykonywane, gdy zdarzenie w IDTSEvents występuje.W tej sekcji opisano te dwie metody oraz przykłady kodu do wykazania ich wykorzystania.

Odbieranie wywołania zwrotne IDTSEvents

Deweloperzy, którzy budowania i programowo wykonać pakietów może odbierać zdarzenie powiadomienia podczas sprawdzania poprawności i wykonać procesu za pomocą IDTSEvents interfejs.Jest to realizowane przez tworzenie klasy implementującej IDTSEvents interfejs i dostarczanie tej klasy jako parametr Validate i Execute metody pakiet.Metody klasy są następnie wywoływane przez uruchomienie -czas silnika po wystąpieniu zdarzenia.

DefaultEvents Klasa jest klasą, która implementuje już IDTSEvents interfejs; Dlatego inną alternatywą do wykonania IDTSEvents bezpośrednio ma pochodzić od DefaultEvents i zastąpić określone zdarzenia, które chcesz odpowiedzieć.Następnie podaj klasy jako parametr Validate i Execute metody Package odbierać zdarzenie wywołania zwrotne.

Poniższy przykładowy kod ilustruje klasy pochodnej z DefaultEventsi zastępuje OnPreExecute metoda.The class is then provided as aparameter to the Validate and 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

Tworzenie obiektów DtsEventHandler

Uruchom -czas silnika zapewnia niezawodne, wysoce elastyczne obsługi i powiadomień systemu zdarzeń za pośrednictwem DtsEventHandler obiektu.Obiekty te pozwalają projektować przepływy całej pracy w ramach obsługi zdarzenia które wykonać tylko podczas obsługi zdarzenia należącej do wystąpi zdarzenie.DtsEventHandler Obiektu jest kontener, który jest wykonywany po odpowiednie zdarzenie na nadrzędnego obiektu pożarów.Ta architektura umożliwia tworzenie izolowanych przepływy pracy, które są wykonywane w odpowiedzi na zdarzenia występujące kontener.Ponieważ DtsEventHandler obiekty są synchroniczne, wykonanie nie wznawia aż do obsługi zdarzeń, które są dołączone do zdarzenie zwrócono.

Poniższy kod ilustruje sposób tworzenia DtsEventHandler obiektu.Kod dodaje FileSystemTask do Executables kolekcja pakiet, a następnie tworzy DtsEventHandler obiektu dla OnError zdarzenie zadanie.A FileSystemTask jest dodawany do obsługa zdarzeń, który jest wykonywany, kiedy OnError w pierwszym wystąpieniu zdarzenie FileSystemTask.W tym przykładzie założono, że plik o nazwie C:\Windows\Temp\DemoFile.txt do testowania.Pierwszy czas uruchomienie próbki, jeśli kopiuje plik pomyślnie i obsługi zdarzeń nie jest wywoływana.Drugi czas uruchomić próbki, pierwszy FileSystemTask nie można skopiować pliku (ponieważ wartość OverwriteDestinationFile jest false), nosi obsługi zdarzeń drugiego FileSystemTask usuwa plik źródłowy i awarii raporty pakiet 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
Ikona usług Integration Services (mała)Bieżąco z usług integracji

Najnowsze pliki do pobrania, artykuły, próbki i wideo firmy Microsoft, jak również wybranych rozwiązań ze Wspólnoty, odwiedź witrynę Integration Services strona na MSDN i TechNet:

Aby otrzymywać automatyczne powiadomienia dotyczące tych aktualizacji, zasubskrybuj źródła danych RSS dostępne na tej stronie.