共用方式為


逐步解說:在異動中儲存資料

 

發行︰ 2016年4月

此逐步解說示範如何使用 System.Transactions 命名空間儲存交易中的資料。 此範例使用 Northwind 範例資料庫的 CustomersOrders 資料表。

必要條件

此逐步解說需要 Northwind 範例資料庫的存取權。 如需設定 Northwind 範例資料庫的資訊,請參閱 如何:安裝範例資料庫

建立 Windows 應用程式

第一步是建立 Windows 應用程式

建立新的 Windows 專案

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

  2. 將專案命名為 SavingDataInATransactionWalkthrough。

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

    隨即建立 SavingDataInATransactionWalkthrough 專案,並將其加入至方案總管

建立資料庫資料來源

此步驟使用資料來源組態精靈,根據 Northwind 範例資料庫中的 CustomersOrders 資料表建立資料來源。

若要建立資料來源

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

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

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

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

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

      -或-

    • 選取 [新增連接] 以啟動 [加入/修改連接] 對話方塊,並建立 Northwind 資料庫的連接。

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

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

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

  8. 選取 CustomersOrders 資料表,然後按一下 [完成]。

    NorthwindDataSet 會加入專案中,且 CustomersOrders 資料表會出現在 [資料來源] 視窗中。

將控制項加入至表單

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

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

將參考加入至 System.Transactions 組件

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

加入 System.Transactions DLL 檔案的參考

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

  2. 選取 [.NET] 索引標籤上的 [System.Transactions],並按一下 [確定]。

    隨即會將 System.Transactions 的參考加入至專案。

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

根據預設,會針對您拖放至表單的第一個資料表,將程式碼將入至 BindingNavigator 的相同按鈕的 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 分散式交易
如何:使用異動儲存資料
System.Transactions 與 SQL Server 整合
連接至 Visual Studio 中的資料
準備您的應用程式以接收資料
將資料擷取至您的應用程式中
將控制項繫結至 Visual Studio 中的資料
在您的應用程式中編輯資料
驗證資料
儲存資料