2012-01-17 38 views
0

我正在使用FileHelpers庫將CSV文件上載到SQL Server。我想向用戶展示無法上傳的記錄列表,以確定是否存在錯誤。我將SqlServerStorage類的ErrorMode設置爲SaveAndContinue,但是當其中一個記錄違反foriegn鍵約束時,InsertRecords方法仍會引發異常。有沒有辦法保存這個錯誤並繼續插入?FileHelpers和SQL插入SqlServerStorage類---如何顯示錯誤

SqlServerStorage storage = new SqlServerStorage(typeof(RouteRecord),ConfigurationManager.ConnectionStrings["DBConnString"].ConnectionString); 
storage.ErrorManager.ErrorMode = FileHelpers.ErrorMode.SaveAndContinue; 
storage.InsertRecords((RouteRecord[])Session["successfulRecordArray"]); 

謝謝。

+0

你有哪些代碼..我們不知道你的類是什麼樣的,所以請發佈必要的代碼示例。也外鍵約束通常意味着你正在嘗試插入相同的值兩次或多次,其中只能插入其中一個值。 – MethodMan 2012-01-17 20:12:07

+0

我添加了代碼。外鍵異常正在發生,因爲正在嘗試將記錄添加到主表中沒有對應記錄的表中。 – kav 2012-01-17 20:24:18

+0

好吧我沒有意識到MasterDetail關係無論如何什麼是RouteRecord或它在哪裏宣佈..也有一點你得到typeof(RouteRecord)但插入你是Casting((RouteRecord [])不應該是Session [「 「ToRerayArray」)ToArray()需要看看事物是如何被真正定義的......看起來你可能遇到類型問題 – MethodMan 2012-01-17 20:36:43

回答

0

查看FileHelpers 2.9.9的代碼,FileHelpers error handling似乎沒有針對作爲SqlServerStorage的基類的DatabaseStorage類實現。我認爲其原因可能是,由於性能原因,SQL語句是分批處理的,所以不可能catch單個記錄的錯誤。

它不會是太困難通過覆蓋InsertRecords(Object[])添加缺少的錯誤處理,但遺憾的是SqlServerStoragesealed和一些輔助例程是internal,所以你最終不得不對幾類複製到你的代碼。 (如果您這樣做,請確保將ExecuteInBatch設置爲false,以便每個SQL語句都得到單獨處理 - 這會影響性能)。

或者,您可以在調用InsertRecords()之前調用的單獨例程中實施一些外鍵違例檢查(例如,通過枚舉RouteRecord[]),但這不會防止出於其他原因的錯誤。