2011-10-11 43 views
4

我有一個WinForms項目,我必須閱讀大量XML文件(2GB +)並將數據存儲在MSSQL數據庫中。
10分鐘後,我得到錯誤:
「與當前連接相關的事務已經完成但尚未處理,在連接可用於執行SQL語句之前必須處理該事務。.NET TransactionScope超時問題/ EF

我想這不得不說是一個超時問題,所以我做了以下內容:

我我的代碼使用方法:

using (tran = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() 
{ 
    IsolationLevel = System.Transactions.IsolationLevel.Serializable, 
    Timeout = TimeSpan.Zero //TimeSpan.FromHours(2) 
})) 
{ 
    /*Here I read out xml, and use EF to write to DB*/ 
} 

爲了我的App.config我說:

<system.transactions> 
    <defaultSettings timeout="2:00:00"/> 
</system.transactions> 

To my machine.config我加入了:

<system.transactions> 
    <machineSettings maxTimeout="2:00:00"/> 
</system.transactions> 

而在MSSQL我設置遠程查詢超時爲0

仍發生此超時。我究竟做錯了什麼?

回答

3

我首先要指出的是,從EF單筆交易中做如此大規模的上傳是錯誤的。這種操作應該在EF之外完成,例如批量插入臨時表併合併到主數據集。

SSIS(SQL Server集成服務)也有可能出現。

EF不是數據遷移或同步的工具,它在這種情況下的性能是悲劇性的。

2

讀取使用塊之外的xml文件。

我會建議使用sqlcommand直接插入記錄。不要使用EF,因爲它需要花時間將對象轉換爲記錄。

此外,我會使用SQLTransaction而不是範圍。雖然,作用域將在下面使用sqltransaction,但是使用sqltrasnaction可以獲得更多控制權。

我的代碼看起來像