Dela via


Läsa in och köra ett fjärrpaket programmatiskt

gäller för:SQL Server SSIS Integration Runtime i Azure Data Factory

Om du vill köra fjärrpaket från en lokal dator som inte har Integration Services installerat startar du paketen så att de körs på fjärrdatorn där Integration Services är installerat. För att uppnå det här målet måste den lokala datorn använda SQL Server Agent, en webbtjänst eller en fjärrkomponent för att starta paketen på fjärrdatorn. Om du försöker starta fjärrpaketen direkt från den lokala datorn läses paketen in på och försöker köra från den lokala datorn. Om den lokala datorn inte har Integration Services installerat körs inte paketen.

Anmärkning

Du kan inte köra paket utanför SQL Server Data Tools på en klientdator om inte Integration Services har installerats. Villkoren för SQL Server-licensiering kanske inte låter dig installera Integration Services på andra datorer. Integration Services är en serverkomponent och kan inte omdistribueras till klientdatorer.

Du kan också köra ett fjärrpaket från en lokal dator som har Integration Services installerat. Mer information finns i Läsa in och köra ett lokalt paket programmatiskt.

Köra ett fjärrpaket på fjärrdatorn

Det finns flera sätt att köra ett fjärrpaket på en fjärrserver:

Nästan alla metoder som används i det här avsnittet för att läsa in och spara paket kräver en referens till sammansättningen Microsoft.SqlServer.ManagedDTS . Undantaget är den ADO.NET metod som visas i det här avsnittet för att köra den sp_start_job lagrade proceduren, som endast kräver referenser till System.Data och Microsoft.Data.SqlClient. När du har lagt till referensen till sammansättningen Microsoft.SqlServer.ManagedDTS i ett nytt projekt importerar du namnområdet med instruktionen Microsoft.SqlServer.Dts.Runtimeusing eller Imports .

Använda SQL Server-agenten för att köra ett fjärrpaket programmatiskt på servern

Följande kodexempel visar hur du programmatiskt använder SQL Server Agent för att köra ett fjärrpaket på servern. Kodexemplet anropar den systemlagrade proceduren , sp_start_job, som startar ett SQL Server Agent-jobb. Jobbet som proceduren startar heter RunSSISPackage, och det här jobbet finns på fjärrdatorn. Jobbet RunSSISPackage kör sedan paketet på fjärrdatorn.

Anmärkning

Returvärdet för den sp_start_job lagrade proceduren anger om den lagrade proceduren kunde starta SQL Server Agent-jobbet. Returvärdet anger inte om paketet lyckades eller misslyckades.

Information om hur du felsöker paket som körs från SQL Server Agent-jobb finns i Microsoft-artikeln , Ett SSIS-paket körs inte när du anropar SSIS-paketet från ett SQL Server Agent-jobbsteg.

Exempelkod

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

Använda en webbtjänst eller fjärrkomponent för att köra ett fjärrpaket programmatiskt

Den tidigare lösningen för att köra paket programmatiskt på servern kräver ingen anpassad kod på servern. Men du kanske föredrar en lösning som inte förlitar sig på SQL Server Agent för att köra paket. I följande exempel visas hur du skapar en webbtjänst på servern för att starta Integration Services-paket lokalt och ett testprogram för att anropa webbtjänsten från en klientdator. Om du föredrar att skapa en fjärrkomponent i stället för en webbtjänst kan du använda samma kodlogik med få ändringar i en fjärrkomponent. En fjärrkomponent kan dock kräva mer omfattande konfiguration än en webbtjänst.

Viktigt!

Med standardinställningarna för autentisering och auktorisering har en webbtjänst vanligtvis inte tillräcklig behörighet för att komma åt SQL Server eller filsystemet för att läsa in och köra paket. Du kan behöva tilldela lämpliga behörigheter till webbtjänsten genom att konfigurera dess autentiserings- och auktoriseringsinställningar i web.config-filen och tilldela databas- och filsystembehörigheter efter behov. En fullständig diskussion om behörigheter för webb-, databas- och filsystem ligger utanför omfånget för det här avsnittet.

Viktigt!

Metoderna för Application klassen för att arbeta med SSIS Package Store stöder endast ".", localhost eller servernamnet för den lokala servern. Du kan inte använda "(local)".

Exempelkod

Följande kodexempel visar hur du skapar och testar webbtjänsten.

Skapa webbtjänsten

Du kan läsa in ett Integration Services-paket direkt från en fil, från SQL Server eller från SSIS Package Store. SSIS Package Store hanterar paketlagring i både SQL Server och särskilda filsystemmappar. Det här exemplet stöder alla tillgängliga alternativ genom att använda en Select Case - eller switch-konstruktion för att välja lämplig syntax för att starta paketet och sammanfoga indataargumenten på rätt sätt. Metoden LaunchPackage-webbtjänst returnerar resultatet av paketkörningen som ett heltal i stället för ett DTSExecResult värde så att klientdatorer inte behöver någon referens till integrationstjänsters sammansättningar.

Så här skapar du en webbtjänst för att köra paket på servern programmatiskt
  1. Öppna Visual Studio och skapa ett webbtjänstprojekt på önskat programmeringsspråk. Exempelkoden använder namnet LaunchSSISPackageService för projektet.

  2. Lägg till en referens till Microsoft.SqlServer.ManagedDTS och lägg till en import - eller användningssats i kodfilen för namnområdet Microsoft.SqlServer.Dts.Runtime .

  3. Klistra in exempelkoden för webbtjänstmetoden LaunchPackage i klassen . (Exemplet visar hela innehållet i kodfönstret.)

  4. Skapa och testa webbtjänsten genom att ange en uppsättning giltiga värden för indataargumenten för metoden LaunchPackage som pekar på ett befintligt paket. Om package1.dtsx till exempel lagras på servern i C:\My Packages skickar du "file" som värdet för sourceType, "C:\My Packages" som värdet för sourceLocation och "package1" (utan tillägget) som värdet för 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();  
  
  }  
  
}  

Testa webbtjänsten

Följande exempelkonsolprogram använder webbtjänsten för att köra ett paket. Metoden LaunchPackage för webbtjänsten returnerar resultatet av paketkörningen som ett heltal i stället för ett DTSExecResult värde så att klientdatorer inte behöver någon referens till integrationstjänsters sammansättningar. Exemplet skapar en privat uppräkning vars värden speglar DTSExecResult värdena för att rapportera resultatet av körningen.

Så här skapar du ett konsolprogram för att testa webbtjänsten
  1. I Visual Studio lägger du till ett nytt konsolprogram, med det programmeringsspråk du föredrar, till samma lösning som innehåller webbtjänstprojektet. Exempelkoden använder namnet LaunchSSISPackageTest för projektet.

  2. Ange det nya konsolprogrammet som startprojekt i lösningen.

  3. Lägg till en webbreferens för webbtjänstprojektet. Om det behövs justerar du variabeldeklarationen i exempelkoden för det namn som du tilldelar webbtjänstproxyobjektet.

  4. Klistra in exempelkoden för Main-rutinen och den privata uppräkningen i koden. (Exemplet visar hela innehållet i kodfönstret.)

  5. Redigera den kodrad som anropar metoden LaunchPackage för att ange en uppsättning giltiga värden för de indataargument som pekar på ett befintligt paket. Om package1.dtsx till exempel lagras på servern i C:\Mina paket skickar du "file" som värdet sourceType, "C:\My Packages" som värdet sourceLocationför , och "package1" (utan tillägget) som värdet för 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  
    };  
  
  }  
}  

Externa resurser

Förstå skillnaderna mellan lokal körning och fjärrkörning
Läser in och kör ett lokalt paket programmatiskt
Läser in utdata från ett lokalt paket