チュートリアル : データベースへのデータの保存 (複数テーブル)
アプリケーション開発における最も一般的なシナリオの 1 つに、Windows アプリケーションのフォームにデータを表示して編集し、更新したデータをデータベースに返送する操作があります。このチュートリアルでは、2 つの関連するテーブルのデータを表示するフォームを作成し、レコードを編集して変更内容をデータベースに保存する方法を示します。この例では、Northwind サンプル データベースの Customers テーブルと Orders テーブルを使用します。
アプリケーション内のデータをデータベースに保存するには、TableAdapter の Update メソッドを呼び出します。項目を [データ ソース] ウィンドウからドラッグすると、データを保存するコードが、フォームにドラッグされた最初のテーブルに自動的に追加されます。さらに別のテーブルをフォームに追加した場合は、データ保存用のコードを手動で追加する必要があります。ここでは、複数のテーブルから更新を保存するコードを追加する手順を示します。
[!メモ]
実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。
このチュートリアルでは、以下のタスクを行います。
新しい Windows アプリケーション プロジェクトを作成します。
データ ソース構成ウィザードを使用して、アプリケーションにデータ ソースを作成して構成します。
[データ ソース] ウィンドウで、項目のコントロールを設定します。詳細については、「方法 : [データ ソース] ウィンドウからドラッグしたときに作成されるコントロールを設定する」を参照してください。
[データ ソース] ウィンドウからフォームに項目をドラッグして、データ バインド コントロールを作成します。
データセットの各テーブルのいくつかのレコードを変更します。
データセット内の更新されたデータをデータベースに返送するコードを変更します。
必須コンポーネント
このチュートリアルを完了するための要件は次のとおりです。
- Northwind サンプル データベースにアクセスします。詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
Windows アプリケーションの作成
最初に Windows アプリケーションを作成します。この手順ではプロジェクトへの名前の割り当てはオプションですが、後でこのプロジェクトを保存するため、プロジェクトに名前を付けます。
新しい Windows アプリケーション プロジェクトを作成するには
[ファイル] メニューで新しいプロジェクトを作成します。
プロジェクトに UpdateMultipleTablesWalkthrough という名前を付けます。
[Windows アプリケーション] をクリックし、[OK] をクリックします。詳細については、「クライアント アプリケーションの開発」を参照してください。
UpdateMultipleTablesWalkthrough プロジェクトが作成されてソリューション エクスプローラーに追加されます。
データ ソースの作成
この手順では、データ ソース構成ウィザードを使用して、Northwind データベースからデータ ソースを作成します。接続を作成するには、Northwind サンプル データベースにアクセスできる必要があります。Northwind サンプル データベースのセットアップの詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
データ ソースを作成するには
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。
[データソースの種類を選択] ページで、[データベース] をクリックし、[次へ] をクリックします。
[データ接続の選択] ページで、次のいずれかの操作を行います。
Northwind サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は選択します。
または
[新しい接続] を選択して [接続の追加] または [接続の変更] ダイアログ ボックスを表示します。詳細については、「[接続の追加] ダイアログ ボックスと [接続の変更] ダイアログ ボックス (一般)」を参照してください。
データベースにパスワードが必要な場合は、該当するオプションを選択して重要情報を含め、[次へ] をクリックします。
[アプリケーション構成ファイルに接続文字列を保存] ページで、[次へ] をクリックします。
[データベース オブジェクトの選択] ページの [テーブル] ノードを展開します。
Customers テーブルと Orders テーブルを選択し、[完了] をクリックします。
プロジェクトに NorthwindDataSet が追加され、[データ ソース] ウィンドウにテーブルが表示されます。
作成するコントロールの設定
このチュートリアルでは、データが個別のコントロールに表示される詳細レイアウトで、Customers テーブル内のデータを表示します。Orders テーブルのデータは、DataGridView コントロール内に表示される グリッド レイアウトで表示します。
[データ ソース] ウィンドウの項目のドロップ タイプを設定するには
[データ ソース] ウィンドウの [Customers] ノードを展開します。
[Customers] ノードのコントロール リストの [詳細] を選択し、Customers テーブルのコントロールを個別のコントロールに変更します。詳細については、「方法 : [データ ソース] ウィンドウからドラッグしたときに作成されるコントロールを設定する」を参照してください。
データ バインド フォームの作成
[データ ソース] ウィンドウからフォームに項目をドラッグして、データ バインディング コントロールを作成します。
フォームにデータ バインディング コントロールを作成するには
[データ ソース] ウィンドウから Form1 にメインの [Customers] ノードをドラッグします。
説明のラベルが付いたデータ バインド コントロールとレコード間を移動するためのツール ストリップ (BindingNavigator) がフォームに表示されます。NorthwindDataSet、CustomersTableAdapter、BindingSource、および BindingNavigator がコンポーネント トレイに表示されます。
[データ ソース] ウィンドウから Form1 に [Orders] ノードをドラッグします。
[!メモ]
関連する [Orders] ノードは [Fax] 列の下にあり、[Customers] ノードの子ノードです。
レコード間をナビゲートするための DataGridView コントロールとツール ストリップ (BindingNavigator) がフォームに表示されます。コンポーネント トレイに OrdersTableAdapter と BindingSource が表示されます。
データベースを更新するコードの追加
Customers TableAdapter および Orders TableAdapter の Update メソッドを呼び出して、データベースを更新できます。既定では、BindingNavigator の [データの保存] ボタンのイベント ハンドラーが、データベースに更新を送信するフォームのコードに追加されます。この手順では、正しい順序で更新を送信し、参照整合性エラーが発生する可能性がなくなるようにコードを変更します。また、Update 呼び出しを try-catch ブロックにラップして、エラー処理も実装します。アプリケーションの要件に適合するようにコードを変更できます。
[!メモ]
説明をわかりやすくするために、ここではトランザクションを使用していませんが、関連する複数のテーブルを更新する場合は、すべての更新ロジックを 1 つのトランザクションに含める必要があります。トランザクションは、変更をコミットする前に、関連するすべての変更を正しくデータベースに反映できることを確認するプロセスです。詳細については、「Performing Transactions」を参照してください。
アプリケーションに更新ロジックを追加するには
BindingNavigator の [データの保存] ボタンをダブルクリックして、コード エディターで bindingNavigatorSaveItem_Click イベント ハンドラーを開きます。
イベント ハンドラーのコードを、関連する TableAdapter の Update メソッドを呼び出すコードに置き換えます。次のコードは、最初に、各 DataRowState (Deleted、Added、および Modified) の更新済み情報を保持する 3 つの一時的なデータ テーブルを作成します。次に、正しい順序で更新を実行します。コードは、次のようになります。
Me.Validate() Me.OrdersBindingSource.EndEdit() Me.CustomersBindingSource.EndEdit() Dim deletedOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) Dim newOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) Dim modifiedOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable) Try ' Remove all deleted orders from the Orders table. If Not deletedOrders Is Nothing Then OrdersTableAdapter.Update(deletedOrders) End If ' Update the Customers table. CustomersTableAdapter.Update(NorthwindDataSet.Customers) ' Add new orders to the Orders table. If Not newOrders Is Nothing Then OrdersTableAdapter.Update(newOrders) End If ' Update all modified Orders. If Not modifiedOrders Is Nothing Then OrdersTableAdapter.Update(modifiedOrders) End If NorthwindDataSet.AcceptChanges() Catch ex As Exception MsgBox("Update failed") Finally If Not deletedOrders Is Nothing Then deletedOrders.Dispose() End If If Not newOrders Is Nothing Then newOrders.Dispose() End If If Not modifiedOrders Is Nothing Then modifiedOrders.Dispose() End If End Try
this.Validate(); this.ordersBindingSource.EndEdit(); this.customersBindingSource.EndEdit(); NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Deleted); NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Added); NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Modified); try { // Remove all deleted orders from the Orders table. if (deletedOrders != null) { ordersTableAdapter.Update(deletedOrders); } // Update the Customers table. customersTableAdapter.Update(northwindDataSet.Customers); // Add new orders to the Orders table. if (newOrders != null) { ordersTableAdapter.Update(newOrders); } // Update all modified Orders. if (modifiedOrders != null) { ordersTableAdapter.Update(modifiedOrders); } northwindDataSet.AcceptChanges(); } catch (System.Exception ex) { MessageBox.Show("Update failed"); } finally { if (deletedOrders != null) { deletedOrders.Dispose(); } if (newOrders != null) { newOrders.Dispose(); } if (modifiedOrders != null) { modifiedOrders.Dispose(); } }
アプリケーションのテスト
アプリケーションをテストするには
F5 キーを押します。
各テーブルの 1 つ以上のレコードのデータを変更します。
[データの保存] をクリックします。
データベースの値をチェックし、変更が保存されたことを確認します。
次の手順
Windows アプリケーションにデータ バインド フォームを作成した後で、アプリケーションの要件によってはさらに操作を追加する必要があります。このチュートリアルで行うことができる拡張には次のものがあります。
フォームに検索機能を追加できます。詳細については、「方法: パラメーター クエリを Windows フォーム アプリケーションに追加する」を参照してください。
データ ソースを編集し、データベース オブジェクトの追加または削除を行います。詳細については、「方法 : データセットを編集する」を参照してください。
参照
概念
Visual Studio 2012 のデータ アプリケーション開発に関する新機能
Visual Studio でのデータへの Windows フォーム コントロールのバインド
Visual Studio でのデータへのコントロールのバインド