2011-02-06 136 views
5

私はSQL Server 2008 SP2でSQLにLinqを使用しています、私のアプリケーションはWinForm .netです4 SQL Server 200,000レコードにインポートしています。 私はオブジェクトを作成し、それらを "insertonsubmit"のdatacontextにアタッチします。 私は "submitChanges"を100レコードごとに行います。 私は何もこれほどまでに何の取引もありません。この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

答えて

2

SubmitChangesは暗黙的なトランザクションを持っています。あなたのトランザクションがタイムアウトしているという問題は、あまりにも多すぎることです。 200k行については、SqlBulkCopyをステージングテーブルに使用し、コマンドまたはSPROCを実行してその200kを実際のテーブルに移動します。おそらくトランザクション内のそのコマンド/ SPROCを使用します。あなたがなければならず、サーバー側でそれはあまりにも(しかし、結果として最適化されている - それは一つの連続ストリームまたは生TDSのデータではなく、しかし、5月のラウンドトリップです -

SqlBulkCopyは、このシナリオのを設計しですはステージングテーブルを使用するか、挿入がログに記録されないようにします)。

+2

問題の解決策を見つけました。 私のマシンと "load rules"との間にファイアウォールがあるようです。 – Varpi

+0

これを修正する方法についてもっと具体的に教えてください。私もこの問題を見て、これについて私のファイアウォールでは何も見ません。それはWindowsファイアウォールか他の何かですか?また、彼は、100レコードごとにsubmitChangesをやっていると言っていたので、Marc Gravellは言っていないと言った。 –

関連する問題