データセットからデータ ソースへの変更を解決するために、MsDb2DataAdapter
の Update
メソッドが呼び出されます。
Fill
メソッドと同様に、Update
メソッドは、引数としてDataSet
のインスタンスと、オプションのDataTable
オブジェクトまたはDataTable
名を受け取ります。
DataSet
インスタンスは、加えられた変更を含むDataSet
オブジェクトであり、DataTable
オブジェクトは変更の取得元のテーブルを識別します。
Update メソッドの呼び出し
Update
メソッドを呼び出すと、MsDb2DataAdapter
行われた変更が分析され、適切なコマンド (INSERT、UPDATE、または DELETE) が実行されます。
MsDb2DataAdapter
は、データ行の変更を検出すると、InsertCommand
、UpdateCommand
、またはDeleteCommand
を使用して変更を処理します。 これにより、デザイン時にコマンド構文を指定し、可能な場合はストアド プロシージャを使用して、ADO.NET アプリケーションのパフォーマンスを最大化できます。 コマンドは Update
を呼び出す前に明示的に設定する必要があります。
Update
が呼び出され、特定の更新に対して適切なコマンドが存在しない場合 (削除された行のDeleteCommand
がない場合など)、例外がスローされます。 コマンド パラメーターを使用して、データセット内の変更された行ごとに SQL ステートメントまたはストアド プロシージャの入力値と出力値を指定できます。
DataTable
オブジェクトが 1 つのデータベース テーブルにマップまたは生成される場合は、MsDb2CommandBuilder
オブジェクトを利用して、MsDb2DataAdapter
オブジェクトのDeleteCommand
、InsertCommand
、およびUpdateCommand
プロパティを自動的に生成できます。
データセットの更新
Update
メソッドは変更をデータ ソースに解決しますが、データセットを最後に入力した後、他のクライアントがデータ ソースでデータを変更している可能性があります。 現在のデータでデータセットを更新するには、 MsDb2DataAdapter
メソッドと Fill
メソッドを使用します。 テーブルに新しい行が追加され、更新された情報が既存の行に組み込まれます。
Fill
メソッドは、データセット内の行の主キー値と、SelectCommand
によって返される行を調べることで、新しい行を追加するか、既存の行を更新するかを決定します。
Fill
メソッドは、SelectCommand
によって返された結果の行の主キー値と一致するデータセット内の行の主キー値を検出した場合、SelectCommand
によって返された行の情報を使用して既存の行を更新し、既存の行のRowState
プロパティをUnchanged
に設定します。
SelectCommand
によって返された行に、データセット内の行の主キー値と一致しない主キー値がある場合、Fill
メソッドは、Unchanged
のRowState
を持つ新しい行を追加します。
注
DataTable
が OUTER JOIN の結果を返す場合、DataAdapter
オブジェクトは結果のDataTable
オブジェクトの PrimaryKey 値を設定しません。 重複する行が正しく解決されるように、PrimaryKey を自分で定義する必要があります。
Update
メソッドを呼び出すときに発生する可能性がある例外を処理するには、RowUpdated
イベントを使用して行の更新エラーが発生したときに応答するか、Update
を呼び出す前にDataAdapter.ContinueUpdateOnError
をtrue
に設定し、更新が完了したときに特定の行のRowError
プロパティに格納されているエラー情報に応答することができます。
注
DataSet
、DataTable
、またはDataRow
オブジェクトでAcceptChanges
を呼び出すと、データ行のすべての元の値がデータ行の現在の値で上書きされます。 行を一意として識別するフィールド値が変更された場合、 AcceptChanges
を呼び出した後、元の値はデータ ソースの値と一致しなくなります。
オートインクリメント列の扱い
データ ソースのテーブルに自動インクリメント列がある場合は、ストアド プロシージャの出力パラメーターとして自動インクリメント値を返し、テーブル内の列にマッピングするか、MsDb2DataAdapter
のRowUpdated
イベントを使用して、データセット内の列を入力できます。
ただし、データセット内の値がデータ ソースの値と同期しなくなり、予期しない動作が発生する可能性があります。 たとえば、CustomerID の自動インクリメント主キー列を持つテーブルがあるとします。 データセット内に 2 人の新しい顧客を追加すると、1 と 2 の CustomerId 値が自動的にインクリメントされます。 2 番目の顧客行が MsDb2DataAdapter
の Update
メソッドに渡されると、新しく追加された行は、データセット内の値 2 と一致しない、データ ソースで自動インクリメントされた CustomerID 値 1 を受け取ります。
MsDb2DataAdapter
がデータセット内の行に戻り値を入力すると、最初の顧客行の CustomerID が既に 1 であるため、制約違反が発生します。
この動作を回避するには、データ ソースで列を自動インクリメントし、データセット内の列を自動インクリメントする場合は、データセット内に autoIncrementStep が -1、AutoIncrementSeed が 0 の列を作成し、データ ソースで 1 から始まり、正のステップ値で増分する自動インクリメント ID 値が生成されるようにすることをお勧めします。 その結果、データセットは、データ ソースによって生成される正の自動インクリメント値と競合しない自動インクリメント値に対して負の数値を生成します。 もう 1 つのオプションは、列を自動インクリメントするのではなく、 Guid
型の列を使用することです。
Guid
値を生成するアルゴリズムは、データ ソースによって生成されるのと同じGuid
をデータセットに生成しないでください。
多くの状況では、データセットを通じて行われた変更がデータ ソースに送信される順序が重要です。 たとえば、既存の行の主キー値が更新され、新しい主キー値を持つ新しい行が追加された場合は、挿入の前に更新を処理することが重要です。
DataTable
オブジェクトの Select
メソッドを使用して、特定のRowState
を持つ行のみを参照するDataRow
配列を返すことができます。 その後で、返された DataRow
配列を Update
の MsDb2DataAdapter
メソッドに渡して変更行を処理できます。 更新する行のサブセットを指定することで、挿入、更新、および削除の処理順序を制御できます。