データ アダプターとデータセットを使用した DB2 データベースの更新
の メソッドMsDb2DataAdapter
はUpdate
、データセットからデータ ソースへの変更を解決するために呼び出されます。 メソッドは Update
、 メソッドと同様に Fill
、 のインスタンス DataSet
と省略可能 DataTable
なオブジェクトまたは DataTable
名前を引数として受け取ります。 インスタンスは DataSet
、 DataSet
行われた変更を含むオブジェクトであり、オブジェクトは変更の 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
行の主キー値と一致するデータセット内の行に主キー値が見つかった場合、メソッドは、 によってSelectCommand
SelectCommand
返された行の情報を使用して既存の行を更新し、既存の行の プロパティを にUnchanged
設定RowState
します。 によってSelectCommand
返される行に、データセット内の行の主キー値と一致しない主キー値がある場合、 Fill
メソッドは、 のUnchanged
新しい行をRowState
追加します。
Note
OUTER JOIN の結果を返す場合SelectCommand
、オブジェクトは結果DataTable
のDataAdapter
オブジェクトの 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
使用して、特定RowState
の DataTable
を持つ行のみを参照する配列を返DataRow
すことができます。 その後で、返された DataRow
配列を Update
の MsDb2DataAdapter
メソッドに渡して変更行を処理できます。 更新する行のサブセットを指定することで、挿入、更新、および削除の処理順序を制御できます。