備註
類別 DataSet 和相關類別是 2000 年代初的舊版 .NET Framework 技術,可讓應用程式在應用程式與資料庫中斷連線時使用記憶體中的數據。 這些技術特別適用於可讓使用者修改數據並將變更保存回資料庫的應用程式。 雖然數據集是經過證實的成功技術,但新 .NET 應用程式的建議方法是使用 Entity Framework Core。 Entity Framework 提供更自然的方式,以表格式數據作為物件模型使用,而且具有更簡單的程序設計介面。
應用程式開發中最常見的案例之一是在 Windows 應用程式中顯示表單上的資料、編輯數據,以及將更新的數據傳回資料庫。 本逐步解說會建立一個窗體,顯示兩個相關數據表的數據,並示範如何編輯記錄,並將變更儲存回資料庫。 此範例會使用 Northwind 範例資料庫中的 Customers 和 Orders 資料表。
您可以呼叫 Update TableAdapter 的 方法,將應用程式中的數據儲存回資料庫。 當您將數據表從 [數據源] 視窗拖曳至窗體時,會自動新增儲存資料所需的程序代碼。 新增至表表的任何其他資料表都需要手動新增此程式代碼。 本逐步解說示範如何新增程序代碼,以儲存來自多個數據表的更新。
這個逐步解說中所述的工作包括:
使用 [數據源設定精靈] 在應用程式中建立及設定數據源。
在 [資料源] 視窗中設定項目的控制。 如需詳細資訊,請參閱 從 [數據源] 視窗拖曳時設定要建立的控件。
將項目從 數據源 視窗拖曳至表單,以建立數據綁定控件。
修改數據集中每個資料表中的一些記錄。
修改程式代碼以將數據集中更新的數據傳回資料庫。
先決條件
若要完成本教學課程,您需要在 Visual Studio 中安裝的 .NET 桌面開發和資料儲存及處理工作負載。 若要安裝它們,請開啟 Visual Studio Installer,然後選擇您想要修改的 Visual Studio 版本旁的 [修改] (或 [更多>修改])。 請參閱 修改 Visual Studio。
本逐步解說使用 SQL Server Express LocalDB 和 Northwind 範例資料庫。
如果您沒有 SQL Server Express LocalDB,請從 SQL Server Express 下載頁面或透過 Visual Studio 安裝程式進行安裝。 在 Visual Studio Installer中,您可以將 SQL Server Express LocalDB 安裝為 資料儲存和處理 工作負載的一部分,或安裝為個別元件。
依照下列步驟安裝 Northwind 範例資料庫:
在 Visual Studio 中,開啟 [SQL Server 物件總管] 視窗。 (SQL Server 物件總管會安裝為 Visual Studio 安裝程式中的 資料儲存和處理 工作負載的一部分。)展開 SQL Server 節點。 以滑鼠右鍵點擊您的 LocalDB 實例,然後選取 新增查詢。
查詢編輯器視窗隨即開啟。
將 Northwind Transact-SQL 腳本 複製到剪貼簿。 此 T-SQL 腳本會從頭開始建立 Northwind 資料庫,並填入數據。
將 T-SQL 文稿貼到查詢編輯器中,然後選擇 [執行] 按鈕。
在短時間內,查詢會完成執行,並建立 Northwind 資料庫。
建立 Windows Forms 應用程式
為 C# 或 Visual Basic 建立新的 Windows Forms 應用程式 專案。 將專案命名為 UpdateMultipleTablesWalkthrough。
建立資料來源
此步驟會使用 [數據源設定精靈] 從 Northwind 資料庫建立數據源。 您必須能夠存取 Northwind 範例資料庫,才能建立連線。 如需設定 Northwind 範例資料庫的相關信息,請參閱 如何:安裝範例資料庫。
在 [ 數據] 功能表上,選取 [顯示數據源]。
[ 數據源] 視窗隨即開啟。
在 [ 數據源] 視窗中,選取 [ 新增數據源 ] 以啟動 [數據源設定精靈]。
在 [ 選擇數據源類型] 畫面上,選取 [ 資料庫],然後選取 [ 下一步]。
在 [ 選擇您的數據連線 ] 畫面上,執行下列其中一項動作:
如果下拉式清單中有 Northwind 範例資料庫的數據連線可用,請選取它。
-或-
選取 [新增連線 ] 以開啟 [ 新增/修改連線 ] 對話框。
如果您的資料庫需要密碼,請選取包含敏感數據的選項,然後選取 [ 下一步]。
在 [ 將連接字串儲存至應用程式組態檔] 上,選取 [ 下一步]。
在 [ 選擇您的資料庫物件 ] 畫面上,展開 [ 數據表] 節點。
選取 [客戶 ] 和 [ 訂單] 數據表,然後選取 [ 完成]。
NorthwindDataSet 會新增至您的專案,而且數據表會出現在 [數據源] 視窗中。
設定要建立的控件
在本逐步解說中,Customers 表格中的數據位於 詳細數據 布局中,其中資料會顯示在個別控件中。
Orders 表中的數據位於控件中顯示的 網格布局DataGridView 中。
若要在 [資料源] 視窗中設定項目的拖放類型
在 [ 數據源] 視窗中,展開 [ 客戶] 節點。
在 [ 客戶] 節點上,從控件清單中選取 [詳細數據 ],將 Customers 數據表的控件變更為個別控件。 如需詳細資訊,請參閱 從 [數據源] 視窗拖曳時設定要建立的控件。
建立數據系結表單
您可以將項目從 資料來源 視窗拖放到表單中,以建立資料繫結控制項。
將主要 [客戶] 節點從 [數據源] 視窗拖曳至 Form1。
具有描述性標籤的數據綁定控件會出現在表單上,以及用於巡覽記錄的工具帶(BindingNavigator)。 NorthwindDataSet、
CustomersTableAdapter、 BindingSource和 BindingNavigator 會出現在元件匣中。將相關的 Orders 節點從 [資料源 ] 視窗拖曳至 Form1。
備註
相關的 Orders 節點位於 [傳真 ] 資料行下方,且是 Customers 節點的子節點。
DataGridView用於巡覽記錄的控制項和工具區 (BindingNavigator) 會出現在表單上。
OrdersTableAdapter和BindingSource出現在元件匣中。
新增程式代碼以更新資料庫
您可以呼叫 UpdateCustomers 和 Orders TableAdapters 的方法來更新資料庫。 根據預設,[儲存] 按鈕的BindingNavigator事件處理程式會新增至窗體的代碼,以將更新傳送至資料庫。 此程式會修改程式代碼,以正確的順序傳送更新。這可消除引發引用完整性錯誤的可能性。 程序代碼也會藉由將更新的呼叫放入 try-catch 區塊中來實作錯誤處理。 您可以修改程式碼,以符合應用程式的需求。
備註
為了清楚起見,本逐步解說不會使用交易。 不過,如果您要更新兩個或多個相關數據表,請在交易中包含所有更新邏輯。 交易是一個過程,可確保在提交任何變更之前,資料庫的所有相關變更都能成功。 如需詳細資訊,請參閱交易和並行。
將更新邏輯新增至應用程式
選取BindingNavigator上的儲存按鈕。 這會開啟
bindingNavigatorSaveItem_Click事件處理程式的代碼編輯器。更換事件處理程式中的程式碼,以呼叫
Update相關 TableAdapter 所提供的方法。 下列程式代碼會先建立三個臨時數據表,以保存每個 DataRowState (Deleted、 Added和 Modified) 的更新資訊。 更新會以正確的順序執行。 程式代碼看起來應該如下所示: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(); } }
測試應用程式
請按 F5。
對每個數據表中一或多個記錄的數據進行一些變更。
選取儲存按鈕。
檢查資料庫中的值,以確認變更已儲存。