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 4.0 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 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 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.

A continuación se muestran las opciones cuando se llama al método Repair:

  • RepairOption.RecoverAllOrFail

    Si se llama al método Repair utilizando el valor RecoverAllorFail, la recuperación será correcta solo si no hay ninguna pérdida de datos. Si se detecta una pérdida de datos, la recuperación se detiene y se produce una excepción. Esta es la opción más eficaz para proteger la base de datos reparada de daños y de pérdida de datos.

  • RepairOption.RecoverAllPossibleRows

    Si se llama al método Repair utilizando el valor RecoverAllPossibleRows, la base de datos intentará leer todos los datos, incluidas las filas de las páginas dañadas. Esto conduce potencialmente a la recuperación de más datos. Sin embargo, esta opción no garantiza que los datos recuperados no tengan algún tipo de daño.

  • RepairOption.DeleteCorruptedRows

    Si se llama al método Repair con el valor DeleteCorruptedRows, todas las páginas dañadas se descartarán. Esto puede producir una pérdida de datos significativa si la página dañada contiene filas de datos o el esquema de la base de datos. No obstante, los datos recuperados mediante el uso de esta opción no deben estar dañados.

  • RepairOption.RecoverCorruptedRows

    La opción queda desusada SQL Server Compact 4.0. En su lugar, debe utilizar la opción RecoverAllPossibleRows. Si se llama al método Repair con el valor RecoverCorruptedRows , la base de datos intentará leer los datos de las páginas dañadas. Esto puede hacer que se recuperen más datos, pero no se garantiza que los datos recuperados no tengan daños lógicos.

Importante

El administrador debe recordar los puntos siguientes durante y después del uso del método Repair.

  • El método Repair no garantiza la recuperación de todos los datos de todas las bases de datos. Algunas formas de daños de datos no se pueden reparar totalmente, independientemente de la opción Repair seleccionada por la aplicación.

  • El administrador debe ejecutar el método Verify en la base de datos de destino después de reparar la base de datos de origen.

  • Con independencia de la opción de reparación seleccionada, el método Repair escribirá detalles de las incoherencias de base de datos en un archivo de registro. Este archivo se escribe en el mismo directorio que contiene el archivo .sdf de la base de datos de origen. La aplicación o un administrador de bases de datos deben examinar este archivo de registro para determinar si la base de datos resultante es válida.

  • Cuando la aplicación no utiliza la opción RecoverAllOrFail, es responsabilidad de la aplicación o del administrador de bases de datos validar la base de datos resultante. Esto se consigue examinando el archivo de registro para determinar si las base de datos es confiable.

  • Si usted o la aplicación no pueden validar la base de datos resultante, restáurela a partir de una copia de seguridad o vuelva a crearla manualmente.

Procedimientos para SQL Server Compact 4.0

Para comprobar una base de datos

  1. Cree un objeto Engine.

    SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.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 RecoverAllorFail.

    engine.Repair (null, RepairOption.RecoverAllorFail );
    
  • 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.RecoverAllorFail );
    

Ejemplo

En este ejemplo se muestra cómo comprobar una base de datos de SQL Server Compact 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.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

Vea también

Conceptos

Mantener bases de datos (SQL Server Compact)