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

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

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

[!メモ]

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

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

必須コンポーネント

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

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

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

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

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

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

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

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

データ ソースの作成

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

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

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

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

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

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

  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 つのトランザクションに含める必要があります。トランザクションは、変更をコミットする前に、関連するすべての変更を正しくデータベースに反映できることを確認するプロセスです。詳細については、「Performing Transactions」を参照してください。

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

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

  2. イベント ハンドラーのコードを、関連する TableAdapter の Update メソッドを呼び出すコードに置き換えます。次のコードは、最初に、各 DataRowState (DeletedAdded、および 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();
        }
    }
    

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

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

  1. F5 キーを押します。

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

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

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

次の手順

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

参照

概念

Visual Studio 2012 のデータ アプリケーション開発に関する新機能

Visual Studio でのデータへの Windows フォーム コントロールのバインド

アプリケーションでデータを受け取る準備

アプリケーションへのデータのフェッチ

Visual Studio でのデータへのコントロールのバインド

アプリケーションでのデータ編集

データの検証

データの保存

その他の技術情報

データに関するチュートリアル

Visual Studio のデータ アプリケーションの概要

Visual Studio でのデータへの接続