Share via


チュートリアル : トランザクションのデータの保存

 

公開日: 2016年4月

このチュートリアルでは、System.Transactions 名前空間を使用してトランザクションのデータを保存する方法について説明します。 この例では、Northwind サンプル データベースの Customers テーブルと Orders テーブルを使用します。

必須コンポーネント

このチュートリアルでは、Northwind サンプル データベースへのアクセスが必要です。 Northwind サンプル データベースのセットアップの詳細については、「方法 : サンプル データベースをインストールする」を参照してください。

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

最初に Windows アプリケーションを作成します。

新しい Windows プロジェクトを作成するには

  1. Visual Studio の [ファイル] メニューの [新しいプロジェクト] をクリックします。

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

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

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

データベースのデータ ソースの作成

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

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

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

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

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

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

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

      または

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

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

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

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

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

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

フォームへのコントロールの追加

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

Windows フォームにデータ バインド コントロールを作成するには

  • [データ ソース] ウィンドウの [Customers] ノードを展開します。

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

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

  • 対応する [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 イベントに追加されます。 追加テーブルを更新する場合は、手動でコードを追加する必要があります。 このチュートリアルでは、保存ボタンの click イベント ハンドラーから既存の保存コードをリファクタリングし、行を追加するか削除するかに応じて、指定された更新機能を提供するメソッドを作成します。

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

  1. CustomersBindingNavigator[保存] (フロッピー ディスクのアイコンのボタン) をダブルクリックします。

  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();
                }
            }
    
        Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click
            UpdateData()
        End Sub
    
        Private Sub UpdateData()
            Me.Validate()
            Me.CustomersBindingSource.EndEdit()
            Me.OrdersBindingSource.EndEdit()
    
            Using updateTransaction As New Transactions.TransactionScope
    
                DeleteOrders()
                DeleteCustomers()
                AddNewCustomers()
                AddNewOrders()
    
                updateTransaction.Complete()
                NorthwindDataSet.AcceptChanges()
            End Using
        End Sub
    

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

  • 子レコードを削除します (この場合は、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");
                    }
                }
            }
    
        Private Sub DeleteOrders()
    
            Dim deletedOrders As NorthwindDataSet.OrdersDataTable
            deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted),
                NorthwindDataSet.OrdersDataTable)
    
            If Not IsNothing(deletedOrders) Then
                Try
                    OrdersTableAdapter.Update(deletedOrders)
    
                Catch ex As Exception
                    MessageBox.Show("DeleteOrders Failed")
                End Try
            End If
        End Sub
    

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

  • 次の 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");
                    }
                }
            }
    
        Private Sub DeleteCustomers()
    
            Dim deletedCustomers As NorthwindDataSet.CustomersDataTable
            deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted),
                NorthwindDataSet.CustomersDataTable)
    
            If Not IsNothing(deletedCustomers) Then
                Try
                    CustomersTableAdapter.Update(deletedCustomers)
    
                Catch ex As Exception
                    MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message)
                End Try
            End If
        End Sub
    

新規顧客を追加するには

  • 次の 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");
                    }
                }
            }
    
        Private Sub AddNewCustomers()
    
            Dim newCustomers As NorthwindDataSet.CustomersDataTable
            newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added),
                NorthwindDataSet.CustomersDataTable)
    
            If Not IsNothing(newCustomers) Then
                Try
                    CustomersTableAdapter.Update(newCustomers)
    
                Catch ex As Exception
                    MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message)
                End Try
            End If
        End Sub
    

新規注文を追加するには

  • 次の 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");
                    }
                }
            }
    
        Private Sub AddNewOrders()
    
            Dim newOrders As NorthwindDataSet.OrdersDataTable
            newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added),
                NorthwindDataSet.OrdersDataTable)
    
            If Not IsNothing(newOrders) Then
                Try
                    OrdersTableAdapter.Update(newOrders)
    
                Catch ex As Exception
                    MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message)
                End Try
            End If
        End Sub
    

アプリケーションの実行

アプリケーションを実行するには

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

参照

トランザクションと同時実行
Oracle 分散トランザクション
方法 : トランザクションを使用してデータを保存する
SQL Server と System.Transactions の統合
Visual Studio でのデータへの接続
アプリケーションでデータを受け取る準備
アプリケーションへのデータのフェッチ
Visual Studio でのデータへのコントロールのバインド
アプリケーションでのデータ編集
データの検証
データの保存