Data Transformation Services (DTS) 是 SQL Server 早期版本核心的 ETL 工具。雖然已被 SSIS 取代,但在維護舊系統時仍需以 C# 程式化操作 DTS 套件。本文系統整理如何透過 Microsoft DTSPackage Object Library (dts.dll) 實現:列舉本地/檔案儲存套件、載入與執行套件、修改屬性與全域變數、儲存變更等核心操作。
DTS 互操作組件)using DTS;適用於儲存在 SQL Server (含具名實例) 的套件:
using System;
using DTS;
static void ListServerPackages() {
Application app = new Application();
// 連接本地預設實例或具名實例
PackageSQLServer pkg = app.GetPackageSQLServer(
@"(local)\NetSDK", // 伺服器名稱
"sa", // 登入帳號
"", // 密碼
DTSSQLServerStorageFlags.DTSSQLStgFlag_Default
);
PackageInfos infos = pkg.EnumPackageInfos("", false, "");
foreach (PackageInfo info in infos) {
Console.WriteLine($"Name: {info.Name}\tVersionID: {info.VersionID}");
}
Console.Read();
}
關鍵點:EnumPackageInfos 參數依序為:擁有者名稱(空為所有)、是否遞迴、使用者名稱(空為所有)。
針對 .dts 檔案:
static void ListFilePackages(string filePath) {
Package2Class pkg = new Package2Class();
SavedPackageInfos infos = pkg.GetSavedPackageInfos(filePath);
foreach (SavedPackageInfo info in infos) {
Console.WriteLine($"Name: {info.PackageName}\tVersionID: {info.VersionID}");
}
pkg.UnInitialize();
Console.Read();
}
Package2Class 是核心操作類別,支援載入、屬性讀寫、執行、儲存:
static void LoadModifyExecute(string packageID, string packageName) {
Package2Class pkg = new Package2Class();
object missing = System.Reflection.Missing.Value;
try {
// 從 SQL Server 載入指定版本套件
pkg.LoadFromSQLServer(
@"(local)\NetSDK", "sa", "",
DTSSQLServerStorageFlags.DTSSQLStgFlag_Default,
"", "", packageID, packageName, ref missing
);
Console.WriteLine("原始描述: " + pkg.Description);
pkg.Description = "My description"; // 修改屬性
Console.WriteLine("修改後: " + pkg.Description);
pkg.Execute(); // 執行套件
// 儲存回 SQL Server(不指定 VersionID 使用最新版本)
pkg.SaveToSQLServer(
@"(local)\NetSDK", "sa", "",
DTSSQLServerStorageFlags.DTSSQLStgFlag_Default,
"", "", "", ref missing, false
);
}
catch (Exception ex) {
Console.WriteLine("錯誤: " + ex.Message);
}
finally {
pkg.UnInitialize();
pkg = null;
}
Console.Read();
}
注意:LoadFromSQLServer 的參數順序易混淆,建議查閱物件瀏覽器確認簽名。SaveToSQLServer 最後一個 false 表示不建立新版本。
全域變數是套件執行時的動態參數儲存:
static void ManageGlobalVariables(string filePath) {
Package2Class pkg = new Package2Class();
object missing = System.Reflection.Missing.Value;
try {
// 從檔案載入
pkg.LoadFromStorageFile(filePath, "", "", "", "Pubs2Pubs2Package", ref missing);
// 新增全域變數
pkg.GlobalVariables.AddGlobalVariable("MyVariable", "MyValue");
// 列舉顯示
foreach (GlobalVariable gv in pkg.GlobalVariables) {
Console.WriteLine($"Name: {gv.Name}\tValue: {gv.Value}");
}
// 修改既有變數值(關鍵:使用 let_Value)
pkg.GlobalVariables.Item("MyVariable").let_Value("Hello from C#");
// 持久化回檔案
pkg.SaveToStorageFile(filePath, "", "", ref missing, false);
}
catch (Exception ex) {
Console.WriteLine("錯誤: " + ex.Message);
}
finally {
pkg.UnInitialize();
}
Console.Read();
}
關鍵語法:修改值必須用 let_Value(COM 互操作產生的屬性設值方法),直接賦值 .Value = ... 可能無效。
VersionID 或留空使用最新finally 中呼叫 UnInitialize() 並設 null,釋放 COM 資源dtspackage 相關權限透過 DTS.Application、PackageSQLServer、Package2Class 三大核心類別,C# 可完整掌控 DTS 套件生命週期:發現、載入、檢查、修改參數、執行、持久化。雖然 DTS 已成歷史,但掌握這套 COM 互操作模式,對維護舊系統、理解 SQL Server 早期架構仍具參考價值。