方法 : TableAdapter を使用してデータを更新する
更新 : 2007 年 11 月
データセットのデータを変更して検証した後は、通常、更新したデータをデータベースに返送します。変更したデータをデータベースに送信するには、TableAdapter の Update メソッドを呼び出します。アダプタの Update メソッドによって単一のデータ テーブルが更新され、正しいコマンド (INSERT、UPDATE、または DELETE) がテーブル内の各データ行の RowState に基づいて実行されます。関連テーブルのデータを保存する場合は、Visual Studio 2008 によって新しい TableAdapterManager コンポーネントが作成されます。このコンポーネントは、データベースで定義された外部キー制約に基づく適切な順序で保存を実行するときに役立ちます。詳細については、「階層更新の概要」を参照してください。
メモ : |
---|
データセットの内容でデータ ソースを更新しようとするとエラーが発生する場合があるため、アダプタの Update メソッドを呼び出すコードは try/catch ブロック内に配置する必要があります。 |
データ ソースを更新する実際の手順はビジネス ニーズによって異なる場合がありますが、アプリケーションでは次の手順に従う必要があります。
try/catch ブロック内にあるアダプタの Update メソッドを呼び出します。
例外が検出された場合は、エラーを引き起こしたデータ行を探します。詳細については、「方法 : エラーが発生している行を探す」を参照してください。
データ行の問題を調整し (可能な場合はプログラムで調整し、可能でない場合は修正のためにユーザーに無効な行を表示する)、もう一度更新してみます (HasErrors、GetErrors)。
データベースへのデータの保存
TableAdapter の Update メソッドを呼び出し、データベースに書き込まれる値を含むデータ テーブルの名前を渡します。
TableAdapter を使用して、データセットが存在するデータベースを更新するには
Update メソッドを try/catch ブロックで囲みます。try/catch ブロック内で NorthwindDataSet の Customers テーブルの内容を更新する方法の例を次に示します。
Try Me.Validate() Me.CustomersBindingSource.EndEdit() Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) MsgBox("Update successful") Catch ex As Exception MsgBox("Update failed") End Try
try { this.Validate(); this.customersBindingSource.EndEdit(); this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (System.Exception ex) { MessageBox.Show("Update failed"); }
TableAdapter によるデータセット内の 2 つの関連テーブルの更新
データセットの関連テーブルを更新する場合は、適切な順序で更新し、参照整合性の制約に違反する可能性を小さくする必要があります。コマンド実行の順序も、データセットの DataRowCollection のインデックスに従います。データの整合性エラーが発生しないようにするには、最も適切な方法として、次の順序でデータベースを更新します。
子テーブル : レコードを削除する。
親テーブル : レコードを挿入、更新、および削除する。
子テーブル : レコードを挿入および更新する。
メモ : 複数の関連テーブルを更新する場合、トランザクション内にすべての更新ロジックを含める必要があります。トランザクションは、変更をコミットする前に、関連するすべての変更を正しくデータベースに反映できることを確認するプロセスです。詳細については、「トランザクションと同時実行 (ADO.NET)」を参照してください。
TableAdapter を使用して 2 つの関連テーブルを更新するには
3 つの一時データ テーブルを作成して異なるレコードを格納します。
try/catch ブロックから、それぞれの行サブセットに対する Update メソッドを呼び出します。更新エラーが起きた場合は、エラーを分岐して解決する必要があります。
データベースに変更内容をコミットします。
一時データ テーブルを破棄し、リソースを解放します。
関連テーブルを含むデータセットによってデータ ソースを更新する方法を次の例に示します。
Private Sub UpdateDB() Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable = _ CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) Dim newChildRecords As NorthwindDataSet.OrdersDataTable = _ CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable = _ CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable) Try If deletedChildRecords IsNot Nothing Then OrdersTableAdapter.Update(deletedChildRecords) End If CustomersTableAdapter.Update(NorthwindDataSet.Customers) If newChildRecords IsNot Nothing Then OrdersTableAdapter.Update(newChildRecords) End If If modifiedChildRecords IsNot Nothing Then OrdersTableAdapter.Update(modifiedChildRecords) End If NorthwindDataSet.AcceptChanges() Catch ex As Exception MessageBox.Show("An error occurred during the update process") ' Add code to handle error here. Finally If deletedChildRecords IsNot Nothing Then deletedChildRecords.Dispose() End If If newChildRecords IsNot Nothing Then newChildRecords.Dispose() End If If modifiedChildRecords IsNot Nothing Then modifiedChildRecords.Dispose() End If End Try End Sub
void UpdateDB() { NorthwindDataSet.OrdersDataTable deletedChildRecords = (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted); NorthwindDataSet.OrdersDataTable newChildRecords = (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added); NorthwindDataSet.OrdersDataTable modifiedChildRecords = (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified); try { if (deletedChildRecords != null) { ordersTableAdapter.Update(deletedChildRecords); } customersTableAdapter.Update(northwindDataSet.Customers); if (newChildRecords != null) { ordersTableAdapter.Update(newChildRecords); } if (modifiedChildRecords != null) { ordersTableAdapter.Update(modifiedChildRecords); } northwindDataSet.AcceptChanges(); } catch (Exception ex) { MessageBox.Show("An error occurred during the update process"); // Add code to handle error here. } finally { if (deletedChildRecords != null) { deletedChildRecords.Dispose(); } if (newChildRecords != null) { newChildRecords.Dispose(); } if (modifiedChildRecords != null) { modifiedChildRecords.Dispose(); } } }