チュートリアル : データベースへのデータの保存 (複数テーブル)

 

公開日: 2016年4月

アプリケーション開発における最も一般的なシナリオの 1 つに、Windows アプリケーションのフォームにデータを表示して編集し、更新したデータをデータベースに返送する操作があります。 このチュートリアルでは、2 つの関連するテーブルのデータを表示するフォームを作成し、レコードを編集して変更内容をデータベースに保存する方法を示します。 この例では、Northwind サンプル データベースの Customers テーブルと Orders テーブルを使用します。

アプリケーション内のデータをデータベースに保存するには、TableAdapter の Update メソッドを呼び出します。 項目を [データ ソース] ウィンドウからドラッグすると、データを保存するコードが、フォームにドラッグされた最初のテーブルに自動的に追加されます。 さらに別のテーブルをフォームに追加した場合は、データ保存用のコードを手動で追加する必要があります。 ここでは、複数のテーブルから更新を保存するコードを追加する手順を示します。

注意

実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。 設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「Customizing Development Settings in Visual Studio」を参照してください。

このチュートリアルでは、以下のタスクを行います。

必須コンポーネント

このチュートリアルを完了するための要件は次のとおりです。

Windows アプリケーションの作成

最初に Windows アプリケーションを作成します。 この手順ではプロジェクトへの名前の割り当てはオプションですが、後でこのプロジェクトを保存するため、プロジェクトに名前を付けます。

新しい Windows アプリケーション プロジェクトを作成するには

  1. [ファイル] メニューで新しいプロジェクトを作成します。

  2. プロジェクトに UpdateMultipleTablesWalkthrough という名前を付けます。

  3. [Windows アプリケーション] をクリックし、[OK] をクリックします。 詳細については、「クライアント アプリケーション」を参照してください。

    UpdateMultipleTablesWalkthrough プロジェクトが作成されてソリューション エクスプローラーに追加されます。

データ ソースの作成

この手順では、データ ソース構成ウィザードを使用して、Northwind データベースからデータ ソースを作成します。 接続を作成するには、Northwind サンプル データベースへのアクセス権を持っている必要があります。 Northwind サンプル データベースのセットアップの詳細については、「方法 : サンプル データベースをインストールする」を参照してください。

データ ソースを作成するには

  1. [データ] メニューの [データ ソースの表示] をクリックします。

  2. [データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。

  3. [データソースの種類を選択] ページで、[データベース] をクリックし、[次へ] をクリックします。

  4. [データ接続の選択] ページで、次のいずれかの操作を行います。

    • Northwind サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は選択します。

      または

    • [新しい接続] を選択して [接続の追加] または [接続の変更] ダイアログ ボックスを表示します。

  5. データベースにパスワードが必要な場合は、該当するオプションを選択して重要情報を含め、[次へ] をクリックします。

  6. [アプリケーション構成ファイルに接続文字列を保存] ページで、[次へ] をクリックします。

  7. [データベース オブジェクトの選択] ページの [テーブル] ノードを展開します。

  8. Customers テーブルと Orders テーブルを選択し、[完了] をクリックします。

    プロジェクトに NorthwindDataSet が追加され、[データ ソース] ウィンドウにテーブルが表示されます。

作成するコントロールの設定

このチュートリアルでは、データが個別のコントロールに表示される詳細レイアウトで、Customers テーブル内のデータを表示します。 Orders テーブルのデータは、DataGridView コントロール内に表示される グリッド レイアウトで表示します。

[データ ソース] ウィンドウの項目のドロップ タイプを設定するには

  1. [データ ソース] ウィンドウの [Customers] ノードを展開します。

  2. [Customers] ノードのコントロール リストの [詳細] を選択し、Customers テーブルのコントロールを個別のコントロールに変更します。 詳細については、「[データ ソース] ウィンドウからドラッグしたときに作成されるコントロールを設定する」を参照してください。

データ バインド フォームの作成

[データ ソース] ウィンドウからフォームに項目をドラッグして、データ バインド コントロールを作成します。

フォームにデータ バインド コントロールを作成するには

  1. [データ ソース] ウィンドウから Form1 にメインの [Customers] ノードをドラッグします。

    説明のラベルが付いたデータ バインド コントロールとレコード間を移動するためのツール ストリップ (BindingNavigator) がフォームに表示されます。 NorthwindDataSetCustomersTableAdapterBindingSource、および BindingNavigator がコンポーネント トレイに表示されます。

  2. [データ ソース] ウィンドウから Form1[Orders] ノードをドラッグします。

    注意

    関連する [Orders] ノードは [Fax] 列の下にあり、[Customers] ノードの子ノードです。

    レコード間をナビゲートするための DataGridView コントロールとツール ストリップ (BindingNavigator) がフォームに表示されます。 コンポーネント トレイに OrdersTableAdapterBindingSource が表示されます。

データベースを更新するコードの追加

Customers TableAdapter および Orders TableAdapter の Update メソッドを呼び出して、データベースを更新できます。 既定では、BindingNavigator[データの保存] ボタンのイベント ハンドラーが、データベースへの更新を送信するフォームのコードに追加されます。 この手順では、正しい順序で更新を送信し、参照整合性エラーが発生する可能性がなくなるようにコードを変更します。 また、Update 呼び出しを try-catch ブロックにラップして、エラー処理も実装します。 アプリケーションの要件に適合するようにコードを変更できます。

注意

説明をわかりやすくするために、ここではトランザクションを使用していませんが、関連する複数のテーブルを更新する場合は、すべての更新ロジックを 1 つのトランザクションに含める必要があります。 トランザクションは、データベースに対するすべての関連する変更が正常に完了した後に、変更をコミットするプロセスです。 詳細については、「トランザクションと同時実行」を参照してください。

アプリケーションに更新ロジックを追加するには

  1. BindingNavigator[データの保存] ボタンをダブルクリックして、コード エディターで bindingNavigatorSaveItem_Click イベント ハンドラーを開きます。

  2. イベント ハンドラーのコードを、関連する TableAdapter の Update メソッドを呼び出すコードに置き換えます。 次のコードは、最初に、各 DataRowState (DeletedAdded、および Modified) の更新済み情報を保持する 3 つの一時的なデータ テーブルを作成します。 次に、正しい順序で更新を実行します。 コードは、次のようになります。

                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();
                    }
                }
    
            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
    

アプリケーションのテスト

アプリケーションをテストするには

  1. F5 キーを押します。

  2. 各テーブルの 1 つ以上のレコードのデータを変更します。

  3. [データの保存] をクリックします。

  4. データベースの値をチェックし、変更が保存されたことを確認します。

次の手順

Windows アプリケーションにデータ バインド フォームを作成した後で、アプリケーションの要件によってはさらに操作を追加する必要があります。 このチュートリアルで行うことができる拡張には次のものがあります。

参照

データに関するチュートリアル
Visual Studio でのデータへの Windows フォーム コントロールのバインド
Visual Studio のデータ アプリケーションの概要
Visual Studio でのデータへの接続
アプリケーションでデータを受け取る準備
アプリケーションへのデータのフェッチ
Visual Studio でのデータへのコントロールのバインド
アプリケーションでのデータ編集
データの検証
データの保存