Condividi tramite


Procedura: Verifica e ripristino di un database (a livello di programmazione)

In questo argomento verrà descritto come verificare e ripristinare un database di Microsoft SQL Server Compact 3.5 danneggiato utilizzando l'oggetto Engine. Per ulteriori informazioni sull'utilizzo dello spazio dei nomi SqlServerCe, vedere la documentazione di riferimento dello spazio dei nomi SqlServerCe.

I file di database di SQL Server Compact 3.5 sono divisi in unità logiche di 4 KB, denominate pagine. Al momento della scrittura di ogni pagina nel file di database, SQL Server Compact 3.5 calcola e salva un valore di checksum per la pagina. In caso di modifica o danneggiamento della pagina dopo la scrittura nel file, la pagina non corrisponderà più al valore di checksum previsto.

Chiamando il metodo Verify della classe System.Data.SqlServerCe.SqlCeEngine, è possibile ricalcolare i valori di checksum di ogni pagina del file di database e verificare la corrispondenza con i valori previsti. Se il metodo restituisce true, non si è verificato alcun danneggiamento del file di database. Se restituisce false, il file di database è stato danneggiato e l'applicazione deve chiamare il metodo Repair.

In caso di danneggiamento di un file di database, è possibile tentare di recuperare il file di database utilizzando il metodo Repair dell'oggetto SqlCeEngine. Il metodo Repair esegue l'analisi del database e calcola i valori di checksum delle pagine. Se un valore di checksum non corrisponde a quello calcolato in precedenza, al momento della scrittura della pagina nel database, la pagina sarà considerata danneggiata.

Per la chiamata del metodo Repair sono disponibili due opzioni:

  • RepairOption.DeleteCorruptedRows

    Se il metodo Repair viene richiamato con il valore DeleteCorruptedRows, verranno eliminate tutte le pagine danneggiate. Se la pagina danneggiata contiene lo schema del database, potrebbe verificarsi una grave perdita di dati. I dati recuperati utilizzando questa opzione, tuttavia, non dovrebbero essere in alcun modo danneggiati.

  • RepairOption.RecoverCorruptedRows

    Se il metodo Repair viene richiamato con il valore RecoverCorruptedRows , il database tenterà di leggere i dati delle pagine danneggiate. È così possibile recuperare una maggiore quantità di dati, ma ciò non garantisce che i dati recuperati non siano danneggiati a livello logico.

Nota

Il metodo Repair è utile soltanto se SQL Server Compact 3.5 restituisce un errore con numero di errore nativo 25017 (SSCE_M_DATABASECORRUPTED) oppure se una chiamata al metodo Verify dell'oggetto SqlCeEngine restituisce false.

Procedure per SQL Server Compact 3.5

Per verificare un database

  1. Creare un oggetto Engine.

    SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
    
  2. Chiamare il metodo Verify per verificare la presenza di righe danneggiate nel database.

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

Per ripristinare un database

  • Se nel database sono presenti righe danneggiate, chiamare il metodo Repair per correggerlo. È possibile scegliere di eliminare tutte le righe danneggiate passando l'opzione di correzione DeleteCorruptedRows oppure tentare di recuperare le righe danneggiate passando l'opzione di correzione RecoverCorruptedRows.

    engine.Repair(null, RepairOption.RecoverCorruptedRows);
    
  • Per creare un database corretto con distinzione tra maiuscole e minuscole, impostare la proprietà Case Sensitive nella stringa di connessione del metodo Repair. Per ulteriori informazioni sui database con distinzione tra maiuscole e minuscole, vedere Utilizzo delle regole di confronto (SQL Server Compact). Esempio:

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

Esempio

In questo esempio viene illustrato come verificare un database di SQL Server Compact 3.5 e, in caso di presenza di righe danneggiate, come correggere il database recuperando i dati dalle righe danneggiate.

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

Vedere anche

Altre risorse

Gestione di database (SQL Server Compact)