すべて実行する必要がある一連の SQL Update コマンドがある状況があります。DataSet がバッチ更新を実行できることは知っていますが、それを達成できた唯一の方法は、最初にテーブル全体をデータセットにロードすることです。テーブル内のレコードのサブセットのみを更新したい場合はどうすればよいですか?
2 に答える
ここで最も簡単な方法は、必要な行 (更新したい行) をテーブルにロードすることです。RowState が「Inserted」であることを再確認してください。「更新」を行うストアド プロシージャ (SqlCommand にラップされている) を使用してアダプターの InsertCommand プロパティを割り当てます。この調整により、テーブルに存在するすべての行が確実に更新されます。
ここでの基本は次のとおりです。DataAdapter は、状態が更新されている行に対して UpdateCommand を実行し、状態が挿入されている行に対して InsertCommand を実行し、最後に状態が削除されている行に対して DeleteCommand を実行します。
EDITED: あなたのコメントに基づいて、まず一括コピー メソッドを使用してステージング テーブルに移動することをお勧めします。次に、ステージング テーブルに基づいて、実際のテーブルで単一の更新を実行できます。
=========
1 つの方法は、SQL コマンドを自分で作成することです。ただし、自分自身を守るために、SQL インジェクションの可能性について読むことをお勧めします。状況とプラットフォームによっては、他のオプションがあります。
たとえば、大量のデータを処理している場合は、保持テーブルに一括インポートを実行してから、単一の更新コマンドを発行できます。また、レコードを XML として渡すことにも成功しました (私の環境では、DOM の読み込みコストを相殺するために少なくとも 50 行が必要であることがわかりました。私の場合、スケーラビリティの問題は問題にならないことがわかっていました)。
私が見た他のいくつかのことは、人々が更新をバイナリフィールドにパッケージ化することでした。たとえば、各列に1つのバイナリフィールドがあり、バイナリフィールドをアンパックする関数があります。ここでも、環境でテストする必要があります。
そうは言っても、必要な更新ごとに単一の更新コマンドまたはストアド プロシージャを呼び出すだけでは不十分であることを確認しましたか? コマンドをバッチ処理する必要さえないかもしれません。
- ジョシュ
時期尚早の最適化に注意してください。