首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 操作 DTS 套件完整指南:列舉、執行、屬性與全域變數管理

     編輯:關於C語言

前言

Data Transformation Services (DTS) 是 SQL Server 早期版本核心的 ETL 工具。雖然已被 SSIS 取代,但在維護舊系統時仍需以 C# 程式化操作 DTS 套件。本文系統整理如何透過 Microsoft DTSPackage Object Library (dts.dll) 實現:列舉本地/檔案儲存套件、載入與執行套件、修改屬性與全域變數、儲存變更等核心操作。

環境準備

  1. 安裝 SQL Server Client Tools(含 DTS 執行環境)
  2. 專案加入 COM 參考:Microsoft DTSPackage Object Library(自動生成 DTS 互操作組件)
  3. 引入命名空間:using DTS;

1. 列舉 SQL Server 儲存的本地套件

適用於儲存在 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 參數依序為:擁有者名稱(空為所有)、是否遞迴、使用者名稱(空為所有)。

2. 列舉結構化儲存檔的套件資訊

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

3. 載入、執行套件與修改屬性

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 表示不建立新版本。

4. 讀取與修改全域變數

全域變數是套件執行時的動態參數儲存:


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 = ... 可能無效。

5. 常見問題與最佳實踐

  • 版本控制:DTS 套件有版本概念,載入/儲存時明確指定 VersionID 或留空使用最新
  • 資源釋放:務必在 finally 中呼叫 UnInitialize() 並設 null,釋放 COM 資源
  • 權限:執行身分需具備 SQL Server dtspackage 相關權限
  • 編碼:舊版 DTS 可能涉及雙位元組字元集,跨語系環境需測試字串處理
  • 遷移建議:新專案請直接使用 SSIS (Integration Services),API 為 Managed 程式碼,無 COM 互操作複雜度

總結

透過 DTS.Application、PackageSQLServer、Package2Class 三大核心類別,C# 可完整掌控 DTS 套件生命週期:發現、載入、檢查、修改參數、執行、持久化。雖然 DTS 已成歷史,但掌握這套 COM 互操作模式,對維護舊系統、理解 SQL Server 早期架構仍具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved