開發一個資料流組件,必須為組件實現運行時(IDTSRuntimeComponent90)和設計時(IDTSRuntimeComponent90)介面。運行時介面包含組件的中繼資料和組件執行方法,設計時介面包含使用者在BIDS中編輯組件時的方法。
事實上,我們只要在繼承PipelineComponent類,重寫類方法就可有開發自己想要的組件了。
簡單的範例
在VS中建立一個類庫項目。然後在項目中引用四個程式集:
1. Microsoft.SqlServer.PipelineHost
2. Microsoft.SqlServer.DTSPipelineWrap
3. Microsoft.SQLServer.ManagedDTS
4. Microsoft.SqlServer.DTSRuntimeWrap
然後建立一個繼承PipelineComponent的類:
其中DtsPipelineComponent語句後是DtsPipelineComponentAttribute類中屬性,定義了組件名稱、類型、表徵圖、是否可用進階編輯器、編輯介面等。關於自訂編輯介面,後面會專門討論。
然後為程式集建立簽名。
安裝組件
按F5調試後,在項目的bin\debug\檔案夾下找到編譯的庫檔案,我這裡編譯的庫檔案是DataFlowComponent_1.dll,將庫檔案複製到<SQL Server執行個體安裝路徑>\90\DTS\PipelineComponents\下。然後在GAC中安裝程式集,可以直接將庫檔案拖入<系統硬碟符>\windows\assemble,或者在命令列中輸入gacutil /i "<專案檔夾>\bin\Debug\DataFlowComponent_1.dll"
在BIDS中建立一個SSIS包,這時在設計資料流工具箱中還看不到新開發的組件,右擊工具箱,選“選擇項”。
加入開發的組件
然後在資料流設計的工具箱中就可以發現這個組件,將組件加入到資料流,雙擊它,因為沒有為組件設計編輯介面,所以預設開啟的是進階編輯器。
儘管這個組件在資料流中可以執行,但它什麼工作都不著,因為我們還沒有定義它執行時的工作。
在開發過程中常常需要在BIDS中測試新版本,每次都要將庫檔案複製到SQL檔案夾,再在GAC中安裝是件非常麻煩的事。
可以在項目的建置事件中讓編譯成功後自動安裝組件。選"編譯" —— "建置事件..." —— "編譯產生後事件"
假定你的系統和sql都裝在C:下的預設路徑,在編譯後事件文字框中輸入:
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -u DataFlowComponent_1.dll
copy DataFlowComponent_1.dll "C:\Program Files\Microsoft SQL Server\90\DTS\PipelineComponents\DataFlowComponent_1.dll"
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -i "C:\Program Files\Microsoft SQL Server\90\DTS\PipelineComponents\DataFlowComponent_1.dll"
這樣在每次編譯後,程式集會自動安裝。
但如果你開啟了兩個VS 2005,一個在寫資料流組件代碼,一個用於設計資料流;希望在代碼編譯後馬上能在資料流設計器中試用,那首先每次編譯都要有一個更高版本的程式集。
例如上次編譯的是1.0.0.0版本,那麼再修改代碼後再次編譯就要使用1.0.0.1,編譯完成後還要在資料流設計介面的工具箱中刪除群組件,然後再加入。
測試“設計時”
通常的開發狀況是開啟了兩個VS執行個體,一個用於編寫組件代碼,暫且將它叫做VS_A;一個在資料流設計介面中測試組件,將它叫做VS_B。
在VS_A中的功能表列中,選“調試” —— “附加到進程...”
將VS_B加入
然後在VS_B中加入組件,可以在VS_A設定斷點,組件的所有事件和變數都可以在VS_A中捕獲到。
測試“運行時”
假設我們要在資料流中測試“Ado Source VB”組件(這個組件是SQL Server 2005內建的Sample),在VS_B的資料流中加入一個指令碼組件,指令碼組件的代碼如下:
Public Class ScriptMain
Inherits UserComponent
Public Overrides Sub 輸入0_ProcessInputRow(ByVal Row As 輸入0Buffer)
'
' Add your code here
'
End Sub
Public Overrides Sub PreExecute()
MsgBox("Begin Debug")
MyBase.PreExecute()
End Sub
End Class
這個指令碼組件的目的是讓資料執行時出現一個Msgbox,以中斷資料流。
在MsgBox出現後,將VS_A加入到DtsDebugHost.exe中
設定組件執行時斷點,然後繼續資料流……
由於最近工作繁忙,關於SSIS資料流組件的開發我暫時不打算繼續寫下去,抱歉。
SSIS組件對非OLE DB串連的相容性不是很好,而且在SQL Server 2008 CTP3中還看到對Excel 07檔案的支援。
自己動手開發是難免的,微軟已提供了很多的Sample,感興趣的話可以到官方網站下載,重新修改修改就OK。