將應用程式中的資料存回資料庫時,若處理的是單一資料表的資料,則資料存回作業會很簡單,且不需要考慮外部索引鍵的條件約束。 但是,當您要儲存的資料是來自包含兩個以上關聯資料表的資料集時,就必須依特定順序將變更傳送至資料庫,以免違反該條件約束。 當您更新關聯資料表中修改過的資料時,可以提供程式設計邏輯,以擷取每個資料表中的特定子集,並以正確的順序將更新傳送至資料庫,或者,您可以使用 TableAdapterManager 元件。

此逐步解說示範如何使用 TableAdapterManager 元件儲存關聯資料。 如需手動撰寫關聯資料表更新的程式碼的詳細資訊,請參閱 逐步解說:儲存資料至資料庫 (多個資料表)

必要條件

若要完成此逐步解說,您需要:

建立 Windows 應用程式

此逐步解說的第一步是建立新的 Windows 應用程式。

建立新的 Windows 應用程式

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

    注意事項注意事項

    Visual Basic 和 C# 專案支援階層式更新,所以請以其中一種語言建立新專案。

  2. 將專案命名為 HierarchicalUpdateWalkthrough。

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

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

建立資料集

因為您需要關聯資料表以示範階層式更新,所以下一步就是要建立一個資料集,其中包含 Northwind 資料庫中的 [Customers] 與 [Orders] 資料表。 使用 [資料來源組態精靈] 建立資料集。 您必須具有 Northwind 範例資料庫的存取權,才能建立連接。 如需如何設定 Northwind 範例資料庫的資訊,請參閱 如何:安裝範例資料庫

建立資料集

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

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

  3. 在 [選擇資料來源類型] 頁面中,按一下 [資料庫],再按 [下一步]。

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

    • 若下拉式清單中有提供 Northwind 範例資料庫的資料連接,請按一下該連接。

      -或-

    • 按一下 [新增連接],以開啟 [加入/修改連接] 對話方塊。

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

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

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

  8. 按一下 [Customers] 和 [Orders] 資料表的核取方塊,然後按一下 [完成]。

    隨即建立 NorthwindDataSet 並將其加入專案中,且這些資料表會出現在 [資料來源] 視窗中。

變更要建立的預設資料繫結控制項

在填入 [資料來源] 視窗後,您可以在拖曳項目至 Windows Form 時選擇要建立的控制項。 在此逐步解說中,[Customers] 資料表中的資料會顯示在個別控制項中 (詳細資料)。 [Orders] 資料表中的資料會顯示在 DataGridView 控制項中 (DataGridView)。

為資料來源視窗中的項目設定控制項

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

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

    注意事項注意事項

    [Orders] 資料表會使用預設控制項 DataGridView

建立資料繫結表單

在 [資料來源] 視窗中選擇控制項後,請將項目拖曳至表單上以建立資料繫結控制項。

為 Customers 及 Orders 資料建立資料繫結控制項

  1. 從 [資料來源] 視窗中將 [Customers] 主節點拖曳至 Form1

    會在表單上顯示具有描述性標籤的資料繫結控制項,以及 TableAdapterManager 元件,亦即巡覽記錄的工具列 (BindingNavigator)。 類型 DataSetTableAdapterBindingSource 則會出現在元件匣中。

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

    注意事項注意事項

    關聯的 [Orders] 節點是位於 [Customers] 資料表的 [Fax] 節點之下,而且是 [Customers] 節點的子節點。與 [Customers] 節點對等顯示的 [Orders] 節點代表資料表中的所有訂單。做為 [Customers] 節點的子節點顯示的 [Orders] 節點則代表關聯的訂單。

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

修改產生的儲存程式碼以執行階層式更新

呼叫 TableAdapterManager.UpdateAll 方法並傳入包含關聯資料表的資料集名稱,可將資料集內關聯資料表的變更儲存至資料庫。 例如,執行 TableAdapterManager.UpdateAll(NorthwindDataset) 方法,以將 NorthwindDataset 中所有資料表的更新傳送至後端資料庫。

從 [資料來源] 視窗放置項目後,程式碼會自動加入至 Form_Load 事件,以填入每個資料表 (TableAdapter.Fill 方法)。 程式碼也會加入至 BindingNavigator 的 [儲存] 按鈕 Click 事件,以將資料集的資料存回資料庫 (TableAdapterManager.UpdateAll 方法)。

產生的儲存程式碼也包含一行會呼叫 CustomersBindingSource.EndEdit 方法的程式碼。 更精確的說,它會呼叫的是加入表單的第一個 BindingSourceEndEdit 方法。 換言之,只會針對從 [資料來源] 視窗拖曳至表單上的第一個資料表產生此程式碼。 EndEdit 呼叫會認可目前正在編輯的所有資料繫結控制項中,所有正在進行的變更。 因此,當資料繫結控制項還有焦點時,您可以按一下 [儲存] 按鈕,就會在實際儲存 (TableAdapterManager.UpdateAll 方法) 之前,先認可該控制項中所有暫止的編輯項目。

注意事項注意事項

設計工具只會為第一個放置在表單上的資料表,加入 BindingSource.EndEdit 程式碼。因此,您必須對表單上每個關聯資料表,加入一行程式碼以呼叫 BindingSource.EndEdit 方法。在此逐步說明中,這表示您必須加入 OrdersBindingSource.EndEdit 方法的呼叫。

更新程式碼以在儲存前認可關聯資料表的變更

  1. 按兩下 BindingNavigator 上的 [儲存] 按鈕,以在程式碼編輯器中開啟 Form1

  2. 在呼叫 CustomersBindingSource.EndEdit 方法的程式碼行後方,加入一行程式碼以呼叫 OrdersBindingSource.EndEdit 方法。 [儲存] 按鈕 Click 事件中的程式碼應與下列類似:

    Me.Validate()
    Me.CustomersBindingSource.EndEdit()
    Me.OrdersBindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
    
    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

除了將資料儲存至資料庫前,先認可關聯子資料表的變更外,您可能也必須先認可新建立的父記錄,才能將子記錄加入至資料集。 換言之,您可能必須先將新的父記錄 (Customer) 加入至資料集,外部索引鍵條件約束才會允許新的子記錄 (Orders) 加入至資料集。 若要完成此工作,您可以使用子 BindingSource.AddingNew 事件。

注意事項注意事項

您是否必須認可新的父記錄,要取決於繫結資料來源所使用的控制項類型。在此逐步解說中,您要使用個別控制項以繫結至父資料表,這需要額外的程式碼來認可新的父記錄。若父記錄顯示在複雜繫結控制項中,例如 DataGridView,就不需要為父記錄進行額外的 EndEdit 呼叫。因為控制項的基礎資料繫結功能會處理新記錄的認可。

加入程式碼以在新增子記錄前先認可資料集中的父記錄

  1. 建立 OrdersBindingSource.AddingNew 事件的事件處理常式。

    • 在設計檢視中開啟 Form1,按一下元件匣中的 [OrdersBindingSource],再選取 [屬性] 視窗中的 [事件],然後按兩下 [AddingNew] 事件。
  2. 在事件處理常式中加入一行呼叫 CustomersBindingSource.EndEdit 方法的程式碼。 OrdersBindingSource_AddingNew 事件處理常式中的程式碼應該與下列類似:

    Me.CustomersBindingSource.EndEdit()
    
    this.customersBindingSource.EndEdit();
    

確認已啟用階層式更新

透過設定資料集的 [Hierarchical Update] 屬性,可啟用或停用階層式更新。 預設為啟用階層式更新,因此在此逐步說明中,您不需變更 [Hierarchical Update] 屬性。

確認已啟用階層式更新

  1. 按兩下 方案總管中的 NorthwindDataSet.xsd 檔案,以在 DataSet 設計工具中開啟資料集。

  2. 在設計介面上選取一塊空白的區域。

  3. 找到屬性視窗中的 [Hierarchical Update] 屬性,並確認已設定為 True

    注意事項注意事項

    Hierarchical Update 屬性的設定,會控制是否透過 TableAdapterManager 產生程式碼,以及邏輯是否要執行階層式更新。將 HierarchicalUpdate 設定為 True 會產生 TableAdapterManager;將 HierarchicalUpdate 設定為 False 則不會產生 TableAdapterManager。

測試應用程式

若要測試應用程式

  1. 按 F5。

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

  3. 加入新的客戶,並為該客戶加入新訂單。

  4. 按一下 [儲存] 按鈕。 TableAdapterManager 會處理所有相關更新所需的邏輯。

  5. 檢查資料庫中的值,確認變更已儲存至每個資料表中。

後續步驟

視應用程式的需求而定,在您儲存 Windows 應用程式中的關聯資料後,可能還要執行幾個步驟。 您可以進行下列作業讓此應用程式發揮更強的功能:

  • 加入第三個資料表,例如 [OrderDetails] 資料表,並實驗三張資料表的階層。

  • 加入驗證程式碼,以確認資料除了符合資料庫條件約束外,還符合應用程式的需求。 如需詳細資訊,請參閱驗證資料

請參閱

工作

如何:設定資料集中的外部索引鍵條件約束

如何:設定執行階層式更新時的順序

如何:儲存資料前先認可資料繫結控制項上的同處理序編輯

如何:在現有的 Visual Studio 專案中實作階層式更新

逐步解說:儲存關聯資料表的資料 (階層式更新)

概念

儲存資料

其他資源

階層式更新

DataSet、DataTable 及 DataView