Cómo comprobar y reparar una base de datos (mediante programación)

En este tema aprenderá a comprobar y reparar una base de datos dañada de Microsoft SQL Server Compact 3.5 mediante el objeto Engine. Para obtener más información sobre cómo usar el espacio de nombres SqlServerCe, vea la documentación de referencia sobre el espacio de nombres SqlServerCe.

Los archivos de base de datos de SQL Server Compact 3.5 se dividen en unidades lógicas de 4 KB denominadas páginas. A medida que cada página se escribe en el archivo de base de datos, SQL Server Compact 3.5 calcula y guarda una suma de comprobación de esa página. Si la página se modifica o se daña después de escribirse en el archivo, ya no coincidirá con la suma de comprobación esperada.

Si se llama al método Verify de la clase System.Data.SqlServerCe.SqlCeEngine, se vuelven a calcular las sumas de comprobación de todas las páginas del archivo de base de datos y se comprueba que las sumas de comprobación coincidan con los valores esperados. Si el método devuelve true, el archivo de base de datos no está dañado. Si el método devuelve false, el archivo de base de datos se ha dañado y la aplicación deberá llamar al método Repair.

Si un archivo de base de datos resulta dañado, se puede intentar recuperar mediante el método Repair del objeto SqlCeEngine. El método Repair examina la base de datos y calcula las sumas de comprobación de la página. Si una suma de comprobación no coincide con la suma de comprobación calculada previamente cuando se escribió la página en la base de datos, dicha página se considera dañada.

Existen dos opciones para llamar al método Repair:

  • RepairOption.DeleteCorruptedRows

    Si el método de reparación se invoca con el valor DeleteCorruptedRows, las páginas dañadas se descartarán. Esto puede causar una pérdida de datos considerable si la página dañada contiene el esquema de la base de datos. No obstante, los datos recuperados mediante el uso de esta opción ya no deberían estar dañados.

  • RepairOption.RecoverCorruptedRows

    Si el método de reparación se invoca con el valor RecoverCorruptedRows , la base de datos intentará leer los datos de las páginas dañadas. De esta forma pueden recuperarse más datos, pero no se garantiza que los datos recuperados no tengan errores lógicos.

Nota

El método Repair solo es útil si SQL Server Compact 3.5 devuelve un error con el número de error nativo 25017 (SSCE_M_DATABASECORRUPTED) o si una llamada al método Verify del objeto SqlCeEngine devuelve false.

Procedimientos para SQL Server Compact 3.5

Para comprobar una base de datos

  1. Cree un objeto Engine.

    SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
    
  2. Llame al método Verify para comprobar si la base de datos tiene filas dañadas.

     if (false == engine.Verify()) {...}
    

Para reparar una base de datos

  • Si la base de datos contiene filas dañadas, llame al método Repair para arreglarla. Se puede elegir entre eliminar todas las filas dañadas pasando la opción de reparación DeleteCorruptedRows, o intentar recuperarlas pasando la opción de reparación RecoverCorruptedRows.

    engine.Repair(null, RepairOption.RecoverCorruptedRows);
    
  • Para crear una base de datos reparada con distinción de mayúsculas y minúsculas, establezca la propiedad case sensitive en la propiedad de la cadena de conexión del método Repair. Para obtener más información acerca de las bases de datos con distinción de mayúsculas y minúsculas, vea Trabajar con intercalaciones (SQL Server Compact). Ejemplo:

    engine.Repair("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true;", RepairOption.RecoverCorruptedRows);
    

Ejemplo

En este ejemplo se muestra cómo comprobar una base de datos de SQL Server Compact 3.5 y, en caso de encontrar filas dañadas, cómo repararla al tiempo que se recuperan los datos de dichas filas dañadas.

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

Vea también

Otros recursos

Mantener bases de datos (SQL Server Compact)