2011-02-06 172 views
5

我正在使用Linq to SQL與SQL Server 2008 SP2,我的應用程序是WinForm .net 4 我正在導入SQL Server 200,000條記錄。 我正在創建對象並將它們附加到「insertonsubmit」上的datacontext。 然後我會每100條記錄做一次「submitChanges」。 我沒有任何交易。此SqlTransaction已完成;它不再可用

我得到這個錯誤

"This SqlTransaction has completed; it is no longer usable." with stack 
at System.Data.SqlClient.SqlTransaction.ZombieCheck() 
    at System.Data.SqlClient.SqlTransaction.Rollback() 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 

出於藍。 該錯誤不一致,它可能會出現在10,000條記錄或27,200條記錄或XXX條記錄之後。

因爲錯誤似乎是隨機的,我想它是與垃圾收集...

任何有線索?

+1

你能告訴我們一些獲取數據上下文並將對象附加到它的代碼嗎? – Luis 2011-02-06 09:39:43

回答

2

SubmitChanges有一個隱式事務。這裏的問題是你的交易超時 - 你只是在做太多。對於200k行,我會使用SqlBulkCopy進入臨時表,然後運行命令或SPROC將該200k移動到實際表中;也許在交易中使用該命令/ SPROC。

SqlBulkCopy設計對於這種情況 - 這是一個連續的數據流或原始TDS數據,而不是然而,可往返 - 並在服務器端實在是太優化(但作爲一個結果,你使用臨時表,或者您冒着插入未被記錄的風險)。

+2

我找到了解決方案。 看來我的機器和「加載規則」之間有一個防火牆。 – Varpi 2011-02-07 02:00:27

相關問題