分层更新概述
更新:2007 年 11 月
“分层更新”是指在维护引用完整性的情况下,将具有两个或多个相关表的数据集中的已更新数据保存回数据库。“引用完整性”是指数据库中的外键约束所提供的一致性规则,这些外键约束可对插入、更新和删除相关记录的行为进行控制。例如,引用完整性可强制要求您在为客户创建订单之前创建客户记录。
开发人员在 Visual Studio 2005 及其早期版本中创建数据应用程序时,自动生成的代码只会将已更改的数据保存到第一个从“数据源”窗口拖动的表中。当从“数据源”窗口拖动其他表时,用户必须手动添加代码,以将这些表中的更改保存到数据库中。不仅需要用户添加代码以对每个表调用 TableAdapter.Update 方法,同时还需要合并逻辑从而以适当的顺序对每个表执行特定 Insert、Update 和 Delete,以此来防止违反引用完整性。(例如,必须先保存新的客户,然后才能添加他们的订单;必须先删除现有客户的订单,然后才能删除现有客户。)
在 Visual Studio 2008 中,新的 TableAdapterManager 组件增强了类型化数据集的性能。TableAdapterManager 可将保存多个相关表中的数据所需的代码从在具有多行代码的多个例程减少为单个方法调用:TableAdapterManager.UpdateAll(TypedDataset)。TableAdapterManager 可提供在数据集和数据库之间执行更新(保存)操作时,维护引用完整性所需的所有基础逻辑。有关更多信息,请参见 TableAdapterManager 概述。
启用数据集中的分层更新
默认情况下,所有在项目中添加或创建的新数据集的分层更新都处于启用状态。可通过在数据集设计器中,将类型化数据集的“分层更新”属性设置为“True”或“False”来启用或禁用分层更新。有关详细信息,请参见如何:启用和禁用分层更新。
外键约束和级联更新、删除
理解数据库中的外键约束和级联行为是如何在已生成的数据集代码中生成的是很重要的。
默认情况下,所生成的数据集中的数据表具有与数据库中的关系相匹配的关系 (DataRelation)。但数据集中的关系不生成为外键约束。实际上,DataRelation 配置为“仅关系”,不具有 UpdateRule 或 DeleteRule。
默认情况下,即使对数据库关系进行设置,开启级联更新和/或级联删除,级联更新和级联删除也将处于关闭状态。例如,创建一个新的客户和一个新的订单,然后尝试保存与数据库中定义的外键约束相冲突的数据。有关更多信息,请参见如何:配置数据集中的外键约束。
设置更新的执行顺序
设置更新的执行顺序就是设置保存数据集中的所有表中的所有已更改数据所需的单个 Insert、Update 和 Delete 的顺序。启用分层更新后,将依次执行 Insert、Update 和 Delete。TableAdapterManager 提供了一个 UpdateOrder 属性,可对该属性进行设置,从而首先执行 Update,然后执行 Insert,最后执行 Delete。
说明: |
---|
理解更新顺序的全面性是很重要的。即执行更新时,会依次对数据集中的所有表执行 Insert 、Update 和 Delete 命令。 |
若要设置 UpdateOrder 属性,则请将项目从“数据源”窗口拖入窗体,然后单击组件栏中的 TableAdapterManager,并在“属性”窗口中设置 UpdateOrder 属性。有关更多信息,请参见如何:设置分层更新的执行顺序。
在执行分层更新之前,创建数据集的备份副本
保存数据(通过调用 TableAdapterManager.UpdateAll() 方法)时,TableAdapterManager 会试图在单个事务中更新所有表的数据。只要有表的某一更新环节失败,则将回滚整个事务。在大部分情况下,回滚事务会将您的应用程序返回到其原始状态。但有时,您可能会希望从备份副本还原数据集。一个例子就是当您使用自动递增值时。例如,如果保存操作失败,则数据集中将不会重置自动递增值,同时数据集仍将会继续创建自动递增值,这会使自动计数产生缺口,您的应用程序可能不会接受。如果发生这种情况,TableAdapterManager 提供的 BackupDataSetBeforeUpdate 属性可在事务失败时,将现有数据集替换为备份副本。
说明: |
---|
在 TableAdapterManager.UpdateAll 方法的执行期间,备份副本仅存在于内存中。因此,不存在对此备份数据集的编程访问,因为一旦 TableAdapterManager.UpdateAll 方法结束运行,此数据集就会替换原始数据集或超出范围。 |