共用方式為


將資料儲存到 .NET Framework 應用程式中的資料庫 (多個資料表)

注意

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

在應用程式的開發過程中,最常見的一個情節是在 Windows 應用程式的表單上顯示資料並編輯資料,以及將更新的資料傳送回資料庫。 此逐步解說會建立表單,以顯示來自兩個關聯資料表的資料,並示範如何編輯記錄,以及將變更儲存回資料庫。 此範例使用 Northwind 範例資料庫的 CustomersOrders 資料表。

您可以透過呼叫 TableAdapter 的 Update 方法,將應用程式的資料存回資料庫。 當您將資料表從 [資料來源] 視窗拖曳到表單上時,系統會自動新增儲存資料所需的程式碼。 所有新增至表單的其他資料表都需要手動新增此程式碼。 此逐步解說會示範如何加入程式碼,以儲存多個資料表的更新。

這個逐步解說中所述的工作包括:

  • 使用 [資料來源設定精靈],在您的應用程式中建立和設定資料來源。

  • 在 [資料來源] 視窗中設定項目的控制項。 如需詳細資訊,請參閱設定從資料來源視窗拖曳時要建立的控制項

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

  • 修改資料集中每個資料表的一些記錄。

  • 修改程式碼,以將資料集中更新的資料傳送回資料庫。

必要條件

若要完成本教學課程,您需要在 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 安裝為資料儲存和處理工作負載的一部分,或安裝為個別元件。

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

為 C# 或 Visual Basic 建立新的 [Windows Forms 應用程式] 專案。 將專案命名為 UpdateMultipleTablesWalkthrough

建立資料來源

此步驟會使用 [資料來源組態精靈] 從 Northwind 資料庫建立資料來源。 您必須具有 Northwind 範例資料庫的存取權,才能建立連接。 如需設定 Northwind 範例資料庫的相關資訊,請參閱如何:安裝範例資料庫

  1. 在 [資料] 功能表上,選取 [顯示資料來源]

    [資料來源] 視窗隨即開啟。

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

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

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

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

      -或-

    • 選取 [新增連線],以開啟 [新增/修改連線] 對話方塊。

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

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

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

  8. 選取 [Customers] 和 [Orders] 資料表,然後選取 [完成]

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

設定要建立的控制項

在這個逐步解說中,Customers 資料表的資料位於 [詳細資料] 配置,其中的資料會顯示在個別控制項中。 Orders 資料表的資料位於 [格線] 配置,該配置會顯示在 DataGridView 控制項中。

在資料來源視窗中設定項目的卸除類型

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

  2. 在 [Customers] 節點上,從控制項清單中選取 [詳細資料],將 [Customers] 資料表的控制項變更為個別控制項。 如需詳細資訊,請參閱設定從資料來源視窗拖曳時要建立的控制項

建立資料繫結表單

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

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

    會在表單上顯示具有描述性的資料繫結控制項,以及巡覽記錄的工具區域 (BindingNavigator)。 [NorthwindDataSet]、[RegionTableAdapter]CustomersTableAdapterBindingSourceBindingNavigator 會出現在元件匣中。

  2. 從 [資料來源] 視窗將關聯的 [Orders] 節點拖曳至 [Form1]

    注意

    關聯的 [Orders] 節點位於 [Fax] 節點之下,而且是 [Customers] 節點的子節點。

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

新增程式碼以更新資料庫

您可以藉由呼叫 [Customers] 和 [Orders] TableAdapters 的 Update 方法以更新資料庫。 根據預設,BindingNavigator 的 [儲存] 按鈕事件處理常式會新增至表單的程式碼,以將更新傳送至資料庫。 此程序會修改該程式碼,以正確的順序傳送更新,進而排除參考完整性錯誤提高的可能性。 程式碼也會藉由將 try-catch 區塊中的更新呼叫換行,以實作錯誤處理。 您可以修改程式碼,使其符合應用程式的需求。

注意

為了清楚起見,本逐步解說不會使用交易。 不過,如果您要更新兩個或更多相關資料表,請在交易中包含所有更新邏輯。 交易是在認可任何變更之前,可確保對資料庫的所有相關變更都能成功的程序。 如需詳細資訊,請參閱交易和並行

將更新邏輯加入至應用程式

  1. 選取 BindingNavigator 上的 [儲存] 按鈕。 這會將程式碼編輯器開啟至 bindingNavigatorSaveItem_Click 事件處理常式。

  2. 替換事件處理常式中的程式碼,以呼叫相關 TableAdapters 的 Update 方法。 下列程式碼會先建立三個暫存資料表,以保留 DataRowState (DeletedAddedModified) 的更新資訊。 更新會以正確的順序執行。 程式碼看起來應該如下所示:

    this.Validate();
    this.ordersBindingSource.EndEdit();
    this.customersBindingSource.EndEdit();
    
    NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
    NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
    NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
    try
    {
        // Remove all deleted orders from the Orders table.
        if (deletedOrders != null)
        {
            ordersTableAdapter.Update(deletedOrders);
        }
    
        // Update the Customers table.
        customersTableAdapter.Update(northwindDataSet.Customers);
    
        // Add new orders to the Orders table.
        if (newOrders != null)
        {
            ordersTableAdapter.Update(newOrders);
        }
    
        // Update all modified Orders.
        if (modifiedOrders != null)
        {
            ordersTableAdapter.Update(modifiedOrders);
        }
    
        northwindDataSet.AcceptChanges();
    }
    
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    
    finally
    {
        if (deletedOrders != null)
        {
            deletedOrders.Dispose();
        }
        if (newOrders != null)
        {
            newOrders.Dispose();
        }
        if (modifiedOrders != null)
        {
            modifiedOrders.Dispose();
        }
    }
    

測試應用程式

  1. 請按 F5

  2. 在每個資料表中,變更一個或多個記錄的資料。

  3. 選取儲存按鈕。

  4. 檢查資料庫中的值,確認已儲存變更。