次の方法で共有


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

Note

データセットと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、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. Customers テーブルと Orders テーブルを選択し、 [完了] を選択します。

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

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

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

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

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

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

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

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

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

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

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

    Note

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

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

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

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

Note

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

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

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

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

  1. F5キーを押します。

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

  3. [保存] ボタンを選択します。

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