共用方式為


階層式更新概觀

更新:2007 年 11 月

「階層式更新」(Hierarchical update) 是指將更新過的資料 (從具有兩張以上關聯資料表的資料集中) 儲存回資料庫,同時維護參考完整性規則的程序。「參考完整性」(Referential integrity) 是指資料庫中外部索引鍵條件約束所提供的一致性規則,負責控制「插入」、「更新」和「刪除」相關記錄的行為。例如,參考完整性會強制您建立客戶記錄,才能建立該客戶的訂單。

當開發人員在 Visual Studio 2005 和舊版中建立資料應用程式時,自動產生的程式碼只會將變更過的資料儲存至從 [資料來源] 視窗拖曳的第一張資料表。從 [資料來源] 視窗拖曳其他資料表時,使用者必須手動加入程式碼,將這些資料表中的變更儲存至資料庫。不只使用者需要加入程式碼才能對每一張資料表呼叫 TableAdapter.Update 方法,而且也必須納入邏輯,按照每一張資料表的正確順序執行特定的「插入」、「更新」和「刪除」,以避免違反參考完整性 (例如,您必須先儲存新的客戶才能加入其訂單,而要移除現有的客戶之前則必須先刪除其訂單)。

在 Visual Studio 2008 中,新的 TableAdapterManager 元件強化了具型別資料集。TableAdapterManager 減少所需的程式碼,即可將多張關聯資料表中的資料,從多行程式碼的多個常式儲存至單一方法呼叫:TableAdapterManager.UpdateAll(TypedDataset)。TableAdapterManager 提供所需的所有基礎邏輯,在資料集和資料庫之間的更新 (儲存) 作業期間,維護參考完整性。如需詳細資訊,請參閱TableAdapterManager 概觀

啟用資料集中的階層式更新

根據預設,在專案中加入或建立的所有新資料集,都已啟用階層式更新。將 DataSet 設計工具 中具別資料集的 [階層式更新] 屬性設定為 True 或 False,即可啟用或停用階層式更新。如需詳細資訊,請參閱 HOW TO:啟用和停用階層式更新

外部索引鍵條件約束及串聯更新與刪除

您必須了解在產生的資料集程式碼中,如何建立資料庫中的外部索引鍵條件約束和串聯行為。

根據預設,資料集中的資料表產生時的關聯性 (DataRelation) 會符合資料庫中的關聯性。但是,資料集中的關聯性不會產生做為外部索引鍵條件約束。DataRelation 設定為 [僅關聯],而 UpdateRuleDeleteRule 則不生效。

根據預設,即使資料庫關聯性的串聯更新和 (或) 串聯刪除設定為開啟,串聯更新和串聯刪除還是會關閉。例如,建立新的客戶和新的訂單,然後嘗試儲存資料,會導致資料庫中所定義的外部索引鍵條件約束發生衝突。如需詳細資訊,請參閱 HOW TO:設定資料集中的外部索引鍵條件約束

設定訂單以執行更新

設定執行更新的順序時,會設定個別「插入」、「更新」和「刪除」的順序 (這是在資料集的所有資料表中儲存修改過之資料必須使用到的動作)。啟用階層式更新時,會先執行「插入」,接著是「更新」,然後才是「刪除」。TableAdapterManager 提供 UpdateOrder 屬性,可以設定為先執行「更新」再執行「插入」,然後執行「刪除」。

注意事項:

重點是要了解更新順序是包含在其中的。也就是說,在執行更新後會對資料集中所有資料表執行「插入」,然後對資料集中所有資料表執行「更新」,再對資料集中所有資料表執行「刪除」。

若要設定 UpdateOrder 屬性,請在將項目從 資料來源視窗 拖曳至表單上後,按一下元件匣中的 TableAdapterManager,並在 [屬性] 視窗中設定 UpdateOrder 屬性。如需詳細資訊,請參閱 HOW TO:設定執行階層式更新時的順序

執行階層式更新前先建立資料集的備份複本

(呼叫 TableAdapterManager.UpdateAll() 方法) 儲存資料時,TableAdapterManager 會嘗試在單次交易中更新每個資料表的資料。如果任何資料表的任何部分更新失敗,則整個交易就會復原。大部分的情況下,復原交易會將應用程式還原為其原始狀態。但是,有時您可能要從備份複本還原資料集。其中一個範例就是當您使用自動遞增值時。例如,如果儲存作業失敗就不會重設資料集中的自動遞增值,而且資料集會繼續建立自動遞增值,造成應用程式可能無法接受的編號漏洞。發生這種情形時,TableAdapterManager 會提供 BackupDataSetBeforeUpdate 屬性,如果交易失敗就會以備份複本取代現有的資料集。

注意事項:

在 TableAdapterManager.UpdateAll 方法執行期間,備份複本只會在記憶體中。因此,這個備份資料集無法以程式設計方式存取,因為它不是取代原始的資料集,就是在 TableAdapterManager.UpdateAll 方法執行完成時超出範圍。

請參閱

工作

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

概念

資料的新功能

TableAdapterManager 概觀

其他資源

儲存資料

階層式更新