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

更新 : 2007 年 11 月

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

前提条件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        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
    
    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 テーブルにレコードを挿入します。

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

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

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

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

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

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

新規顧客を追加するには

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

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

新規注文を追加するには

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

    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
    
    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 キーを押してアプリケーションを実行します。

参照

処理手順

方法 : トランザクションを使用してデータを保存する

概念

Oracle 分散トランザクション

SQL Server と System.Transactions の統合 (ADO.NET)

その他の技術情報

トランザクションと同時実行 (ADO.NET)

Visual Studio でのデータへの接続

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

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

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

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

データの検証

データの保存