Bagikan melalui


Memuat dan Menjalankan Paket Jarak Jauh Secara Terprogram

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

Untuk menjalankan paket jarak jauh dari komputer lokal yang tidak memiliki Layanan Integrasi yang terinstal, mulai paket sehingga paket berjalan di komputer jarak jauh tempat Layanan Integrasi diinstal. Anda melakukan ini dengan meminta komputer lokal menggunakan SQL Server Agent, layanan Web, atau komponen jarak jauh untuk memulai paket di komputer jarak jauh. Jika Anda mencoba memulai paket jarak jauh langsung dari komputer lokal, paket akan dimuat ke dan mencoba menjalankan dari komputer lokal. Jika komputer lokal tidak memiliki Layanan Integrasi yang terinstal, paket tidak akan berjalan.

Catatan

Anda tidak dapat menjalankan paket di luar SQL Server Data Tools pada komputer klien yang tidak memiliki Layanan Integrasi yang terinstal, dan ketentuan lisensi SQL Server Anda mungkin tidak memungkinkan Anda menginstal Layanan Integrasi di komputer tambahan. Integration Services adalah komponen server dan tidak dapat didistribusikan ulang ke komputer klien.

Secara bergantian, Anda dapat menjalankan paket jarak jauh dari komputer lokal yang telah menginstal Layanan Integrasi. Untuk informasi selengkapnya, lihat Memuat dan Menjalankan Paket Lokal Secara Terprogram.

Menjalankan Paket Jarak Jauh pada Komputer Jarak Jauh

Seperti disebutkan di atas, ada beberapa cara di mana Anda dapat menjalankan paket jarak jauh di server jarak jauh:

Hampir semua metode yang digunakan dalam topik ini untuk memuat dan menyimpan paket memerlukan referensi ke rakitan Microsoft.SqlServer.ManagedDTS . Pengecualiannya adalah pendekatan ADO.NET yang ditunjukkan dalam topik ini untuk menjalankan prosedur tersimpan sp_start_job , yang hanya memerlukan referensi ke System.Data. Setelah Anda menambahkan referensi ke rakitan Microsoft.SqlServer.ManagedDTS dalam proyek baru, impor Microsoft.SqlServer.Dts.Runtime namespace layanan dengan pernyataan menggunakan atau Impor .

Menggunakan Agen SQL Server untuk Menjalankan Paket Jarak Jauh Secara Terprogram di Server

Sampel kode berikut menunjukkan cara menggunakan SQL Server Agent secara terprogram untuk menjalankan paket jarak jauh di server. Sampel kode memanggil prosedur tersimpan sistem, sp_start_job, yang meluncurkan pekerjaan SQL Server Agent. Pekerjaan yang diluncurkan prosedur diberi nama RunSSISPackage, dan pekerjaan ini ada di komputer jarak jauh. Pekerjaan RunSSISPackage kemudian menjalankan paket pada komputer jarak jauh.

Catatan

Nilai pengembalian prosedur tersimpan sp_start_job menunjukkan apakah prosedur tersimpan berhasil memulai pekerjaan SQL Server Agent. Nilai pengembalian tidak menunjukkan apakah paket berhasil atau gagal.

Untuk informasi tentang paket pemecahan masalah yang dijalankan dari pekerjaan SQL Server Agent, lihat artikel Microsoft, Paket SSIS tidak berjalan saat Anda memanggil paket SSIS dari langkah pekerjaan SQL Server Agent.

Kode Sampel

Imports System.Data  
Imports System.Data.SqlClient  
  
Module Module1  
  
  Sub Main()  
  
    Dim jobConnection As SqlConnection  
    Dim jobCommand As SqlCommand  
    Dim jobReturnValue As SqlParameter  
    Dim jobParameter As SqlParameter  
    Dim jobResult As Integer  
  
    jobConnection = New SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI")  
    jobCommand = New SqlCommand("sp_start_job", jobConnection)  
    jobCommand.CommandType = CommandType.StoredProcedure  
  
    jobReturnValue = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)  
    jobReturnValue.Direction = ParameterDirection.ReturnValue  
    jobCommand.Parameters.Add(jobReturnValue)  
  
    jobParameter = New SqlParameter("@job_name", SqlDbType.VarChar)  
    jobParameter.Direction = ParameterDirection.Input  
    jobCommand.Parameters.Add(jobParameter)  
    jobParameter.Value = "RunSSISPackage"  
  
    jobConnection.Open()  
    jobCommand.ExecuteNonQuery()  
    jobResult = DirectCast(jobCommand.Parameters("@RETURN_VALUE").Value, Integer)  
    jobConnection.Close()  
  
    Select Case jobResult  
      Case 0  
        Console.WriteLine("SQL Server Agent job, RunSSISPackage, started successfully.")  
      Case Else  
        Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.")  
    End Select  
    Console.Read()  
  
  End Sub  
  
End Module  
using System;  
using System.Data;  
using System.Data.SqlClient;  
  
namespace LaunchSSISPackageAgent_CS  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      SqlConnection jobConnection;  
      SqlCommand jobCommand;  
      SqlParameter jobReturnValue;  
      SqlParameter jobParameter;  
      int jobResult;  
  
      jobConnection = new SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI");  
      jobCommand = new SqlCommand("sp_start_job", jobConnection);  
      jobCommand.CommandType = CommandType.StoredProcedure;  
  
      jobReturnValue = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);  
      jobReturnValue.Direction = ParameterDirection.ReturnValue;  
      jobCommand.Parameters.Add(jobReturnValue);  
  
      jobParameter = new SqlParameter("@job_name", SqlDbType.VarChar);  
      jobParameter.Direction = ParameterDirection.Input;  
      jobCommand.Parameters.Add(jobParameter);  
      jobParameter.Value = "RunSSISPackage";  
  
      jobConnection.Open();  
      jobCommand.ExecuteNonQuery();  
      jobResult = (Int32)jobCommand.Parameters["@RETURN_VALUE"].Value;  
      jobConnection.Close();  
  
      switch (jobResult)  
      {  
        case 0:  
          Console.WriteLine("SQL Server Agent job, RunSSISPackage, started successfully.");  
          break;  
        default:  
          Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.");  
          break;  
      }  
      Console.Read();  
    }  
  }  
}  

Menggunakan Layanan Web atau Komponen Jarak Jauh untuk Menjalankan Paket Jarak Jauh Secara Terprogram

Solusi sebelumnya untuk menjalankan paket secara terprogram di server tidak memerlukan kode kustom apa pun di server. Namun, Anda mungkin lebih suka solusi yang tidak mengandalkan SQL Server Agent untuk menjalankan paket. Contoh berikut menunjukkan layanan Web yang dapat dibuat di server untuk memulai paket Layanan Integrasi secara lokal, dan aplikasi pengujian yang dapat digunakan untuk memanggil layanan Web dari komputer klien. Jika Anda lebih suka membuat komponen jarak jauh alih-alih layanan Web, Anda dapat menggunakan logika kode yang sama dengan sangat sedikit perubahan dalam komponen jarak jauh. Namun komponen jarak jauh mungkin memerlukan konfigurasi yang lebih luas daripada layanan Web.

Penting

Dengan pengaturan default untuk autentikasi dan otorisasi, layanan Web umumnya tidak memiliki izin yang memadai untuk mengakses SQL Server atau sistem file untuk memuat dan menjalankan paket. Anda mungkin harus menetapkan izin yang sesuai ke layanan Web dengan mengonfigurasi pengaturan autentikasi dan otorisasinya di file web.config dan menetapkan izin database dan sistem file yang sesuai. Diskusi lengkap tentang izin Web, database, dan sistem file berada di luar cakupan topik ini.

Penting

Metode Application kelas untuk bekerja dengan dukungan SSIS Package Store hanya ".", localhost, atau nama server untuk server lokal. Anda tidak dapat menggunakan "(lokal)".

Kode Sampel

Sampel kode berikut menunjukkan cara membuat dan menguji layanan Web.

Membuat Layanan Web

Paket Layanan Integrasi dapat dimuat langsung dari file, langsung dari SQL Server, atau dari Penyimpanan Paket SSIS, yang mengelola penyimpanan paket di SQL Server dan folder sistem file khusus. Sampel ini mendukung semua opsi yang tersedia dengan menggunakan konstruksi Pilih Kasus atau beralih untuk memilih sintaks yang sesuai untuk memulai paket dan menggabungkan argumen input dengan tepat. Metode layanan Web LaunchPackage mengembalikan hasil eksekusi paket sebagai bilangan bulat alih-alih DTSExecResult nilai sehingga komputer klien tidak memerlukan referensi ke rakitan Integration Services apa pun.

Untuk membuat layanan Web untuk menjalankan paket di server secara terprogram
  1. Buka Visual Studio dan buat proyek layanan Web dalam bahasa pemrograman pilihan Anda. Kode sampel menggunakan nama LaunchSSISPackageService untuk proyek.

  2. Tambahkan referensi ke Microsoft.SqlServer.ManagedDTS dan tambahkan Impor atau menggunakan pernyataan ke file kode untuk namespace Microsoft.SqlServer.Dts.Runtime .

  3. Tempelkan kode sampel untuk metode layanan Web LaunchPackage ke kelas . (Sampel menunjukkan seluruh konten jendela kode.)

  4. Bangun dan uji layanan Web dengan menyediakan sekumpulan nilai yang valid untuk argumen input metode LaunchPackage yang menunjuk ke paket yang ada. Misalnya, jika package1.dtsx disimpan di server di C:\My Packages, teruskan "file" sebagai nilai sourceType, "C:\My Packages" sebagai nilai sourceLocation, dan "package1" (tanpa ekstensi) sebagai nilai packageName.

Imports System.Web  
Imports System.Web.Services  
Imports System.Web.Services.Protocols  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports System.IO  
  
<WebService(Namespace:="https://dtsue/")> _  
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _  
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _  
Public Class LaunchSSISPackageService  
  Inherits System.Web.Services.WebService  
  
  ' LaunchPackage Method Parameters:  
  ' 1. sourceType: file, sql, dts  
  ' 2. sourceLocation: file system folder, (none), logical folder  
  ' 3. packageName: for file system, ".dtsx" extension is appended  
  
  <WebMethod()> _  
  Public Function LaunchPackage( _  
    ByVal sourceType As String, _  
    ByVal sourceLocation As String, _  
    ByVal packageName As String) As Integer 'DTSExecResult  
  
    Dim packagePath As String  
    Dim myPackage As Package  
    Dim integrationServices As New Application  
  
    ' Combine path and file name.  
    packagePath = Path.Combine(sourceLocation, packageName)  
  
    Select Case sourceType  
      Case "file"  
        ' Package is stored as a file.  
        ' Add extension if not present.  
        If String.IsNullOrEmpty(Path.GetExtension(packagePath)) Then  
          packagePath = String.Concat(packagePath, ".dtsx")  
        End If  
        If File.Exists(packagePath) Then  
          myPackage = integrationServices.LoadPackage(packagePath, Nothing)  
        Else  
          Throw New ApplicationException( _  
            "Invalid file location: " & packagePath)  
        End If  
      Case "sql"  
        ' Package is stored in MSDB.  
        ' Combine logical path and package name.  
        If integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty) Then  
          myPackage = integrationServices.LoadFromSqlServer( _  
            packageName, "(local)", String.Empty, String.Empty, Nothing)  
        Else  
          Throw New ApplicationException( _  
            "Invalid package name or location: " & packagePath)  
        End If  
      Case "dts"  
        ' Package is managed by SSIS Package Store.  
        ' Default logical paths are File System and MSDB.  
        If integrationServices.ExistsOnDtsServer(packagePath, ".") Then  
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", Nothing)  
        Else  
          Throw New ApplicationException( _  
            "Invalid package name or location: " & packagePath)  
        End If  
      Case Else  
        Throw New ApplicationException( _  
          "Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.")  
    End Select  
  
    Return myPackage.Execute()  
  
  End Function  
  
End Class  
using System;  
using System.Web;  
using System.Web.Services;  
using System.Web.Services.Protocols;  
using Microsoft.SqlServer.Dts.Runtime;  
using System.IO;  
  
[WebService(Namespace = "https://dtsue/")]  
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
public class LaunchSSISPackageServiceCS : System.Web.Services.WebService  
{  
  public LaunchSSISPackageServiceCS()  
  {  
    }  
  
  // LaunchPackage Method Parameters:  
  // 1. sourceType: file, sql, dts  
  // 2. sourceLocation: file system folder, (none), logical folder  
  // 3. packageName: for file system, ".dtsx" extension is appended  
  
  [WebMethod]  
  public int LaunchPackage(string sourceType, string sourceLocation, string packageName)  
  {   
  
    string packagePath;  
    Package myPackage;  
    Application integrationServices = new Application();  
  
    // Combine path and file name.  
    packagePath = Path.Combine(sourceLocation, packageName);  
  
    switch(sourceType)  
    {  
      case "file":  
        // Package is stored as a file.  
        // Add extension if not present.  
        if (String.IsNullOrEmpty(Path.GetExtension(packagePath)))  
        {  
          packagePath = String.Concat(packagePath, ".dtsx");  
        }  
        if (File.Exists(packagePath))  
        {  
          myPackage = integrationServices.LoadPackage(packagePath, null);  
        }  
        else  
        {  
          throw new ApplicationException("Invalid file location: "+packagePath);  
        }  
        break;  
      case "sql":  
        // Package is stored in MSDB.  
        // Combine logical path and package name.  
        if (integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty))  
        {  
          myPackage = integrationServices.LoadFromSqlServer(packageName, "(local)", String.Empty, String.Empty, null);  
        }  
        else  
        {  
          throw new ApplicationException("Invalid package name or location: "+packagePath);  
        }  
        break;  
      case "dts":  
        // Package is managed by SSIS Package Store.  
        // Default logical paths are File System and MSDB.  
        if (integrationServices.ExistsOnDtsServer(packagePath, "."))  
        {  
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", null);  
        }  
        else  
        {  
          throw new ApplicationException("Invalid package name or location: "+packagePath);  
        }  
        break;  
      default:  
        throw new ApplicationException("Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.");  
    }  
  
    return (Int32)myPackage.Execute();  
  
  }  
  
}  

Menguji Layanan Web

Contoh aplikasi konsol berikut menggunakan layanan Web untuk menjalankan paket. Metode LaunchPackage dari layanan Web mengembalikan hasil eksekusi paket sebagai bilangan bulat alih-alih DTSExecResult nilai sehingga komputer klien tidak memerlukan referensi ke rakitan Integration Services apa pun. Sampel membuat enumerasi privat yang nilainya mencerminkan DTSExecResult nilai untuk melaporkan hasil eksekusi.

Untuk membuat aplikasi konsol untuk menguji layanan Web
  1. Di Visual Studio, tambahkan aplikasi konsol baru, menggunakan bahasa pemrograman pilihan Anda, ke solusi yang sama yang berisi proyek layanan Web. Kode sampel menggunakan nama LaunchSSISPackageTest untuk proyek.

  2. Atur aplikasi konsol baru sebagai proyek startup dalam solusi.

  3. Tambahkan referensi Web untuk proyek layanan Web. Jika perlu, sesuaikan deklarasi variabel dalam kode sampel untuk nama yang Anda tetapkan ke objek proksi layanan Web.

  4. Tempelkan kode sampel untuk rutinitas Utama dan enumerasi privat ke dalam kode. (Sampel menunjukkan seluruh konten jendela kode.)

  5. Edit baris kode yang memanggil metode LaunchPackage untuk menyediakan sekumpulan nilai yang valid untuk argumen input yang menunjuk ke paket yang ada. Misalnya, jika package1.dtsx disimpan di server di C:\My Packages, teruskan "file" sebagai nilai sourceType, "C:\My Packages" sebagai nilai sourceLocation, dan "package1" (tanpa ekstensi) sebagai nilai packageName.

Module LaunchSSISPackageTest  
  
  Sub Main()  
  
    Dim launchPackageService As New LaunchSSISPackageService.LaunchSSISPackageService  
    Dim packageResult As Integer  
  
    Try  
      packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage")  
    Catch ex As Exception  
      ' The type of exception returned by a Web service is:  
      '  System.Web.Services.Protocols.SoapException  
      Console.WriteLine("The following exception occurred: " & ex.Message)  
    End Try  
  
    Console.WriteLine(CType(packageResult, PackageExecutionResult).ToString)  
    Console.ReadKey()  
  
  End Sub  
  
  Private Enum PackageExecutionResult  
    PackageSucceeded  
    PackageFailed  
    PackageCompleted  
    PackageWasCancelled  
  End Enum  
  
End Module  
using System;  
  
namespace LaunchSSISPackageSvcTestCS  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS launchPackageService = new LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS();  
      int packageResult = 0;  
  
      try  
      {  
        packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage");  
      }  
      catch (Exception ex)  
      {  
        // The type of exception returned by a Web service is:  
        //  System.Web.Services.Protocols.SoapException  
        Console.WriteLine("The following exception occurred: " + ex.Message);  
      }  
  
      Console.WriteLine(((PackageExecutionResult)packageResult).ToString());  
      Console.ReadKey();  
  
    }  
  
    private enum PackageExecutionResult  
    {  
      PackageSucceeded,  
      PackageFailed,  
      PackageCompleted,  
      PackageWasCancelled  
    };  
  
  }  
}  

Sumber Daya Eksternal

Lihat Juga

Memahami Perbedaan antara Eksekusi Lokal dan Jarak Jauh
Memuat dan Menjalankan Paket Lokal Secara Terprogram
Memuat Output Paket Lokal