如何验证和修复数据库(以编程方式)
本主题将介绍如何通过使用 Engine 对象来验证和修复已损坏的 Microsoft SQL Server Compact 4.0 数据库。有关使用 SqlServerCe 命名空间的详细信息,请参阅 SqlServerCe 命名空间参考文档。
SQL Server Compact 数据库文件被划分为以 4 KB 为单位的逻辑页面。当每个页面被写入数据库文件时,SQL Server Compact 将计算并保存该页的校验和。如果将页面写入文件后该页面被修改或损坏,则它将不再匹配它的预期校验和。
调用 System.Data.SqlServerCe.SqlCeEngine 类的 Verify 方法会重新计算数据库文件中每个页面的校验和,并验证校验和是否匹配它们的预期值。如果该方法返回 True,则表明没有数据库文件损坏。如果该方法返回 False,则表明数据库文件已经损坏,而应用程序应该调用 Repair 方法。
如果数据库文件已经损坏,您可以使用 SqlCeEngine 对象的 Repair 方法尝试恢复数据库文件。Repair 方法会扫描数据库并计算页面校验和。如果校验和与早先在将页面写入数据库时计算出的校验和不匹配,该页面便被视为已损坏。
下面是在调用 Repair 方法时的有关选项:
RepairOption.RecoverAllOrFail
如果通过使用 RecoverAllorFail 值调用 Repair 方法,则只有在没有数据丢失时恢复将成功。如果检测到数据丢失,则恢复将停止,并且将引发异常。这是避免数据丢失和修复的数据库损坏的最有效的选项。
RepairOption.RecoverAllPossibleRows
如果通过使用 RecoverAllPossibleRows 值调用 Repair 方法,则数据库将尝试读取所有数据,包括来自损坏页的行。这样可以导致更多的数据得到恢复。但是,此选项不保证恢复的数据没有任何类型的损坏。
RepairOption.DeleteCorruptedRows
如果修复方法是利用 DeleteCorruptedRows 值调用的,那么所有损坏的页面都会被丢弃。如果损坏的页面中包含数据行或数据库架构,这将导致重大数据损失。但是,使用该选项恢复的数据应该不会损坏。
RepairOption.RecoverCorruptedRows
该选项在 SQL Server Compact 4.0 中已废弃。您应该改用 RecoverAllPossibleRows 选项。如果修复方法是使用 RecoverCorruptedRows 值调用的,那么数据库将尝试从损坏的页面中读取数据。这可能会恢复更多的数据,但是不能保证恢复的数据没有遭受逻辑损坏。
重要
在使用 Repair 方法时和之后,管理员应该记住以下要点。
-
Repair 方法不保证完整恢复每个数据库的数据。某些形式的数据损坏无法完全修复,无论应用程序是否选择了 Repair 选项。
-
管理员应该在修复源数据库后,对目标数据库运行 Verify 方法。
-
无论选择了哪一修复选项,Repair 方法都会将与任何数据库不一致有关的详细信息写入某一日志文件。该文件将写入包含源数据库 .sdf 文件的同一个目录。应用程序或数据库管理员应该检查此日志文件,以便确定最终生成的数据库是否有效。
-
在应用程序未使用 RecoverAllOrFail 选项时,应用程序管理员或数据库管理员负责对最终生成的数据库进行验证。这是通过检查该日志文件以便确定数据库是否可靠来实现的。
-
如果您或应用程序无法验证最终生成的数据库,则从备份还原数据库或手动重新构建数据库。
SQL Server Compact 4.0 的过程
验证数据库
创建 Engine 对象。
SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.sdf");
调用 Verify 方法检查数据库是否有损坏的行。
if (false == engine.Verify()) {...}
修复数据库
如果数据库有损坏的行,则调用 Repair 方法对数据库进行修复。您可以根据需要选择传入 DeleteCorruptedRows 修复选项删除所有已损坏的行,或者选择传入 RecoverAllorFail 修复选项恢复已损坏的行。
engine.Repair (null, RepairOption.RecoverAllorFail );
为了创建区分大小写的修复数据库,请在 Repair 方法的连接字符串属性中设置区分大小写属性。有关区分大小写的数据库的详细信息,请参阅使用排序规则 (SQL Server Compact)。示例:
engine.Repair("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true;", RepairOption.RecoverAllorFail );
示例
此示例显示了如何验证 SQL Server Compact 数据库,以及在发现有损坏的行时,如何在恢复损坏行的数据的同时修复该数据库。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdventureWorks.sdf");
if (false == engine.Verify())
{
MessageBox.Show("Database is corrupted.");
engine.Repair(null, RepairOption.RecoverAllorFail);
}
Dim engine As New SqlCeEngine("Data Source = AdventureWorks.sdf")
If False = engine.Verify() Then
MessageBox.Show("Database is corrupted.")
engine.Repair(Nothing, RepairOption.RecoverAllorFail)
End If