以程式設計方式載入和執行遠端封裝

若要從沒有安裝 Integration Services 的本機電腦執行遠端封裝,請啟動封裝,讓它們在已安裝 Integration Services 的遠端電腦上執行。完成這項工作的方法是讓本機電腦使用 SQL Server Agent、Web 服務或遠端元件來啟動遠端電腦上的封裝。如果您嘗試直接從本機電腦啟動遠端封裝,該封裝將載入並嘗試從本機電腦執行。如果本機電腦沒有安裝 Integration Services,封裝將不會執行。

[!附註]

您無法在沒有安裝 Integration Services 的用戶端電腦上,於 BI Development Studio 的外部執行封裝,而且 SQL Server 授權的條款可能禁止您在其他電腦上安裝 Integration Services。Integration Services 是一種伺服器元件,而且不可轉散發到用戶端電腦。

或者,您可以從已安裝 Integration Services 的本機電腦執行遠端封裝。如需詳細資訊,請參閱<以程式設計的方式載入和執行本機封裝>。

在遠端電腦上執行遠端封裝

如上所述,有多種方法可以在遠端伺服器上執行遠端封裝:

  • 以程式設計方式使用 SQL Server Agent 執行遠端封裝

  • 以程式設計方式使用 Web 服務或是遠端元件執行遠端封裝

本主題中幾乎所有用以載入和儲存封裝的方法,都需要 Microsoft.SqlServer.ManagedDTS 組件的參考。唯一的例外是本主題中示範之執行 sp_start_job 預存程序的 ADO.NET 方法,只需要 System.Data 的參考。在新專案中加入 Microsoft.SqlServer.ManagedDTS 組件的參考之後,請使用 using 或 Imports 陳述式來匯入 Microsoft.SqlServer.Dts.Runtime 命名空間。

以程式設計方式使用 SQL Server Agent 在伺服器上執行遠端封裝

下列程式碼範例示範如何以程式設計方式使用 SQL Server Agent,在伺服器上執行遠端封裝。程式碼範例會呼叫系統預存程序 sp_start_job,它將會啟動 SQL Server Agent 作業。程序所啟動的作業其名稱為 RunSSISPackage,而且此作業是在遠端電腦上。RunSSISPackage 作業接著會在遠端電腦上執行封裝。

[!附註]

sp_start_job 預存程序的傳回值指出預存程序是否能夠順利地啟動 SQL Server Agent 作業。傳回值不會指出封裝是成功或是失敗。

如需有關從 SQL Server Agent 作業執行之封裝的疑難排解詳細資訊,請參閱 Microsoft 文件從 SQL Server Agent 作業步驟呼叫 SSIS 封裝時,SSIS 封裝未執行

範例程式碼

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

回到頁首

以程式設計方式使用 Web 服務或是遠端元件執行遠端封裝

在伺服器上以程式設計方式執行封裝的上述方案,並不需要伺服器上的任何自訂程式碼。不過,您可能偏好使用不需依賴 SQL Server Agent 的方案來執行封裝。下列範例示範可以在伺服器上建立的 Web 服務,以便在本機上啟動 Integration Services 封裝,以及可用以從用戶端電腦呼叫 Web 服務的測試應用程式。如果您偏好建立遠端元件,而不是 Web 服務,可以在遠端元件中透過非常少的變更來使用相同的程式碼邏輯。不過,遠端元件可能需要比 Web 服務設定更大量的組態。

重要注意事項重要事項

因為其驗證與授權的預設值,Web 服務通常沒有足夠的權限存取 SQL Server 或是檔案系統以載入和執行封裝。您可能必須在 web.config 檔案中設定其驗證與授權設定,並適當地指派資料庫與檔案系統權限,以便將適當的權限指派到 Web 服務。Web、資料庫以及檔案系統權限的完整討論不在本主題的範圍之內。

重要注意事項重要事項

用以搭配 SSIS 封裝存放區使用的 Application 類別之方法,僅支援 "."、localhost 或是本機伺服器的伺服器名稱。您無法使用 "(local)"。

範例程式碼

下列程式碼範例示範如何建立和測試 Web 服務。

建立 Web 服務

Integration Services 封裝可以直接從檔案、直接從 SQL Server 或從 SSIS 封裝存放區 (同時管理在 SQL Server 與特殊檔案系統資料夾中的封裝儲存體) 載入。這個範例使用 Select Case 或 switch 建構以選取適當的封裝啟動語法並適當地串連輸入引數,來支援所有可用的選項。LaunchPackage Web 服務方法會以整數而不是 DTSExecResult 值傳回封裝執行的結果,因此用戶端電腦不需要任何 Integration Services 組件的參考。

以程式設計方式建立 Web 服務以執行伺服器上的封裝

  1. 使用您慣用的程式語言,開啟 Visual Studio 並建立 Web 服務專案。範例程式碼使用 LaunchSSISPackageService 做為專案的名稱。

  2. 加入 Microsoft.SqlServer.ManagedDTS 的參考,並將 Imports 或 using 陳述式加入 Microsoft.SqlServer.Dts.Runtime 命名空間的程式碼檔案。

  3. 將 LaunchPackage Web 服務方法的範例程式碼貼到類別中 (範例顯示程式碼視窗的整個內容)。

  4. 藉由為 LaunchPackage 方法的輸入引數提供一組指向現有封裝的有效值,建立並測試 Web 服務。例如,如果 package1.dtsx 是儲存在伺服器上的 C:\My Packages 中,則傳遞 "file" 以做為 sourceType 的值,傳遞 "C:\My Packages" 做為 sourceLocation 的值,並傳遞 "package1" (沒有副檔名) 做為 packageName 的值。

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO

<WebService(Namespace:="http://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 = "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();

  }

}

測試 Web 服務

下列範例主控台應用程式使用 Web 服務執行封裝。Web 服務的 LaunchPackage 方法會以整數而不是 DTSExecResult 值傳回封裝執行的結果,因此用戶端電腦不需要任何 Integration Services 組件的參考。範例會建立一個私用列舉,其值會鏡像 DTSExecResult 值,以報告執行的結果。

建立主控台應用程式以測試 Web 服務

  1. 在 Visual Studio 中,使用您慣用的程式語言,將新主控台應用程式加入包含 Web 服務專案的相同方案。範例程式碼使用 LaunchSSISPackageTest 做為專案的名稱。

  2. 將新主控台應用程式設定為方案中的啟動專案。

  3. 加入 Web 服務專案的 Web 參考。若有需要,請在範例程式碼中,為指派到 Web 服務 Proxy 物件的名稱,調整變數宣告。

  4. 將 Main 常式與私用列舉的範例程式碼貼到程式碼中 (範例顯示程式碼視窗的整個內容)。

  5. 編輯呼叫 LaunchPackage 方法的程式碼行,為其輸入引數提供一組指向現有封裝的有效值。例如,如果 package1.dtsx 是儲存在伺服器上的 C:\My Packages 中,則傳遞 "file" 以做為 sourceType 的值,傳遞 "C:\My Packages" 做為 sourceLocation 的值,並傳遞 "package1" (沒有副檔名) 做為 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
    };

  }
}

回到頁首

Integration Services 圖示 (小) 掌握 Integration Services 的最新狀態

若要取得 Microsoft 的最新下載、文件、範例和影片以及社群中的選定解決方案,請瀏覽 MSDN 或 TechNet 上的 Integration Services 頁面:

若要得到這些更新的自動通知,請訂閱該頁面上所提供的 RSS 摘要。