Share via


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

更新 : 2007 年 11 月

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

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

4esb49b4.alert_note(ja-jp,VS.90).gifメモ :

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

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

前提条件

このチュートリアルを完了させるには、次の操作が必要です。

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

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

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

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

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

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

    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] ノードをドラッグします。

    4esb49b4.alert_note(ja-jp,VS.90).gifメモ :

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

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

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

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

4esb49b4.alert_note(ja-jp,VS.90).gifメモ :

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

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

  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 でのデータへの接続

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

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

Windows アプリケーションのフォームでのデータの表示

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

データの検証

データの保存