如何验证和修复数据库(以编程方式)

本主题将介绍如何通过使用 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 的过程

验证数据库

  1. 创建 Engine 对象。

    SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
    
  2. 调用 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

请参阅

其他资源

维护数据库 (SQL Server Compact)