Bagikan melalui


Menangani Peristiwa Secara Terprogram

Berlaku untuk: SQL Server SSIS Integration Runtime di Azure Data Factory

Runtime SSIS menyediakan kumpulan peristiwa yang terjadi sebelum, selama, dan setelah validasi dan eksekusi paket. Peristiwa ini dapat ditangkap dengan dua cara. Metode pertama adalah dengan mengimplementasikan IDTSEvents antarmuka di kelas, dan menyediakan kelas sebagai parameter ke metode Jalankan dan Validasi paket. Metode kedua adalah dengan membuat DtsEventHandler objek, yang dapat berisi objek SSIS lainnya, seperti tugas dan perulangan, yang dijalankan saat peristiwa IDTSEvents terjadi. Bagian ini menjelaskan dua metode ini dan menyediakan contoh kode untuk menunjukkan penggunaannya.

Menerima Panggilan Balik IDTSEvents

Pengembang yang membangun dan menjalankan paket secara terprogram dapat menerima pemberitahuan peristiwa selama proses validasi dan eksekusi menggunakan IDTSEvents antarmuka. Ini dilakukan dengan membuat kelas yang mengimplementasikan IDTSEvents antarmuka dan menyediakan kelas ini sebagai parameter untuk metode Validasi dan Jalankan paket. Metode kelas kemudian dipanggil oleh mesin run-time ketika peristiwa terjadi.

Kelas DefaultEvents adalah kelas yang sudah mengimplementasikan IDTSEvents antarmuka; oleh karena itu, alternatif lain untuk menerapkan IDTSEvents secara langsung adalah memperoleh dan DefaultEvents mengambil alih peristiwa tertentu yang ingin Anda tanggapi. Anda kemudian menyediakan kelas Anda sebagai parameter untuk metode Validasi dan Jalankan untuk Package menerima panggilan balik peristiwa.

Sampel kode berikut menunjukkan kelas yang berasal dari DefaultEvents, dan mengambil alih OnPreExecute metode . Kelas kemudian disediakan sebagai aparameter untuk metode Validasi dan Jalankan paket.

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  

Membuat Objek DtsEventHandler

Mesin run-time menyediakan sistem penanganan peristiwa dan pemberitahuan yang kuat dan sangat fleksibel melalui DtsEventHandler objek. Objek ini memungkinkan Anda merancang seluruh alur kerja dalam penanganan aktivitas, yang dijalankan hanya ketika peristiwa tempat penanganan aktivitas terjadi. Objek DtsEventHandler adalah kontainer yang dijalankan ketika peristiwa yang sesuai pada objek induknya diaktifkan. Arsitektur ini memungkinkan Anda membuat alur kerja terisolasi yang dijalankan sebagai respons terhadap peristiwa yang terjadi pada kontainer. Karena DtsEventHandler objek sinkron, eksekusi tidak dilanjutkan hingga penanganan aktivitas yang dilampirkan ke peristiwa telah kembali.

Kode berikut menunjukkan cara membuat DtsEventHandler objek. Kode menambahkan FileSystemTask ke Executables kumpulan paket, lalu membuat DtsEventHandler objek untuk OnError peristiwa tugas. FileSystemTask ditambahkan ke penanganan aktivitas, yang dijalankan ketika OnError peristiwa terjadi untuk yang pertama FileSystemTask. Contoh ini mengasumsikan bahwa Anda memiliki file bernama C:\Windows\Temp\DemoFile.txt untuk pengujian. Pertama kali Anda menjalankan sampel, jika file berhasil disalin dan penanganan aktivitas tidak dipanggil. Kedua kali Anda menjalankan sampel, yang pertama FileSystemTask gagal menyalin file (karena nilai OverwriteDestinationFile salah), penanganan aktivitas dipanggil, yang kedua FileSystemTask menghapus file sumber, dan paket melaporkan kegagalan karena kesalahan yang terjadi.

Contoh

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  

Lihat Juga

Penanganan Aktivitas Integration Services (SSIS)
Menambahkan Penanganan Aktivitas ke Paket