方法 : TableAdapter を使用してデータを更新する
公開日: 2016年4月
データセット内のデータを変更して検証したら、更新されたデータをデータベースに戻す必要があります。 変更したデータをデータベースに送信するには、TableAdapter の Update
メソッドを呼び出します。 アダプターの Update
メソッドによって単一のデータ テーブルが更新され、正しいコマンド (INSERT、UPDATE、または DELETE) がテーブル内の各データ行の RowState に基づいて実行されます。 関連するテーブルのデータを保存する場合は、Visual Studio によって TableAdapterManager コンポーネントが作成されます。このコンポーネントは、データベースで定義された外部キー制約に基づく適切な順序で保存を実行するときに役立ちます。 詳細については、「階層更新の概要」を参照してください。
注意
データセットの内容でデータ ソースを更新しようとするとエラーが発生する場合があるため、アダプターの Update
メソッドを呼び出すコードは try
/catch
ブロック内に配置する必要があります。
データ ソースを更新する実際の手順はビジネス ニーズによって異なる場合がありますが、アプリケーションでは次の手順に従う必要があります。
try
/catch
ブロック内にあるアダプターのUpdate
メソッドを呼び出します。例外が検出された場合は、エラーを引き起こしたデータ行を探します。 詳細については、「方法 : エラーが発生している行を探す」を参照してください。
データ行の問題を調整し (可能な場合はプログラムで調整し、可能でない場合は修正のためにユーザーに無効な行を表示する)、もう一度更新してみます (HasErrors、GetErrors)。
データベースへのデータの保存
TableAdapter の Update
メソッドを呼び出し、データベースに書き込まれる値を含むデータ テーブルの名前を渡します。
TableAdapter を使用して、データセットが存在するデータベースを更新するには
Update
メソッドをtry
/catch
ブロックで囲みます。try
/catch
ブロック内でNorthwindDataSet
のCustomers
テーブルの内容を更新する方法の例を次に示します。try { this.Validate(); this.customersBindingSource.EndEdit(); this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (System.Exception ex) { MessageBox.Show("Update failed"); }
Try Me.Validate() Me.CustomersBindingSource.EndEdit() Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) MsgBox("Update successful") Catch ex As Exception MsgBox("Update failed") End Try
TableAdapter によるデータセット内の 2 つの関連テーブルの更新
データセットの関連テーブルを更新する場合は、適切な順序で更新し、参照整合性の制約に違反する可能性を小さくする必要があります。 コマンド実行の順序も、データセットの DataRowCollection のインデックスに従います。 データの整合性エラーが発生しないようにするには、最も適切な方法として、次の順序でデータベースを更新します。
子テーブル : レコードを削除する。
親テーブル : レコードを挿入、更新、および削除する。
子テーブル : レコードを挿入および更新する。
注意
複数の関連テーブルを更新する場合、トランザクション内にすべての更新ロジックを含める必要があります。 トランザクションは、変更をコミットする前に、関連するすべての変更を正しくデータベースに反映できることを確認するプロセスです。 詳細については、「トランザクションと同時実行」を参照してください。
TableAdapter を使用した 2 つの関連するテーブルの更新
3 つの一時データ テーブルを作成して異なるレコードを格納します。
try
/catch
ブロックから、それぞれの行サブセットに対するUpdate
メソッドを呼び出します。 更新エラーが起きた場合は、エラーを分岐して解決する必要があります。データベースに変更内容をコミットします。
一時データ テーブルを破棄し、リソースを解放します。
関連テーブルを含むデータセットによってデータ ソースを更新する方法を次の例に示します。
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(); } } }
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
参照
TableAdapter の概要
データに関するチュートリアル
Visual Studio でのデータへの Windows フォーム コントロールのバインド
Visual Studio でのデータへの接続
アプリケーションでデータを受け取る準備
アプリケーションへのデータのフェッチ
Visual Studio でのデータへのコントロールのバインド
アプリケーションでのデータ編集
データの検証
データの保存