次の方法で共有


データ アダプターとデータセットを使用した DB2 データベースの更新

データセットからデータ ソースへの変更を解決するために、MsDb2DataAdapterUpdate メソッドが呼び出されます。 Fill メソッドと同様に、Update メソッドは、引数としてDataSetのインスタンスと、オプションのDataTable オブジェクトまたはDataTable名を受け取ります。 DataSet インスタンスは、加えられた変更を含むDataSet オブジェクトであり、DataTable オブジェクトは変更の取得元のテーブルを識別します。

Update メソッドの呼び出し

Update メソッドを呼び出すと、MsDb2DataAdapter行われた変更が分析され、適切なコマンド (INSERT、UPDATE、または DELETE) が実行されます。 MsDb2DataAdapterは、データ行の変更を検出すると、InsertCommandUpdateCommand、またはDeleteCommandを使用して変更を処理します。 これにより、デザイン時にコマンド構文を指定し、可能な場合はストアド プロシージャを使用して、ADO.NET アプリケーションのパフォーマンスを最大化できます。 コマンドは Update を呼び出す前に明示的に設定する必要があります。 Updateが呼び出され、特定の更新に対して適切なコマンドが存在しない場合 (削除された行のDeleteCommandがない場合など)、例外がスローされます。 コマンド パラメーターを使用して、データセット内の変更された行ごとに SQL ステートメントまたはストアド プロシージャの入力値と出力値を指定できます。

DataTable オブジェクトが 1 つのデータベース テーブルにマップまたは生成される場合は、MsDb2CommandBuilder オブジェクトを利用して、MsDb2DataAdapter オブジェクトのDeleteCommandInsertCommand、およびUpdateCommandプロパティを自動的に生成できます。

データセットの更新

Updateメソッドは変更をデータ ソースに解決しますが、データセットを最後に入力した後、他のクライアントがデータ ソースでデータを変更している可能性があります。 現在のデータでデータセットを更新するには、 MsDb2DataAdapter メソッドと Fill メソッドを使用します。 テーブルに新しい行が追加され、更新された情報が既存の行に組み込まれます。 Fill メソッドは、データセット内の行の主キー値と、SelectCommandによって返される行を調べることで、新しい行を追加するか、既存の行を更新するかを決定します。 Fill メソッドは、SelectCommandによって返された結果の行の主キー値と一致するデータセット内の行の主キー値を検出した場合、SelectCommandによって返された行の情報を使用して既存の行を更新し、既存の行のRowStateプロパティをUnchangedに設定します。 SelectCommandによって返された行に、データセット内の行の主キー値と一致しない主キー値がある場合、Fill メソッドは、UnchangedRowStateを持つ新しい行を追加します。

DataTableが OUTER JOIN の結果を返す場合、DataAdapter オブジェクトは結果のDataTable オブジェクトの PrimaryKey 値を設定しません。 重複する行が正しく解決されるように、PrimaryKey を自分で定義する必要があります。

Update メソッドを呼び出すときに発生する可能性がある例外を処理するには、RowUpdated イベントを使用して行の更新エラーが発生したときに応答するか、Updateを呼び出す前にDataAdapter.ContinueUpdateOnErrortrueに設定し、更新が完了したときに特定の行のRowError プロパティに格納されているエラー情報に応答することができます。

DataSetDataTable、またはDataRowオブジェクトでAcceptChangesを呼び出すと、データ行のすべての元の値がデータ行の現在の値で上書きされます。 行を一意として識別するフィールド値が変更された場合、 AcceptChangesを呼び出した後、元の値はデータ ソースの値と一致しなくなります。

オートインクリメント列の扱い

データ ソースのテーブルに自動インクリメント列がある場合は、ストアド プロシージャの出力パラメーターとして自動インクリメント値を返し、テーブル内の列にマッピングするか、MsDb2DataAdapterRowUpdated イベントを使用して、データセット内の列を入力できます。

ただし、データセット内の値がデータ ソースの値と同期しなくなり、予期しない動作が発生する可能性があります。 たとえば、CustomerID の自動インクリメント主キー列を持つテーブルがあるとします。 データセット内に 2 人の新しい顧客を追加すると、1 と 2 の CustomerId 値が自動的にインクリメントされます。 2 番目の顧客行が MsDb2DataAdapterUpdate メソッドに渡されると、新しく追加された行は、データセット内の値 2 と一致しない、データ ソースで自動インクリメントされた CustomerID 値 1 を受け取ります。 MsDb2DataAdapterがデータセット内の行に戻り値を入力すると、最初の顧客行の CustomerID が既に 1 であるため、制約違反が発生します。

この動作を回避するには、データ ソースで列を自動インクリメントし、データセット内の列を自動インクリメントする場合は、データセット内に autoIncrementStep が -1、AutoIncrementSeed が 0 の列を作成し、データ ソースで 1 から始まり、正のステップ値で増分する自動インクリメント ID 値が生成されるようにすることをお勧めします。 その結果、データセットは、データ ソースによって生成される正の自動インクリメント値と競合しない自動インクリメント値に対して負の数値を生成します。 もう 1 つのオプションは、列を自動インクリメントするのではなく、 Guid 型の列を使用することです。 Guid値を生成するアルゴリズムは、データ ソースによって生成されるのと同じGuidをデータセットに生成しないでください。

多くの状況では、データセットを通じて行われた変更がデータ ソースに送信される順序が重要です。 たとえば、既存の行の主キー値が更新され、新しい主キー値を持つ新しい行が追加された場合は、挿入の前に更新を処理することが重要です。

DataTable オブジェクトの Select メソッドを使用して、特定のRowStateを持つ行のみを参照するDataRow配列を返すことができます。 その後で、返された DataRow 配列を UpdateMsDb2DataAdapter メソッドに渡して変更行を処理できます。 更新する行のサブセットを指定することで、挿入、更新、および削除の処理順序を制御できます。

こちらもご覧ください

DB2 データベースの DataAdapter と DataSet の操作