Procedura: Verifica e ripristino di un database (a livello di codice)
In questo argomento verrà descritto come verificare e ripristinare un database di Microsoft SQL Server Compact 4.0 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 sono divisi in unità logiche di 4 KB, denominate pagine. Al momento della scrittura di ogni pagina nel file di database, SQL Server Compact 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.
In caso di chiamata al metodo Repair, sono disponibili le opzioni seguenti:
RepairOption.RecoverAllOrFail
Se il metodo Repair viene richiamato utilizzando il valore RecoverAllorFail, il recupero verrà completato solo se non si verifica alcuna perdita di dati. In tal caso, il recupero verrà arrestato e verrà generata un'eccezione. Si tratta dell'opzione più efficiente per la protezione dalla perdita e dal danneggiamento di dati del database ripristinato.
RepairOption.RecoverAllPossibleRows
Se il metodo Repair viene richiamato utilizzando il valore RecoverAllPossibleRows, verrà eseguito un tentativo di lettura di tutti i dati, righe incluse, contenuti nelle pagine danneggiate. Utilizzando tale opzione, il numero di dati recuperati potrebbe essere maggiore, tuttavia non ne sarà garantita l'integrità.
RepairOption.DeleteCorruptedRows
Se il metodo Repair viene richiamato con il valore DeleteCorruptedRows, verranno eliminate tutte le pagine danneggiate. Se nella pagina danneggiata sono contenute righe di dati o è contenuto 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
Questa opzione è deprecata in SQL Server Compact 4.0. È necessario utilizzare invece l'opzione RecoverAllPossibleRows. Se il metodo Repair viene richiamato con il valore RecoverCorruptedRows , tramite il database verrà tentata la lettura dei 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.
Importante
L'amministratore deve ricordare i punti seguenti durante e dopo l'utilizzo del metodo Repair.
-
L'utilizzo del metodo Repair non garantisce il recupero completo dei dati di ogni database. Alcune forme di danneggiamento di dati non possono essere ripristinate del tutto, indipendentemente dall'opzione Repair selezionata dall'applicazione.
-
L'amministratore deve eseguire il metodo Verify nel database di destinazione, dopo il ripristino del database di origine.
-
Indipendentemente dall'opzione di ripristino selezionata, i dettagli relativi a qualsiasi incoerenza del database verranno scritti dal metodo Repair in un file di log. Questo file viene scritto nella stessa directory in cui è contenuto il file con estensione sdf del database di origine. Per determinare se il database risultante è valido, tale file di log deve essere esaminato dall'applicazione o da un amministratore di database.
-
Se nell'applicazione non viene utilizzata l'opzione RecoverAllOrFail, è responsabilità dell'applicazione o dell'amministratore di database convalidare il database risultante. A tale scopo, esaminare il file di log per determinare se il database è affidabile.
-
Se la convalida del database risultante non può essere eseguita dall'utente o dall'applicazione, ripristinare il database da un backup o ricostruire manualmente il database.
Procedure per SQL Server Compact 4.0
Per verificare un database
Creare un oggetto Engine.
SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.sdf");
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 RecoverAllorFail.
engine.Repair (null, RepairOption.RecoverAllorFail );
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.RecoverAllorFail );
Esempio
In questo esempio viene illustrato come verificare un database di SQL Server Compact 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.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