Programmgesteuertes Laden und Ausführen eines Remotepakets

 

Gilt für: SQL Server 2016 Preview

Um Remotepakete auf einem lokalen Computer auszuführen, auf dem Integration Services nicht installiert ist, starten Sie die Pakete, sodass sie auf dem Remotecomputer ausgeführt werden, auf dem Integration Services installiert ist. Hierzu muss auf dem lokalen Computer SQL Server-Agent, ein Webdienst oder eine Remotekomponente zum Starten der Pakete auf dem Remotecomputer verwendet werden. Wenn Sie versuchen, die Remotepakete direkt auf dem lokalen Computer zu starten, werden die Pakete geladen, und es wird versucht, die Pakete auf dem lokalen Computer auszuführen. Wenn Integration Services nicht auf dem lokalen Computer installiert ist, werden die Pakete nicht ausgeführt.

System_CAPS_ICON_note.jpg Hinweis


Sie können Pakete außerhalb von SQL Server Data Tools nur auf Clientcomputern ausführen, auf denen Integration Services installiert ist, wobei die Bedingungen Ihrer SQL Server-Lizenz möglicherweise die Installation von Integration Services auf weiteren Computern nicht zulässt. Bei Integration Services handelt es sich um eine Serverkomponente, die nicht an Clientcomputer weitergegeben werden darf.

Alternativ können Sie ein Remotepaket auch auf einem lokalen Computer ausführen, auf dem Integration Services installiert ist. Weitere Informationen finden Sie unter laden und Ausführen einer lokalen Paket programmgesteuert.

Wie bereits erwähnt, gibt es mehrere Möglichkeiten, ein Remotepaket auf einem Remoteserver auszuführen:

Fast alle Methoden, die in diesem Thema verwendet werden, um zu laden und Speichern von Paketen erfordern einen Verweis auf die Microsoft.SqlServer.ManagedDTS Assembly. Die Ausnahme ist die ADO.NET-Ansatz in diesem Thema für das Ausführen der Sp_start_job gespeicherte Prozedur, wofür nur einen Verweis auf "System.Data". Nach dem Hinzufügen des Verweis auf die Microsoft.SqlServer.ManagedDTS Assembly in einem neuen Projekt, und Importieren der Microsoft.SqlServer.Dts.Runtime Namespace mit eine mit oder Importe Anweisung.

Mithilfe von SQL Server-Agent ein Remotepaket programmgesteuert auf dem Server ausgeführt.

Im folgenden Beispielcode wird die programmgesteuerte Verwendung von SQL Server-Agent zum Ausführen eines Remotepakets auf dem Server veranschaulicht. Im Codebeispiel wird die gespeicherte Systemprozedur, Sp_start_job, welche startet eine SQL Server -Agent-Auftrag. Der Auftrag, den die Prozedur startet, hat den Namen RunSSISPackage und befindet sich auf dem Remotecomputer. Der RunSSISPackage-Auftrag führt das Paket auf dem Remotecomputer aus.

System_CAPS_ICON_note.jpg Hinweis


Der Rückgabewert von der Sp_start_job gespeicherte Prozedur gibt an, ob die gespeicherte Prozedur gestartet wurde die SQL Server Agent-Auftrag. Der Rückgabewert gibt nicht an, ob beim Ausführen des Pakets ein Fehler aufgetreten ist.

Informationen zur Fehlerbehebung bei Paketen, die aus ausgeführt werden SQL Server -Agent-Aufträge, finden Sie im Microsoft-Artikel ein SSIS-Paket wird nicht ausgeführt, wenn Sie das SSIS-Paket von einem SQL Server-Agent-Auftrag Aufrufen.

Beispielcode

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, RunSISSPackage, started successfully.");  
          break;  
        default:  
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.");  
          break;  
      }  
      Console.Read();  
    }  
  }  
}  

Verwenden von einem Webdienst oder einer Remotekomponente zum programmgesteuert ein Remotepaket ausführen

Für die vorherige Lösung zum programmgesteuerten Ausführen von Paketen auf dem Server ist kein benutzerdefinierter Code auf dem Server erforderlich. Möglicherweise bevorzugen Sie jedoch eine Lösung, bei der Pakete ohne SQL Server-Agent ausgeführt werden. Im Folgenden wird ein Beispiel für einen Webdienst, der auf dem Server zum lokalen Starten von Integration Services-Paketen erstellt werden kann, sowie für eine Testanwendung dargestellt, mit deren Hilfe der Webdienst von einem Clientcomputer aus aufgerufen werden kann. Wenn Sie eine Remotekomponente anstelle eines Webdiensts erstellen lieber, können Sie dieselbe Codelogik mit nur wenigen Änderungen in einer remote-Komponente. Für eine Remotekomponente sind jedoch möglicherweise umfangreichere Konfigurationsschritte erforderlich als für einen Webdienst.

System_CAPS_ICON_important.jpg Wichtig


Mit den Standardeinstellungen für die Authentifizierung und Autorisierung verfügt ein Webdienst im Allgemeinen nicht über die erforderlichen Berechtigungen für den Zugriff auf SQL Server oder das Dateisystem, um Pakete zu laden und auszuführen. Möglicherweise müssen Sie den Webdienst geeigneten Berechtigungen zuzuweisen, indem Sie konfigurieren die Einstellungen für die Authentifizierung und Autorisierung in der "Web.config" Datei- und Zuweisen von Datenbank und Dateisystemberechtigungen entsprechend. Eine ausführliche Beschreibung von Berechtigungen für Webdienste, Datenbanken und Dateisysteme ist nicht Gegenstand dieses Themas.

System_CAPS_ICON_important.jpg Wichtig


Die Methoden der Anwendung -Klasse zum Arbeiten mit dem SSIS-Paketspeicher unterstützen nur ".", "localhost" oder den Namen für den lokalen Server. Sie können "(local)" nicht verwenden.

Beispielcode

In den folgenden Codebeispielen wird gezeigt, wie der Webdienst erstellt und getestet wird.

Erstellen des Webdiensts

Ein Integration Services-Paket kann direkt aus einer Datei, direkt aus SQL Server oder aus dem SSIS-Paketspeicher geladen werden, der die Paketspeicherung sowohl in SQL Server-Ordnern als auch in speziellen Dateisystemordnern verwaltet. Dieses Beispiel unterstützt alle verfügbaren Optionen mithilfe einer Select Case oder wechseln Konstrukt, um die geeignete Syntax zum Starten des Pakets auszuwählen und die Eingabeargumente entsprechend verkettet. Die LaunchPackage-Webdienstmethode gibt das Ergebnis der paketausführung als ganze Zahl statt einer DTSExecResult Wert so, dass Clientcomputer nicht, einen Verweis auf einen erfordern Integration Services Assemblys.

So erstellen Sie einen Webdienst zum programmgesteuerten Ausführen von Paketen auf dem Server
  1. Öffnen Sie Visual Studio, und erstellen Sie in der gewünchsten Programmiersprache ein Webdienstprojekt. Im Beispielcode wird der Name "LaunchSSISPackageService" für das Projekt verwendet.

  2. Hinzufügen eines Verweises auf Microsoft.SqlServer.ManagedDTS und Hinzufügen einer Importe oder mit Anweisung, um die Codedatei für die Microsoft.SqlServer.Dts.Runtime Namespace.

  3. Fügen Sie den Beispielcode für die LaunchPackage-Webdienstmethode in die Klasse ein. (Im Beispiel ist der gesamte Inhalt des Codefensters dargestellt.)

  4. Erstellen und testen Sie den Webdienst. Stellen Sie hierzu eine Reihe gültiger Werte für die Eingabeargumente der LaunchPackage-Methode bereit, die auf ein vorhandenes Paket zeigen. Beispiel: Wenn package1.dtsx auf dem Server im Verzeichnis C:\My Packages gespeichert ist, übergeben Sie "file" als Wert von sourceType, "C:\My Packages" als Wert von sourceLocation und "package1" (ohne Erweiterung) als Wert von packageName.

using System;  
using System.Web;  
using System.Web.Services;  
using System.Web.Services.Protocols;  
using Microsoft.SqlServer.Dts.Runtime;  
using System.IO;  
  
[WebService(Namespace = "http://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();  
  
  }  
  
}  

Testen des Webdiensts

Im folgenden Beispiel für eine Konsolenanwendung wird der Webdienst zum Ausführen eines Pakets verwendet. Die LaunchPackage-Methode des Webdiensts gibt das Ergebnis der paketausführung als ganze Zahl statt einer DTSExecResult Wert so, dass Clientcomputer nicht, einen Verweis auf einen erfordern Integration Services Assemblys. Im Beispiel wird eine private Enumeration erstellt, deren Werte spiegeln die DTSExecResult Werte, um die Ergebnisse der Ausführung zu melden.

So erstellen Sie eine Konsolenanwendung zum Testen des Webdiensts
  1. Fügen Sie in Visual Studio mithilfe der gewünschten Programmiersprache eine neue Konsolenanwendung zu der Projektmappe hinzu, die das Webdienstprojekt enthält. Im Beispielcode wird der Name LaunchSSISPackageTest für das Projekt verwendet.

  2. Legen Sie die neue Konsolenanwendung als Startprojekt in der Projektmappe fest.

  3. Fügen Sie einen Webverweis für das Webdienstprojekt hinzu. Passen Sie ggf. die Variablendeklaration im Beispielscode für den Namen an, den Sie dem Webdienstproxyobjekt zuweisen.

  4. Fügen Sie den Beispielcode für die Hauptroutine und die private Enumeration in den Code ein. (Im Beispiel ist der gesamte Inhalt des Codefensters dargestellt.)

  5. Bearbeiten Sie die Codezeile, die die LaunchPackage-Methode aufruft, um eine Reihe gültiger Werte für die Eingabeargumente bereitzustellen, die auf ein vorhandenes Paket zeigen. Beispiel: Wenn package1.dtsx auf dem Server im Verzeichnis C:\My Packages gespeichert ist, übergeben Sie "file" als Wert von sourceType, "C:\My Packages" als Wert von sourceLocation und "package1" (ohne Erweiterung) als Wert von packageName.

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  
    };  
  
  }  
}  

Grundlegendes zu den Unterschieden zwischen lokalen und Remote-Ausführung
Programmgesteuerten laden und Ausführen eines lokalen Pakets
Laden der Ausgabe eines lokalen Pakets

Community-Beiträge

Anzeigen: