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

C# 開發 SQL Server DTS 自定義任務完整教程

     編輯:關於C#

SQL Server 2000 DTS (Data Transformation Services) 支持 COM 介面擴展自定義任務。雖然 DTS 已被 SSIS 取代,但存量系統維護仍需此技能。本文完整記錄:RCW 生成、強名簽名、GAC 安裝、COM 註冊/反註冊、CustomTask 介面實現、屬性/集合/Execute 方法、UI 整合、部署腳本。

一、先決條件與工具鏈

  • SQL Server 2000 工具:dtspkg.dll (COM 類型庫)
  • .NET Framework SDK:tlbimp.exe、sn.exe、gacutil.exe、guidgen.exe
  • Visual Studio / csc.exe 編譯器

二、生成 RCW 並安裝 GAC

rem 1. 生成強名金鑰
sn.exe -k DTSPkg.snk

rem 2. 導入類型庫生成 RCW (Microsoft.SQLServer.DTSPkg80.dll)
tlbimp.exe "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\dtspkg.dll" ^
  /out:Microsoft.SQLServer.DTSPkg80.dll ^
  /keyfile:DTSPkg.snk ^
  /namespace:Microsoft.SQLServer.DTSPkg80

rem 3. 安裝到 GAC
gacutil.exe /i Microsoft.SQLServer.DTSPkg80.dll

三、專案引用設置

  • 右鍵專案 → 添加引用 → 瀏覽選擇 Microsoft.SQLServer.DTSPkg80.dll
  • AssemblyInfo.cs 添加:[assembly: ClassInterface(ClassInterfaceType.AutoDual)]

四、自定義任務核心代碼

using System;
using System.Runtime.InteropServices;
using Microsoft.SQLServer.DTSPkg80;
using Microsoft.Win32;
using System.Windows.Forms;

namespace DTS.CustomTasks
{
    [Guid("38ED4F80-9EF4-4752-8478-65D2DB3BA7DD")]
    [ComVisible(true)]
    [ProgId("DTS.SimpleCustomTask")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class SimpleCustomTask : CustomTask
    {
        private string _name = "";
        private string _description = "SimpleCustomTask description";

        // 必須實現:CustomTask 介面成員
        public string Name
        {
            get => _name;
            set => _name = value;
        }

        public string Description
        {
            get => _description;
            set => _description = value;
        }

        public Properties Properties => null; // 無自定義屬性集,設計器將使用默認屬性網格

        public void Execute(object pPackage, object pPackageEvents, object pPackageLog, ref DTSTaskExecResult pTaskResult)
        {
            pTaskResult = DTSTaskExecResult.DTSTaskExecResult_Failure; // 預設失敗
            try
            {
                var pkg = (Package2)pPackage;
                var events = (PackageEvents)pPackageEvents;
                var log = (PackageLog)pPackageLog;

                MessageBox.Show(_description); // 示例:彈窗顯示描述
                // 實際業務:ETL 轉換、文件操作、數據庫腳本執行等

                pTaskResult = DTSTaskExecResult.DTSTaskExecResult_Success;
            }
            catch (COMException ex)
            {
                Console.WriteLine($"COM 異常: {ex}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"一般異常: {ex}");
            }
        }

        public override string ToString() => base.ToString();

        // ===== COM 註冊/反註冊 =====
        [ComRegisterFunction]
        public static void RegisterServer(Type t)
        {
            try
            {
                const string TASK_CACHE = @"Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks";
                const string CATID_DTS_CUSTOM_TASK = "{10020200-EB1C-11CF-AE6E-00AA004A34D5}";

                string guid = "{" + t.GUID.ToString().ToUpper() + "}";

                // 1. 註冊 COM 分類 (HKCR\CLSID\...\Implemented Categories\CATID)
                using (var root = Registry.ClassesRoot)
                using (var rk = root.OpenSubKey($@"CLSID\{guid}\Implemented Categories", true))
                using (var nrk = rk.CreateSubKey(CATID_DTS_CUSTOM_TASK))
                { }

                // 2. 加入 DTS 任務枚舉緩存 (HKCU\...\Tasks\{GUID})
                using (var root = Registry.CurrentUser)
                using (var rk = root.OpenSubKey(TASK_CACHE, true))
                using (var nrk = rk.CreateSubKey(guid))
                {
                    nrk.SetValue("", t.FullName);
                }

                // 3. 設置任務描述顯示在設計器工具箱
                using (var root = Registry.ClassesRoot)
                using (var rk = root.OpenSubKey($@"CLSID\{guid}", true))
                {
                    var ct = new SimpleCustomTask();
                    rk.SetValue("DTSTaskDescription", ct.Description);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"註冊失敗: {ex}");
            }
        }

        [ComUnregisterFunction]
        public static void UnregisterServer(Type t)
        {
            try
            {
                const string TASK_CACHE = @"Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks";
                string guid = "{" + t.GUID.ToString().ToUpper() + "}";

                using (var root = Registry.CurrentUser)
                using (var rk = root.OpenSubKey(TASK_CACHE, true))
                {
                    rk.DeleteSubKey(guid, false);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"反註冊失敗: {ex}");
            }
        }
    }
}

五、編譯、註冊、部署一條龍腳本

rem build.bat
csc.exe /target:library /out:DTS.CustomTasks.dll ^
  /reference:Microsoft.SQLServer.DTSPkg80.dll ^
  /keyfile:DTSPkg.snk ^
  SimpleCustomTask.cs

rem register.bat (需管理員權限)
regasm.exe /codebase DTS.CustomTasks.dll
gacutil.exe /i DTS.CustomTasks.dll

rem unregister.bat
regasm.exe /u DTS.CustomTasks.dll
gacutil.exe /u DTS.CustomTasks.dll

六、驗證與使用

  1. 打開 SQL Server Enterprise Manager → DTS 設計器
  2. 工具箱右鍵 → 自定義工具箱 → .NET Framework 組件 → 選中 DTS.CustomTasks.dll
  3. 拖放「SimpleCustomTask」到設計面,屬性網格可編輯 Name/Description
  4. 執行包,彈窗顯示 Description,任務成功

七、進階:自定義 UI (CustomTaskUI)

實現 CustomTaskUI 介面,提供 Initialize、GetView、Delete、New 方法,返回 WinForms UserControl 作為屬性編輯頁面。本文不展開,關鍵點:

  • 類同樣需 ComVisible(true)、Guid、ProgId
  • 註冊時額外寫入 HKCR\CLSID\{GUID}\Implemented Categories\{CATID_DTS_CUSTOM_TASK_UI}

八、遷移建議:DTS → SSIS

九、總結

DTS 自定義任務本質是「實現 CustomTask 介面的 COM 可見類 + 註冊表註冊」。核心難點在 RCW 生成、強名/GAC、註冊函數正確寫入分類與枚舉緩存。現代專案請直接投入 SSIS 生態;存量維護時,按本文腳本操作可確保零遺漏部署。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
DTS (SQL 2000)SSIS (SQL 2005+)
COM 介面 (CustomTask)托管介面 Microsoft.SqlServer.Dts.Runtime.Task
註冊表註冊組件部署到 GlobalAssemblyCache 或 Dts\Tasks 目錄
VB6/C++ 常見C# 為主流
無原生調試Visual Studio 完整調試