チュートリアル: .NET Framework アプリケーションでトランザクションにデータを保存する

Note

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

このチュートリアルでは、System.Transactions 名前空間を使用してトランザクションにデータを保存する方法について説明します。 このチュートリアルでは、Windows フォーム アプリケーションを作成します。 データ ソース構成ウィザードを使用して、Northwind サンプル データベースに 2 つのテーブルのデータセットを作成します。 データ バインド コントロールを Windows フォームに追加し、BindingNavigator の [保存] ボタンのコードを変更して、TransactionScope 内のデータベースを更新します。

前提条件

このチュートリアルを完了するには、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 インストーラーで、 .NET デスクトップ開発ワークロードの一部として、または個別のコンポーネントとして、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 フォーム アプリケーションを作成する

最初の手順は、Windows フォーム アプリ (.NET Framework) を作成することです。

  1. Visual Studio の [ファイル] メニューで、 [新規作成]>[プロジェクト] を選択します。

  2. 左側のペインで [Visual C#] または [Visual Basic] を展開し、 [Windows デスクトップ] を選択します。

  3. 中央のペインで、 [Windows フォーム アプリ] プロジェクト タイプを選択します。

  4. プロジェクトに SavingDataInATransactionWalkthrough という名前を付け、 [OK] を選択します。

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

データベースのデータ ソースを作成する

この手順では、データ ソース構成ウィザードを使用して、Northwind サンプル データベースの Customers テーブルと Orders テーブルに基づいてデータ ソースを作成します。

  1. [データ ソース] ウィンドウを開くには、 [データ] メニューで [データ ソースの表示] を選択します。

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

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

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

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

      または

    • [新しい接続] を選択して [接続の追加] または [接続の変更] ダイアログ ボックスを表示し、Northwind データベースへの接続を作成します。

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

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

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

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

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

コントロールをフォームに追加する

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

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

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

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

  3. 対応する [Orders] ノード (メインの [Orders] ノードではなく、 [Fax] 列の下の対応する子テーブル ノード) を CustomersDataGridView の下のフォームにドラッグします。

    DataGridView がフォームに表示されます。 OrdersTableAdapterBindingSource がコンポーネント トレイに表示されます。

System.Transactions アセンブリへの参照を追加する

トランザクションは、System.Transactions 名前空間を使用します。 System.Transactions アセンブリへのプロジェクト参照は既定で追加されないため、手動で追加する必要があります。

System.Transactions の DLL ファイルへの参照を追加するには

  1. [プロジェクト] メニューの [参照の追加] を選択します。

  2. [.NET] タブで System.Transactions を選択し、[OK] を選択します。

    System.Transactions への参照がプロジェクトに追加されます。

BindingNavigator の SaveItem ボタンのコードを変更する

既定では、フォームに最初にドロップされるテーブルのコードは、BindingNavigator の保存ボタンの click イベントに追加されます。 追加テーブルを更新する場合は、手動でコードを追加する必要があります。 このチュートリアルでは、[保存] ボタンのクリック イベント ハンドラーから既存の保存コードをリファクタリングします。 また、行を追加または削除する必要があるかどうかに基づいて、特定の更新機能を提供するためのメソッドもいくつか作成します。

自動生成された保存コードを変更するには

  1. CustomerBindingNavigator[保存] ボタン (フロッピー ディスクのアイコンのボタン) を選択します。

  2. CustomersBindingNavigatorSaveItem_Click メソッドを次のコードで置き換えます。

    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateData();
    }
    
    private void UpdateData()
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
    
        using (System.Transactions.TransactionScope updateTransaction = 
            new System.Transactions.TransactionScope())
        {
            DeleteOrders();
            DeleteCustomers();
            AddNewCustomers();
            AddNewOrders();
    
            updateTransaction.Complete();
            northwindDataSet.AcceptChanges();
        }
    }
    

関連するデータへの変更を解決する順序は次のとおりです。

  • 子レコードを削除します (この場合は、Orders テーブルからレコードを削除します)。

  • 親レコードを削除します (この場合は、Customers テーブルからレコードを削除します)。

  • 親レコードを挿入します (この場合は、Customers テーブルにレコードを挿入します)。

  • 子レコードを挿入します (この場合は、Orders テーブルにレコードを挿入します)。

既存の注文を削除するには

  • 次の DeleteOrders メソッドを Form1 に追加します。

    private void DeleteOrders()
    {
        NorthwindDataSet.OrdersDataTable deletedOrders;
        deletedOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        if (deletedOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(deletedOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteOrders Failed");
            }
        }
    }
    

既存の顧客を削除するには

  • 次の DeleteCustomers メソッドを Form1 に追加します。

    private void DeleteCustomers()
    {
        NorthwindDataSet.CustomersDataTable deletedCustomers;
        deletedCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Deleted);
    
        if (deletedCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(deletedCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteCustomers Failed");
            }
        }
    }
    

新規顧客を追加するには

  • 次の AddNewCustomers メソッドを Form1 に追加します。

    private void AddNewCustomers()
    {
        NorthwindDataSet.CustomersDataTable newCustomers;
        newCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Added);
    
        if (newCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(newCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewCustomers Failed");
            }
        }
    }
    

新規注文を追加するには

  • 次の AddNewOrders メソッドを Form1 に追加します。

    private void AddNewOrders()
    {
        NorthwindDataSet.OrdersDataTable newOrders;
        newOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        if (newOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(newOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewOrders Failed");
            }
        }
    }
    

アプリケーションの実行

F5 キーを押してアプリケーションを実行します。