逐步解說:儲存關聯資料表的資料 (階層式更新)
將應用程式中的資料存回資料庫時,若處理的是單一資料表的資料,並不需要考慮外部索引條件,資料存回作業會很簡單。但是,當您要儲存的資料是來自內含兩個以上關聯資料表的資料集時,就必須按特定順序將變更後的資料傳送至資料庫,以免違反條件約束。當您更新關聯資料表中修改過的資料時,可以提供程式邏輯以擷取每一個資料表中的特定子集,並以正確的順序將更新的內容傳送至資料庫,或者,您可以使用 TableAdapterManager 元件。
這份逐步解說資料說明如何使用 TableAdapterManager 元件儲存相關資料:如需手動撰寫關聯資料表更新作業之程式碼的詳細資訊,請參閱逐步解說:儲存資料至資料庫 (多個資料表)。
必要條件
若要完成這個逐步解說,您將需要:
- Northwind 範例資料庫的存取權。如需詳細資訊,請參閱 HOW TO:安裝範例資料庫。
建立 Windows 架構應用程式
本逐步解說的第一步,就是建立一個新的 Windows 架構應用程式。
若要建立新的 Windows 應用程式
從 [檔案] 功能表中,建立新專案。
注意事項 Visual Basic 和 C# 專案支援階層式更新,所以請以其中一種語言建立新專案。
將專案命名為 HierarchicalUpdateWalkthrough。
選取 [Windows Form 應用程式],然後按一下 [確定]。如需詳細資訊,請參閱開發用戶端應用程式。
[HierarchicalUpdateWalkthrough 專案已建立,並新增至 [方案總管] 中。
建立資料集
因為您需要關聯資料表以展示階層式更新,所以下一步就是要建立一個資料集,內含取自 Northwind 資料庫中的 Customers 與 Orders 資料表。使用 [資料來源組態精靈] 來建立資料集。您必須可以存取 Northwind 範例資料庫,才能建立連接。如需如何設定 Northwind 範例資料庫的詳細資訊,請參閱 HOW TO:安裝範例資料庫。
建立資料集
按一下 [資料] 功能表上的 [顯示資料來源]。
在 [資料來源] 視窗中,按一下 [加入新資料來源],啟動 [資料來源組態精靈]。
在 [選擇資料來源類型] 頁面上,按一下 [資料庫],然後按 [下一步]。
在 [選擇資料連接] 頁面上,執行下列其中一個動作:
如果下拉式清單方塊中提供 Northwind 範例資料庫的資料連接,請按一下這個資料連接。
-或-
按一下 [新增連接] 開啟 [新增/修改連接] 對話方塊。如需詳細資訊,請參閱新增/修改連接對話方塊 (一般)。
如果資料庫需要密碼,請選取選項以輸入機密資料,然後按一下 [下一步]。
在 [將連接字串儲存到應用程式組態檔] 頁面上,按一下 [下一步]。
在 [選擇您的資料庫物件] 頁面上,展開 [資料表] 節點。
按一下 [Customers] 和 [Orders] 資料表的核取方塊,然後按一下 [完成]。
NorthwindDataSet 就會建立並加入至專案,且資料表會出現在 [資料來源] 視窗中。
變更要建立的預設資料繫結控制項
在填入 [資料來源] 視窗後,拖曳項目至 Windows Form 時您可以選擇要建立的控制項。在這個逐步解說中,Customers 資料表中的資料會顯示在個別控制項中 ([詳細資料])。Orders 資料表中的資料會顯示在 DataGridView 控制項中 ([DataGridView])。
若要為資料來源視窗中的項目設定控制項
在 [資料來源] 視窗中,展開 [Customers] 節點。
按一下 [Customers] 節點上控制項清單中的 [Details],將要為 [Customers] 資料表所建立的控制項變更為個別控制項。如需詳細資訊,請參閱 HOW TO:設定從資料來源視窗拖曳時要建立的控制項。
注意事項 Orders 資料表將使用預設的控制項:DataGridView。
建立資料繫結表單
在 [資料來源] 視窗中選擇了控制項後,請將項目拖曳至表單上以建立資料繫結控制項。
若要為 Customers 及 Orders 資料建立資料繫結控制項
從 [資料來源] 視窗,將 [Customers] 主節點拖曳至 [Form1]。
具有描述性標籤的資料繫結控制項會出現在表單上,並搭配一個 [TableAdapterManager] 元件,這是用來巡覽資料錄的工具列 (BindingNavigator)。具型別的 DataSet、TableAdapter 和 BindingSource 會出現在元件匣中。
從 [資料來源] 視窗,將相關的 [Orders] 節點拖曳至 [Form1]。
注意事項 關聯的 [Orders] 節點位於 Customers 資料表的 [Fax] 節點之下,而且是 [Customers] 節點的子節點。和 [Customers] 節點顯示在同一層的 [Orders] 節點,代表資料表中所有的訂單。[Orders] 節點若顯示為 [Customers] 節點的子節點,代表關聯的訂單。
DataGridView 控制項以及用於巡覽資料錄的工具列 (BindingNavigator) 會出現在表單上。TableAdapter 和 BindingSource 則出現在元件匣中。
修改產生的儲存程式碼以執行階層式更新
呼叫 TableAdapterManager.UpdateAll 方法並傳入內含關聯資料表的資料集名稱,會將資料集內關聯資料表的變更儲存至資料庫。例如,執行 TableAdapterManager.UpdateAll(NorthwindDataset) 方法將 NorthwindDataset 中所有資料表的變更傳送至後端資料庫。
置放 [資料來源] 視窗的項目後,程式碼會自動加入至 Form_Load 事件以填入每一個資料表 (TableAdapter.Fill 方法)。程式碼也會加入至 BindingNavigator 之 [儲存] 按鈕的 Click 事件,以便將資料集內的資料儲存回資料庫 (TableAdapterManager.UpdateAll 方法)。
產生的儲存程式碼也包含一行會呼叫 CustomersBindingSource.EndEdit 方法的程式碼。更精確的說,它會呼叫的是加入表單之第一個 BindingSource 的 EndEdit 方法。也就是說,只會針對第一個從 [資料來源] 視窗拖曳至表單上的資料表產生這個程式碼。EndEdit 呼叫會認可正在編輯的任何資料繫結控制項中,所有正在處理的變更。因此,如果資料繫結控制項還有焦點時您按一下 [儲存] 按鈕,則會在實際儲存 (TableAdapterManager.UpdateAll 方法) 前先認可該控制項之所有暫止的編輯項目。
注意事項 |
---|
設計工具只會為第一個放置在表單上的資料表,加入 BindingSource.EndEdit 程式碼。因此,您必須對表單上每一個關聯資料表加入一行程式碼以呼叫 BindingSource.EndEdit 方法。在本逐步說明中,這就表示您必須加入 OrdersBindingSource.EndEdit 方法的呼叫。 |
若要更新程式碼以在儲存前認可關聯資料表的變更
按兩下 BindingNavigator 上的 [儲存] 按鈕,在 [程式碼編輯器] 中開啟 [Form1]。
在呼叫 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 呼叫。這是因為控制項的基礎資料繫結功能會處理新資料錄的認可。 |
若要加入程式碼以在新增子資料錄前認可資料集中的父資料錄
為 OrdersBindingSource.AddingNew 事件建立事件處理常式。
- 以設計檢視開啟 [Form1],按一下元件匣中的 [OrdersBindingSource]、在 [屬性] 視窗中選取 [Events],然後按兩下 [AddingNew] 事件。
在事件處理常式中加入一行呼叫 CustomersBindingSource.EndEdit 方法的程式碼。OrdersBindingSource_AddingNew 事件處理常式中的程式碼應該類似下列程式碼:
Me.CustomersBindingSource.EndEdit()
this.customersBindingSource.EndEdit();
確認已啟用階層式更新
設定資料集的 [Hierarchical Update] 屬性,即可啟用或停用階層式更新。預設為啟用階層式更新,因此在本逐步說明中,您不需變更 [Hierarchical Update] 屬性的值。
確認已啟用階層式更新
在 [方案總管] 中按兩下 [NorthwindDataSet.xsd] 檔案,在 [DataSet 設計工具] 中開啟資料集。
在設計介面上選取一塊空白的區域。
找到屬性視窗中的 [Hierarchical Update] 屬性,並確認已設定為 True。
注意事項 Hierarchical Update 屬性的設定,會控制程式碼是否由 TableAdapterManager 所產生,以及是否使用邏輯來執行階層式更新。將 [Hierarchical Update] 設定為 [True] 會產生 TableAdapterManager,將 [Hierarchical Update] 設定為 [False] 則不會產生 TableAdapterManager。
測試應用程式
若要測試應用程式
按 F5。
在每個資料表中,變更一個或多個資料錄的資料。
加入新的客戶並為該客戶加入新訂單。
按一下 [儲存] 按鈕。TableAdapterManager 會處理所有相關更新所需的邏輯。
檢查資料庫的值,確認變更已儲存至每一個資料表中。
後續步驟
視應用程式的需求而定,在您儲存 Windows 應用程式中的關聯資料後,可能還要執行幾個步驟。您可以進行下列作業讓這個應用程式發揮更強的功能:
加入第三個資料表,例如 OrderDetails 資料表,並嘗試三張資料表的階層。
加入驗證程式碼,以確認除了資料庫條件約束外,資料還符合應用程式的需求。如需詳細資訊,請參閱 驗證資料。
請參閱
工作
HOW TO:儲存資料前先認可資料繫結控制項上的同處理序編輯
HOW TO:在現有的 Visual Studio 專案中實作階層式更新