SSIS資料流組件開發(2)

來源:互聯網
上載者:User
開發一個資料流組件,必須為組件實現運行時(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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.