2010-12-15 18 views
1

彼らはラジオで長い時間の聴取者の最初の呼び出し元で言うように....DataReaderとSQLCommand

ここに私の問題です。 VS 2005 SQL Server 2005データベース。 Windowsフォームアプリケーション。 C#。大きなテーブル - 780Kレコード。私はそれをソーステーブルと呼ぶことにする。ソース表をループする必要があり、レコードごとに別の表を使用して何らかの処理を行い、完了したソース表に書き戻します。私はまだ2番目のテーブルを更新するまではありませんでした。

接続オブジェクトAを使用してデータテーブルを使用してソーステーブルのすべてのレコードをループします。各レコードについて、ソーステーブルを更新する更新文を作成しますこのレコードが処理されたことを示すために、このオブジェクトを処理するために接続オブジェクトBに対してSQLコマンドを使用します。私はdataReaderが排他的なものを望んでいるので、異なる接続オブジェクト。

ここが問題です。 Xレコード(Xが約60と思われる)を処理した後、更新タイムアウトが発生します。これを書いている間

- これが起こった面白いかそうではありません - 私の脳は、これはトランザクションの分離および/またはロック...すなわちで行うことです私に語りました。私は、データレアヤーを使用してソースレコードを読み込んでいますが、それらのレコードを変更しています...これは、異なるトランザクションの分離で問題を引き起こすことがわかりますので、そのことを見ていきます...

誰でもこれを見て解決方法を知っていますそれ?あなたは、コマンドオブジェクトのコマンドタイムアウトproperyを設定する必要がありますように

乾杯

ピート

答えて

1

詳細がなければ、解決策の可能性が非常に多数です。 iivelが指摘しているように、実行しなければならない操作のタイプに対して可能な場合は、データベース内のすべてのアクティビティを実行できます。私は、カーソルではなくセットベースの操作を使用してそのようなことを行うのが最善である可能性が高いと付け加えます。

データベースの外に、この操作を実行する必要がある場合はそれがあなたのケースで行うには安全なものであるならば、あなたのソースクエリは、すべてのロックを使用せずに実行することができます。分離レベルを設定するか、クエリーにテーブル名/エイリアスの後に単にwith (nolock)を追加するだけで、これを行うことができます。

他にもいくつかのオプションがあります。たとえば、ソーステーブルからメモリに一度に1000レコードを引き出したり、切断したり、必要な操作や更新を実行したりするなど、バッチで操作することができます。すべての1000レコードが処理されたら、キューのすべてのレコードが処理されるまで、1000レコードの別のセットを処理します。

+0

データベース内でそれを行うことはできません - 私はC#で書いておきたい第2のテーブルを更新しているREのトンです。すでにいくつかのコードがあります。私はここに戻ってくる前にノーロックを試みましたが、それが問題を解決しました。次の質問はなぜですか?nolockで読者が使用しているクエリを実行しても作者がブロックされないため、ノーロックを使用しないときに、ソースレコードがデータウェアハウスの間ロックされています。 –

+0

はい、レコードは読み取りのために共有ロックでロックされている可能性があります(つまり、読み取り時間が一定であることを保証するため)。ロックされたレコードは更新できません。他の接続ではレコードを表示できますが、変更しないでください。 –

0

カーソルに選択/更新を加えてアプリに最終結果を返すことができない理由はありますか?プロセスがDBに属している場合は、そのプロセスをそこに置くのが最善です。代わりにジョンmentiontedのようにコマンドTIMOUTを更新

はあなたの唯一の他の賭けです。

+0

私の他の回答を参照していただきありがとうございます。タイムアウトの問題ではありません。ソース上でnolockを使用することで修正されたロック/トランザクションの問題です。 Cheers pete –

関連する問題