共用方式為


逐步解說:將資料儲存在 .NET Framework 應用程式的交易中

注意

資料集和相關類別是 2000 年代初的舊版 .NET Framework 技術,可讓應用程式在應用程式與資料庫中斷連線時使用記憶體中的資料。 這些技術特別適用於可讓使用者修改資料並將變更保存回資料庫的應用程式。 雖然已證明資料集是非常成功的技術,但建議新的 .NET 應用程式使用 Entity Framework Core。 Entity Framework 提供更自然的方式,將表格式資料作為物件模型使用,而且具有更簡單的程式設計介面。

此逐步解說示範如何使用 System.Transactions 命名空間儲存異動中的資料。 在本逐步解說中,您將建立 Windows Forms 應用程式。 您將使用 [資料來源組態精靈] 在 Northwind 範例資料庫中建立兩個資料表的資料集。 您要將資料繫結控制項新增至 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 安裝程式中,將 SQL Server Express LocalDB 安裝為 .NET 桌面開發工作負載的一部分,或安裝為個別元件。

  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 Forms 應用程式

第一步是建立 Windows Forms 應用程式 (.NET Framework)

  1. 在 Visual Studio 的 [檔案] 功能表上,選取 [新增]>[專案]

  2. 在左側窗格中展開 Visual C#Visual Basic,然後選取 [Windows 桌面]

  3. 在中間窗格中,選取 [Windows Forms 應用程式] 專案類型。

  4. 將專案命名為 SavingDataInATransactionWalkthrough,然後選擇 [確定]

    隨即建立 SavingDataInATransactionWalkthrough 專案,並將其新增至 [方案總管]

建立資料庫資料來源

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

  1. 若要開啟 [資料來源] 視窗,請選取 [資料] 功能表上的 [顯示資料來源]

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

  3. 在 [選擇資料來源類型] 畫面上選取 [資料庫],然後選取 [下一步]

  4. 在 [選擇您的資料連線] 畫面上,執行下列其中一項:

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

      -或-

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

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

  6. [將連接字串儲存至應用程式組態檔] 畫面上,選取 [下一步]

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

  8. 選取 CustomersOrders 資料表,然後選取 [完成]

    NorthwindDataSet 會新增至您的專案中,且 CustomersOrders 資料表會出現在 [資料來源] 視窗中。

控制項加入至表單

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

  1. 在 [資料來源] 視窗中,展開 [Customers] 節點。

  2. 從 [資料來源] 視窗,將 [客戶] 主節點拖曳至 Form1

    DataGridView 控制項以及巡覽記錄的工具區域 (BindingNavigator) 會出現在表單上。 [NorthwindDataSet]、[RegionTableAdapter]CustomersTableAdapterBindingSourceBindingNavigator 會出現在元件匣中。

  3. 將關聯的 [Orders] 節點 (不是主節點 [Orders],而是 [Fax] 資料行下的關聯子資料表節點) 拖曳至 CustomersDataGridView 下的表單。

    DataGridView 隨即出現在表單上。 OrdersTableAdapterBindingSource 會出現在元件匣中。

將參考新增至 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 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 執行應用程式。