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

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

Update メソッドの呼び出し

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

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

データセットの更新

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

Note

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

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

Note

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

自動インクリメント列の操作

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

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

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

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

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

参照

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