共用方式為


逐步解說:在交易中儲存資料

這個逐步解說將示範如何使用 System.Transactions 命名空間 (Namespace),在交易中儲存資料。這個範例會使用 Northwind 範例資料庫的 Customers 和 Orders 資料表。

必要條件

這個逐步解說會需要存取 Northwind 範例資料庫。如需設定 Northwind 範例資料庫的詳細資訊,請參閱 HOW TO:安裝範例資料庫

建立 Windows 應用程式

第一個步驟是建立 [Windows 應用程式]。

若要建立新的 Windows 專案

  1. 在 Visual Studio 中,從 [檔案] 功能表建立新的 [專案]。

  2. 將專案命名為 SavingDataInATransactionWalkthrough。

  3. 選取 [Windows 應用程式],並按一下 [確定]。如需詳細資訊,請參閱開發用戶端應用程式

    [SavingDataInATransactionWalkthrough] 專案隨即建立並加入至 [方案總管]。

建立資料庫的資料來源

這個步驟會使用資料來源組態精靈,根據 Northwind 範例資料庫的 Customers 和 Orders 資料表來建立資料來源。

若要建立資料來源

  1. 按一下 [資料] 功能表上的 [顯示資料來源]。

  2. 在 [資料來源] 視窗中,選取 [加入新資料來源],以啟動 [資料來源組態精靈]。

  3. 請選取 [選擇資料來源類型] 頁面上的 [資料庫],再按 [下一步]。

  4. 在 [選擇資料連接] 頁面上,執行下列其中一項動作:

    • 如果下拉式清單中有提供 Northwind 範例資料庫的資料連接,請選取這個資料連接。

      -或-

    • 選取 [新增連接] 以啟動 [新增/修改連接] 對話方塊,然後建立 Northwind 資料庫的連接。如需詳細資訊,請參閱新增/修改連接對話方塊 (一般)

  5. 如果資料庫需要密碼,請選取選項來加入敏感性資料,然後按一下 [下一步]。

  6. 按一下 [將連接字串儲存到應用程式組態檔] 頁面上的 [下一步]。

  7. 在 [選擇您的資料庫物件] 頁面上,展開 [資料表] 節點。

  8. 選取 Customers 和 Orders 資料表,再按一下 [完成]。

    [NorthwindDataSet] 便會加入專案中,而且 Customers 和 Orders 資料表會出現在 [資料來源] 視窗中。

將控制項加入至表單

您可以從 [資料來源] 視窗將項目拖曳至表單上,藉以建立資料繫結控制項。

若要在 Windows Form 上建立資料繫結控制項

加入 System.Transactions 組件的參考

交易會使用 System.Transactions 命名空間。根據預設,系統不會加入 system.transactions 組件的專案參考,所以您必須手動加入。

若要加入 System.Transactions DLL 檔的參考

  1. 在 [專案] 功能表中選擇 [加入參考]。

  2. 選取 [System.Transactions] (在 [.NET] 索引標籤中),然後按一下 [確定]。

    [System.Transactions] 的參考就會加入專案中。

在 BindingNavigator 的 SaveItem 按鈕中修改程式碼

根據預設,若為第一個置放到表單上的資料表,程式碼就會加入 BindingNavigator 上儲存按鈕的 click 事件中。您必須手動加入程式碼,以便更新任何其他資料表。在這個逐步解說中,我們會從儲存按鈕的 Click 事件處理常式重構現有的儲存程式碼,然後建立一些方法,以便根據是否需要加入或刪除資料列,提供特定的更新功能。

若要修改自動產生的儲存程式碼

  1. 按兩下 [CustomersBindingNavigator] 上的 [儲存] 按鈕 (含有磁片圖示的按鈕)。

  2. 以下列程式碼取代 CustomersBindingNavigatorSaveItem_Click 方法:

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

若要刪除現有的客戶

  • 將下列 DeleteCustomers 方法加入到 Form1

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

若要加入新的客戶

  • 將下列 AddNewCustomers 方法加入到 Form1

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

若要加入新的訂單

  • 將下列 AddNewOrders 方法加入到 Form1

    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 執行應用程式。

請參閱

工作

HOW TO:使用交易儲存資料

概念

Enlisting in Distributed Transactions

Leveraging System.Transactions

準備您的應用程式以接收資料

將資料擷取至您的應用程式中

將控制項繫結至 Visual Studio 中的資料

在您的應用程式中編輯資料

驗證資料

儲存資料

其他資源

Performing Transactions

連接至 Visual Studio 中的資料