Share via


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

更新:2007 年 11 月

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

這份逐步解說資料說明如何使用 TableAdapterManager 元件儲存相關資料:如需手動撰寫關聯資料表更新作業之程式碼的詳細資訊,請參閱逐步解說:儲存資料至資料庫 (多個資料表)

必要條件

若要完成這個逐步解說,您將需要:

建立 Windows 架構應用程式

本逐步解說的第一步,就是建立一個新的 Windows 架構應用程式。

若要建立新的 Windows 應用程式

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

    注意事項:

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

  2. 將專案命名為 HierarchicalUpdateWalkthrough。

  3. 選取 [Windows Form 應用程式],然後按一下 [確定]。如需詳細資訊,請參閱建立 Windows 架構的應用程式

    [HierarchicalUpdateWalkthrough 專案已建立,並新增至 [方案總管] 中。

建立資料集

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

建立資料集

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

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

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

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

    • 如果下拉式清單方塊中提供 Northwind 範例資料庫的資料連接,請按一下這個資料連接。

      -或-

    • 按一下 [新增連接] 開啟 [新增/修改連接] 對話方塊。如需詳細資訊,請參閱新增/修改連接對話方塊 (一般)

  5. 如果資料庫需要密碼,請選取選項以輸入機密資料,然後按一下 [下一步]。

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

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

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

    NorthwindDataSet 就會建立並加入至專案,且資料表會出現在 [資料來源] 視窗中。

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

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

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

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

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

    注意事項:

    Orders 資料表將使用預設的控制項:DataGridView。

建立資料繫結表單

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

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

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

    具有描述性標籤的資料繫結控制項會出現在表單上,並搭配一個 [TableAdapterManager] 元件,這是用來巡覽資料錄的工具列 (BindingNavigator)。具型別的 DataSetTableAdapterBindingSource 會出現在元件匣中。

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

    注意事項:

    關聯的 [Orders] 節點位於 Customers 資料表的 [Fax] 節點之下,而且是 [Customers] 節點的子節點。和 [Customers] 節點顯示在同一層的 [Orders] 節點,代表資料表中所有的訂單。[Orders] 節點若顯示為 [Customers] 節點的子節點,代表關聯的訂單。

    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]、在 [屬性] 視窗中選取 [Events],然後按兩下 [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 所產生,以及是否使用邏輯來執行階層式更新。將 [Hierarchical Update] 設定為 [True] 會產生 TableAdapterManager,將 [Hierarchical Update] 設定為 [False] 則不會產生 TableAdapterManager。

測試應用程式

若要測試應用程式

  1. 按下 F5 鍵。

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

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

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

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

後續步驟

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

  • 加入第三個資料表,例如 OrderDetails 資料表,並嘗試三張資料表的階層。

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

請參閱

工作

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

HOW TO:設定執行階層式更新時的順序

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

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

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

其他資源

階層式更新

儲存資料

DataSet、DataTable 及 DataView (ADO.NET)