1. 程式人生 > >一次SSIS Package的除錯經歷

一次SSIS Package的除錯經歷

SSIS Package的除錯有時是一個非常艱難的過程,由於SSIS 編譯器給出的錯誤資訊,可能並不完善,需要程式設計師根據錯誤資訊抽絲撥繭,尋找錯誤的根源,進而解決問題。

第一部分:SSIS提供的除錯工具

1,SSIS Package的 Control Flow 通過醒目的圖示顯示task的執行情況

在執行package的時候,如果一個Task上顯示綠色的勾,表示task執行正常,如果顯示的是紅色的X,表示task執行異常。

通常SSIS Package除錯的第一步就是尋找出錯的Task,然後進入該task的data flow中檢視報錯的component。

在Task上顯示錯誤資訊,進入該task,發現Excel Source沒有指定connection manager。

2,在package執行時,會出現一個progress顯示執行的進度

如果錯誤,會在Progress中顯示錯誤的資訊

3,Data Viewer 檢視從上游元件傳遞的資料

通過 點選藍色的資料流線,Enable Data Viewer來檢視資料。

4,設定breakpoint

選中Task,點選右鍵,選中Edit Breakpoint來設定斷點,進行除錯

5,package 事件,可以在事件中寫入特殊的程式碼,當錯誤出現時,傳送runtime的錯誤資訊或將錯誤資訊寫入文件,方便程式設計師捕捉錯誤資訊,提高debug的效率。

6,以上5種都是非常方便的除錯工具,當然SSIS提供的輔助除錯工具也有很多,各有用途,如果使用得當,將會使debug更有效率。

第二部分:示例

在使用scripte componet的一個package,出現一個錯誤資訊 “object reference not set to an instance of an object”

說明在 scripte componet的C#程式碼中,並沒有將物件設定為一個有效的例項。

複製程式碼
  DataTable dt;  

public override void PreExecute() { base.PreExecute(); IDTSConnectionManager100 cnManager = Connections.Connection; SqlConnection cnn
= (SqlConnection)cnManager.AcquireConnection(null); SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select code,name from [dbo].[tbExcel]"; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 60000; dt = new DataTable("dt"); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(dt); }
複製程式碼

從PreExecute函式中,可以看出,最有可能的錯誤原因是 cnManager 並沒有獲取到Package的Connection Manager

IDTSConnectionManager100 cnManager = Connections.Connection;

檢視Script component的connection managers選項卡,已經設定了connection manager,那麼錯誤的原因可能就是Name=Connection的Connection Manager的連結字串有錯誤,導致無法連線到DB。

經驗證,最終的結果跟推測一樣,Connection Manager的連結字串有錯誤,無法連線到DB,導致Script component執行失敗。