次の方法で共有


.NET Framework アプリケーションのデータベース (複数のテーブル) にデータを保存する

DataSet クラスと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初頭のレガシ .NET Framework テクノロジです。 このテクノロジは、ユーザーがデータを変更し、変更をデータベースに保持できるアプリに特に役立ちます。 データセットは実証済みの成功したテクノロジですが、新しい .NET アプリケーションには Entity Framework Core を使用することをお勧めします。 Entity Framework は、オブジェクト モデルとして表形式データを操作するより自然な方法を提供し、よりシンプルなプログラミング インターフェイスを備えています。

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

TableAdapter の Update メソッドを呼び出すことで、アプリケーション内のデータをデータベースに保存し直すことができます。 [ データ ソース] ウィンドウからフォームにテーブルをドラッグすると、データを保存するために必要なコードが自動的に追加されます。 フォームに追加されるテーブルを追加するには、このコードを手動で追加する必要があります。 このチュートリアルでは、複数のテーブルから更新を保存するコードを追加する方法について説明します。

このチュートリアルで説明するタスクは次のとおりです。

[前提条件]

このチュートリアルを完了するには、Visual Studio にインストールされている .NET デスクトップ開発ワークロードとデータ ストレージワークロードと処理ワークロードが必要です。 インストールするには、Visual Studio インストーラー を開き、変更したい Visual Studio のバージョンの横にある [変更] (または [その他の >変更])を選択します。 Visual Studio の変更に関するページを参照してください。

このチュートリアルでは、SQL Server Express LocalDB と Northwind サンプル データベースを使用します。

  1. SQL Server Express LocalDB がない場合は、 SQL Server Express のダウンロード ページまたは Visual Studio インストーラーからインストールします。 Visual Studio インストーラーでは、データ ストレージと処理ワークロードの一部として、または個々のコンポーネントとして SQL Server Express LocalDB をインストールできます。

  2. 次の手順に従って Northwind サンプル データベースをインストールします。

    1. Visual Studio で、 SQL Server オブジェクト エクスプローラー ウィンドウを開きます。 (SQL Server オブジェクト エクスプローラーは、Visual Studio インストーラーの データ ストレージと処理 ワークロードの一部としてインストールされます)。 SQL Server ノードを展開します。 LocalDB インスタンスを右クリックし、[ 新しいクエリ] を選択します。

      クエリ エディター ウィンドウが開きます。

    2. Northwind Transact-SQL スクリプトをクリップボードにコピーします。 この T-SQL スクリプトは、Northwind データベースを最初から作成し、データを設定します。

    3. T-SQL スクリプトをクエリ エディターに貼り付け、[ 実行] ボタンを選択します。

      しばらくすると、クエリの実行が完了し、Northwind データベースが作成されます。

Windows フォーム アプリケーションを作成する

C# または Visual Basic 用の新しい Windows フォーム アプリ プロジェクトを作成します。 プロジェクトに UpdateMultipleTablesWalkthrough という名前を付けます

データ ソースの作成

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

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

    [ データ ソース] ウィンドウが開きます。

  2. [ データ ソース ] ウィンドウで、[ 新しいデータ ソースの追加 ] を選択して 、データ ソース構成ウィザードを開始します。

  3. [ データ ソースの種類の選択 ] 画面で、[ データベース] を選択し、[ 次へ] を選択します。

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

    • Northwind サンプル データベースへのデータ接続がドロップダウン リストで使用できる場合は、それを選択します。

      -又は-

    • [ 新しい接続] を選択して、[ 接続の追加/変更 ] ダイアログ ボックスを開きます。

  5. データベースにパスワードが必要な場合は、機密データを含めるオプションを選択し、[ 次へ] を選択します。

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

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

  8. [顧客] テーブルと [注文] テーブル選択し、[完了] を選択します

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

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

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

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

  1. [ データ ソース ] ウィンドウで、[ 顧客 ] ノードを展開します。

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

データ バインド フォームを作成する

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

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

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

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

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

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

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

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

わかりやすくするために、このチュートリアルではトランザクションを使用しません。 ただし、2 つ以上の関連テーブルを更新する場合は、トランザクション内のすべての更新ロジックを含めます。 トランザクションは、変更がコミットされる前に、データベースに関連するすべての変更が成功することを保証するプロセスです。 詳しくは、「トランザクションとコンカレンシー」をご覧ください。

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

  1. BindingNavigator[保存] ボタンを選択します。 これにより、コード エディターが開き、 bindingNavigatorSaveItem_Click イベント ハンドラーが表示されます。

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

    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. データベース内の値を調べて、変更が保存されたことを確認します。