SQL Server Integration Services (SSIS) 套件通常透過 SQL Agent 作業排程執行,但有時需在 C# 程式中動態載入並執行套件(例如依參數決定執行哪個套件)。SSIS 套件有三種部署模式:檔案系統、SSIS 目錄 (SSISDB)、資料庫 (msdb)。本文針對前兩種提供完整 C# 程式碼範例。
專案需參考以下組件(通常位於 C:\Program Files\Microsoft SQL Server\<版本>\SDK\Assemblies):
Microsoft.SqlServer.ManagedDTS.dllMicrosoft.SqlServer.DTSRuntimeWrap.dll引用命名空間:
using DTS = Microsoft.SqlServer.Dts.Runtime;
using System.Collections.Generic;
直接載入 .dtsx 檔案,設定變數值後執行:
string pkgPath = @"C:\Packages\MyPackage.dtsx";
var app = new DTS.Application();
DTS.Package pkg = app.LoadPackage(pkgPath, null);
// 設定套件變數
pkg.Variables["FirstVar"].Value = "12345321";
pkg.Variables["SecondVar"].Value = "2312";
// 執行並取得結果
DTS.DTSExecResult result = pkg.Execute();
if (result == DTS.DTSExecResult.Success)
{
Console.WriteLine("套件執行成功");
}
else
{
Console.WriteLine("套件執行失敗");
// 可遍歷 pkg.Errors 收集錯誤細節
}
適用於 SQL Server 2012+ 專案部署模型,需連線至 SSISDB 目錄:
string ssisServer = "."; // 本機預設執行個體
string folderName = "MyProjectFolder";
string projectName = "MyProject";
string packageName = "MyPackage.dtsx";
var app = new DTS.Application();
// 1. 確認資料夾是否存在
bool folderExists = app.FolderExistsOnSqlServer(folderName, ssisServer, null, null);
Console.WriteLine($"資料夾存在: {folderExists}");
// 2. 從 SSISDB 載入套件
DTS.Package pkg = app.LoadFromSqlServer(packageName, ssisServer, folderName, projectName, null);
// 3. 設定參數 (SSISDB 使用 Parameters 而非 Variables)
pkg.Parameters["OpeId"].Value = "value from c#";
// 4. 執行 (需建立 ExecutionInstance)
long executionId = pkg.Execute(true, null, null); // 同步執行並取得執行 ID
// 5. 可選:移除資料夾 (示範用)
app.RemoveFolderFromSqlServer(folderName, ssisServer, null, null);
舊版相容模式,將套件儲存於 msdb.dbo.sysssispackages。操作方式類似檔案系統,但載入方法改用 LoadFromSqlServer 並指定伺服器名稱與套件路徑。因現代專案多改用 SSISDB,此處不贅述。
pkg.Errors 集合,記錄詳細錯誤訊息以利除錯。Execute 多載搭配事件處理器 (Package.Executing, Package.Completed) 實作非同步監控。