Udostępnij przez


Programowe ładowanie i uruchamianie pakietu zdalnego

Dotyczy:SQL Server SSIS Integration Runtime w ramach usługi Azure Data Factory

Aby uruchomić pakiety zdalne z komputera lokalnego, który nie ma zainstalowanych usług Integration Services, uruchom pakiety tak, aby były uruchamiane na komputerze zdalnym, na którym zainstalowano usługi Integration Services. Aby osiągnąć ten cel, komputer lokalny używa agenta programu SQL Server, usługi sieci Web lub składnika zdalnego do uruchamiania pakietów na komputerze zdalnym. Jeśli spróbujesz uruchomić pakiety zdalne bezpośrednio z komputera lokalnego, pakiety ładują się i próbują uruchomić z komputera lokalnego. Jeśli komputer lokalny nie ma zainstalowanych usług Integration Services, pakiety nie są uruchamiane.

Uwaga / Notatka

Nie można uruchamiać pakietów poza narzędziami SQL Server Data Tools na komputerze klienckim, chyba że są zainstalowane usługi Integration Services. Warunki licencjonowania programu SQL Server mogą nie zezwalać na instalowanie usług Integration Services na innych komputerach. Integration Services jest składnikiem serwera i nie jest redystrybucyjny do komputerów klienckich.

Alternatywnie można uruchomić pakiet zdalny z komputera lokalnego z zainstalowanymi usługami Integration Services. Aby uzyskać więcej informacji, zobacz Ładowanie i uruchamianie pakietu lokalnego programowo.

Uruchamianie pakietu zdalnego na komputerze zdalnym

Istnieje wiele sposobów uruchamiania pakietu zdalnego na serwerze zdalnym:

Prawie wszystkie metody używane w tym temacie do ładowania i zapisywania pakietów wymagają odwołania do zestawu Microsoft.SqlServer.ManagedDTS . Wyjątkiem jest podejście ADO.NET przedstawione w tym temacie dotyczące wykonywania procedury składowanej sp_start_job , która wymaga tylko odwołań do elementu System.Data i Microsoft.Data.SqlClient. Po dodaniu odwołania do zestawu Microsoft.SqlServer.ManagedDTS w nowym projekcie zaimportuj Microsoft.SqlServer.Dts.Runtime przestrzeń nazw za pomocą instrukcji using lub Import .

Programowe uruchamianie pakietu zdalnego na serwerze przy użyciu agenta programu SQL Server

Poniższy przykładowy kod pokazuje, jak programowo używać agenta programu SQL Server do uruchamiania pakietu zdalnego na serwerze. Przykładowy kod wywołuje procedurę składowaną systemu , sp_start_job, która uruchamia zadanie agenta programu SQL Server. Zadanie uruchamiane przez procedurę ma nazwę RunSSISPackage, a to zadanie znajduje się na komputerze zdalnym. Następnie RunSSISPackage zadanie uruchamia pakiet na komputerze zdalnym.

Uwaga / Notatka

Zwracana wartość procedury składowanej sp_start_job wskazuje, czy procedura składowana mogła pomyślnie uruchomić zadanie agenta programu SQL Server. Wartość zwracana nie wskazuje, czy pakiet zakończył się powodzeniem, czy niepowodzeniem.

Aby uzyskać informacje na temat pakietów rozwiązywania problemów uruchamianych z zadań agenta programu SQL Server, zobacz artykuł Microsoft An SSIS package does not run when you call the SSIS package from a SQL Server Agent job step (Pakiet usług SSIS nie jest uruchamiany podczas wywoływania pakietu usług SSIS z kroku zadania agenta programu SQL Server).

Przykładowy kod

Imports System.Data  
Imports Microsoft.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 Microsoft.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();  
    }  
  }  
}  

Programowe uruchamianie pakietu zdalnego przy użyciu usługi internetowej lub składnika zdalnego

Poprzednie rozwiązanie do programowego uruchamiania pakietów na serwerze nie wymaga żadnego niestandardowego kodu na serwerze. Jednak możesz preferować rozwiązanie, które nie polega na agencie programu SQL Server do wykonywania pakietów. W poniższym przykładzie pokazano, jak utworzyć usługę sieci Web na serwerze w celu lokalnego uruchamiania pakietów usług Integration Services oraz aplikację testową w celu wywołania usługi sieci Web z komputera klienckiego. Jeśli wolisz utworzyć składnik zdalny zamiast usługi sieci Web, możesz użyć tej samej logiki kodu z kilkoma zmianami w składniku zdalnym. Jednak składnik zdalny może wymagać bardziej rozbudowanej konfiguracji niż usługa sieci Web.

Ważne

Dzięki domyślnym ustawieniom uwierzytelniania i autoryzacji usługa sieci Web zwykle nie ma wystarczających uprawnień dostępu do programu SQL Server lub systemu plików do ładowania i wykonywania pakietów. Konieczne może być przypisanie odpowiednich uprawnień do usługi sieci Web przez skonfigurowanie ustawień uwierzytelniania i autoryzacji w pliku web.config oraz przypisywanie odpowiednich uprawnień bazy danych i systemu plików. Pełna dyskusja na temat uprawnień sieci Web, bazy danych i systemu plików wykracza poza zakres tego tematu.

Ważne

Metody Application klasy do pracy z magazynem pakietów SSIS obsługują tylko ".", localhost lub nazwę serwera dla serwera lokalnego. Nie można użyć ciągu "(local)".

Przykładowy kod

Poniższe przykłady kodu pokazują, jak utworzyć i przetestować usługę sieci Web.

Tworzenie usługi sieci Web

Pakiet usług Integration Services można załadować bezpośrednio z pliku, z programu SQL Server lub z magazynu pakietów usług SSIS. Magazyn pakietów usług SSIS zarządza magazynem pakietów zarówno w folderach programu SQL Server, jak i w specjalnych folderach systemu plików. Ten przykład obsługuje wszystkie dostępne opcje przy użyciu konstrukcji Select Case lub switch , aby wybrać odpowiednią składnię uruchamiania pakietu i odpowiednio połączyć argumenty wejściowe. Metoda usługi internetowej LaunchPackage zwraca wynik wykonania pakietu jako liczbę całkowitą zamiast DTSExecResult wartości, aby komputery klienckie nie wymagały odwołania do żadnych zestawów usług Integration Services.

Aby programowo utworzyć usługę sieci Web do uruchamiania pakietów na serwerze
  1. Otwórz program Visual Studio i utwórz projekt usługi internetowej w preferowanym języku programowania. Przykładowy kod używa nazwy LaunchSSISPackageService dla projektu.

  2. Dodaj odwołanie do usługi Microsoft.SqlServer.ManagedDTS i dodaj instrukcję Import lub using do pliku kodu dla przestrzeni nazw Microsoft.SqlServer.Dts.Runtime .

  3. Wklej przykładowy kod metody usługi internetowej LaunchPackage do klasy . (Przykład przedstawia całą zawartość okna kodu).

  4. Skompiluj i przetestuj usługę internetową, podając zestaw prawidłowych wartości dla argumentów wejściowych metody LaunchPackage, która wskazuje istniejący pakiet. Jeśli na przykład package1.dtsx jest przechowywany na serwerze w folderze C:\Moje pakiety, przekaż wartość "file" jako wartość sourceType, "C:\My Packages" jako wartość sourceLocation i "package1" (bez rozszerzenia) jako wartość 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();  
  
  }  
  
}  

Testowanie usługi sieci Web

Poniższa przykładowa aplikacja konsolowa używa usługi sieci Web do uruchamiania pakietu. Metoda LaunchPackage usługi sieci Web zwraca wynik wykonania pakietu jako liczbę całkowitą zamiast DTSExecResult wartości, aby komputery klienckie nie wymagały odwołania do żadnych zestawów usług Integration Services. W przykładzie jest tworzona prywatna wyliczenie, którego wartości odzwierciedlają DTSExecResult wartości w celu raportowania wyników wykonywania.

Aby utworzyć aplikację konsolową do testowania usługi sieci Web
  1. W programie Visual Studio dodaj nową aplikację konsolową przy użyciu preferowanego języka programowania do tego samego rozwiązania, które zawiera projekt usługi sieci Web. Przykładowy kod używa nazwy LaunchSSISPackageTest dla projektu.

  2. Ustaw nową aplikację konsolową jako projekt startowy w rozwiązaniu.

  3. Dodaj odwołanie do sieci Web dla projektu usługi sieci Web. W razie potrzeby dostosuj deklarację zmiennej w przykładowym kodzie dla nazwy przypisanej do obiektu serwera proxy usługi sieci Web.

  4. Wklej przykładowy kod procedury Main i prywatne wyliczenie do kodu. (Przykład przedstawia całą zawartość okna kodu).

  5. Edytuj wiersz kodu, który wywołuje metodę LaunchPackage, aby udostępnić zestaw prawidłowych wartości argumentów wejściowych wskazujących istniejący pakiet. Jeśli na przykład package1.dtsx jest przechowywany na serwerze w folderze C:\Moje pakiety, przekaż wartość "file" jako wartość , "C:\My Packages" jako wartość sourceTypesourceLocation, i "package1" (bez rozszerzenia) jako wartość 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  
    };  
  
  }  
}  

Zasoby zewnętrzne

zrozumienie różnic między wykonywania lokalnego i zdalnego
programowe ładowanie i uruchamianie pakietu lokalnego
Ładowanie danych wyjściowych pakietu lokalnego