本主题将介绍如何通过使用 Engine 对象来验证和修复已损坏的 Microsoft SQL Server Compact 3.5 数据库。有关使用 SqlServerCe 命名空间的详细信息,请参阅 SqlServerCe 命名空间参考文档。
SQL Server Compact 3.5 数据库文件被划分为以 4 KB 为单位的逻辑页面。当每个页面被写入数据库文件时,SQL Server Compact 3.5 将计算并保存该页的校验和。如果将页面写入文件后该页面被修改或损坏,则它将不再匹配它的预期校验和。
调用 System.Data.SqlServerCe.SqlCeEngine 类的 Verify 方法会重新计算数据库文件中每个页面的校验和,并验证校验和是否匹配它们的预期值。如果该方法返回 True,则表明没有数据库文件损坏。如果该方法返回 False,则表明数据库文件已经损坏,而应用程序应该调用 Repair 方法。
如果数据库文件已经损坏,您可以使用 SqlCeEngine 对象的 Repair 方法尝试恢复数据库文件。Repair 方法会扫描数据库并计算页面校验和。如果校验和与早先在将页面写入数据库时计算出的校验和不匹配,该页面便被视为已损坏。
在调用 Repair 方法时,有两个选项:
RepairOption.DeleteCorruptedRows
如果修复方法是利用 DeleteCorruptedRows 值调用的,那么所有损坏的页面都会被丢弃。如果损坏的页面中包含数据库架构,这将导致重大数据损失。但是,使用该选项恢复的数据应该不会损坏。
RepairOption.RecoverCorruptedRows
如果修复方法是使用 RecoverCorruptedRows 值调用的,那么数据库将尝试从损坏的页面中读取数据。这可能会恢复更多的数据,但是不能保证恢复的数据没有遭受逻辑损坏。
备注
只有在 SQL Server Compact 3.5 返回带有本机错误号 25017 (SSCE_M_DATABASECORRUPTED) 的错误时,或调用 SqlCeEngine 对象的 Verify 方法返回 false 时,Repair 方法才十分有用。
SQL Server Compact 3.5 的过程
验证数据库
创建 Engine 对象。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
调用 Verify 方法检查数据库是否有损坏的行。
if (false == engine.Verify()) {...}
修复数据库
如果数据库有损坏的行,则调用 Repair 方法对数据库进行修复。您可以根据需要选择传入 DeleteCorruptedRows 修复选项删除所有已损坏的行,或者选择传入 RecoverCorruptedRows 修复选项恢复已损坏的行。
engine.Repair(null, RepairOption.RecoverCorruptedRows);
为了创建区分大小写的修复数据库,请在 Repair 方法的连接字符串属性中设置区分大小写属性。有关区分大小写的数据库的详细信息,请参阅使用排序规则 (SQL Server Compact)。示例:
engine.Repair("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true;", RepairOption.RecoverCorruptedRows);
示例
此示例显示了如何验证 SQL Server Compact 3.5 数据库,以及在发现有损坏的行时,如何在恢复损坏行的数据的同时修复该数据库。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdventureWorks.sdf");
if (false == engine.Verify())
{
MessageBox.Show("Database is corrupted.");
engine.Repair(null, RepairOption.RecoverCorruptedRows);
}
Dim engine As New SqlCeEngine("Data Source = AdventureWorks.sdf")
If False = engine.Verify() Then
MessageBox.Show("Database is corrupted.")
engine.Repair(Nothing, RepairOption.RecoverCorruptedRows)
End If