2010-02-22 23 views
0

SSIS 2005:我有一個DataFlow任務,包含一個IDataReader源,從Oracle數據源獲取零或多行,並將這些行推送到用作目標的腳本組件。我的目標是將這些記錄加載到DataSet中,因此我重寫了Script組件的PreExecute方法來構建DataSet和將保存記錄的子DataTable。然後在InputRow方法中向DataSet添加一行,並在PostExecute方法中將DataSet加載到ReadWriteVariable中。SSIS腳本組件的PostExecute在沒有記錄時不會觸發

我的問題是,如果從IDataReader返回零行,並且從C#代碼啓動包(使用Dts對象模型),則DataSet永遠不會在ReadWriteVariable中設置。如果我更改查詢以使行始終返回到IDataReader,則DataSet會加載到變量中,但如果返回零行,則該變量只是一個簡單的System.Object。

令人沮喪的部分是,如果我添加一些System.Windows.Forms.MessageBox.Show()調用到我的PreExecute和PostExecute方法並從VisualStudio運行包,消息出現。我甚至在將它設置爲DataSet並在MessageBox中返回DataTables的計數之後檢查腳本組件中的變量。它每次都能在設計師身上運作得很好。

有人可以解釋爲什麼PostExecute方法似乎不會被解僱,當我以編程方式運行包,而當我從設計器運行它工作得很好嗎?這是在DataFlow任務中完成的一些優化?理想情況下,如果沒有記錄返回,我希望看到一個空的DataSet放入變量中。

在此先感謝。

回答

0

設計環境使用與直接執行包不同的運行時,因此這些類型的差異並不罕見。您可能需要移動邏輯以將DataSet填充到ProcessInout方法中 - 您需要覆蓋默認實現。在那裏,檢查是否所有的行都已經被處理過(參見Michael Entin的這篇文章 - http://blogs.msdn.com/michen/archive/2007/08/31/Buffer.EndOfRowset.aspx),然後完成所有最終處理。

我已經瞭解到,在PostExecute中處理最後的步驟並不是一個好的做法 - 所以現在我只用它來清理和記錄。

+0

感謝您的回覆。在發佈這些問題之後,我做了一些進一步的實驗,第二個問題似乎是我使用父DataFlow上的表達式設置的DataReader Source的CommandText沒有使用我的字符串變量進行設置,該變量本身具有變量作爲的。所以我切換到OLEDB源,並直接在OLEDB源對話框中設置變量,現在它工作正常。 – virsum 2010-03-04 15:36:37