Procédure : vérifier et réparer une base de données (par programme)
Dans cette rubrique, vous allez apprendre à vérifier et à réparer une base de données Microsoft SQL Server Compact 4.0 endommagée à l'aide de l'objet Engine. Pour plus d'informations sur l'utilisation de l'espace de noms SqlServerCe, consultez la documentation de référence sur l'espace de noms SqlServerCe.
Les fichiers de base de données SQL Server Compact sont divisés en unités logiques de 4 Ko appelées « pages ». Chaque page étant écrite dans le fichier de base de données, SQL Server Compact calcule et enregistre une somme de contrôle pour la page. Si la page est modifiée ou endommagée une fois écrite dans le fichier, elle ne correspond plus à sa somme de contrôle attendue.
Appelez la méthode Verify de la classe System.Data.SqlServerCe.SqlCeEngine pour recalculer les sommes de contrôle de chaque page du fichier de base de données et vérifier que les sommes de contrôle correspondent aux valeurs attendues. Si cette méthode renvoie la valeur true, cela indique que le fichier de base de données n'a pas été endommagé. Si elle renvoie la valeur false, cela signifie que le fichier de base de données a été endommagé, auquel cas l'application doit appeler la méthode Repair.
En cas d'altération d'un fichier de base de données, vous pouvez essayer de le récupérer à l'aide de la méthode Repair de l'objet SqlCeEngine. La méthode Repair analyse la base de données et calcule les sommes de contrôle des pages. Si une somme de contrôle ne correspond pas à la somme de contrôle qui avait été calculée lors de l'écriture de la page dans la base de données, la page est considérée comme altérée.
Les options suivantes permettent d'appeler la méthode Repair :
RepairOption.RecoverAllOrFail
Si la méthode de réparation est appelée en utilisant la valeur RecoverAllorFail, la récupération réussira uniquement s'il n'y a aucune perte de données. Si une perte de données est détectée, la récupération est interrompue et une exception est levée. Cette option est la plus efficace pour se protéger contre la perte de données et l'altération de la base de données réparée.
RepairOption.RecoverAllPossibleRows
Si la méthode de réparation est appelée en utilisant la valeur RecoverAllPossibleRows, la base de données tentera de lire toutes les données, y compris celles des pages endommagées. Ainsi, il est possible de récupérer davantage de données. Cependant, l'utilisation de cette option ne garantit pas que les données récupérées seront exemptes d'altération.
RepairOption.DeleteCorruptedRows
Si vous appelez la méthode de réparation avec la valeur DeleteCorruptedRows, toutes les pages endommagées sont rejetées. Si la page altérée contient des lignes de données ou un schéma de base de données, la perte de données peut se révéler importante. Toutefois, les données récupérées à l'aide de cette option doivent être exemptes d'altération.
RepairOption.RecoverCorruptedRows
Cette option est déconseillée dans SQL Server Compact 4.0. Vous devez utiliser RecoverAllPossibleRows à la place. Si vous appelez la méthode de réparation avec la valeur RecoverCorruptedRows , la base de données essaie de lire les données à partir des pages endommagées. Cette opération peut permettre la récupération d'une plus grande quantité de données mais ne garantit pas que celles-ci soient exemptes d'altération logique.
Important
L'administrateur doit garder à l'esprit les points suivants lors de l'utilisation de la méthode Repair et après l'avoir utilisée.
-
La méthode Repair ne garantit la récupération complète des données pour chaque base de données. Certaines formes de données endommagées ne peuvent pas être réparées complètement, quelle que soit l'option Repair sélectionnée par l'application.
-
L'administrateur doit exécuter la méthode Verify sur la base de données de destination, après avoir réparé la base de données source.
-
Indépendamment de l'option de réparation sélectionnée, la méthode Repair écrit les détails de toute incohérence détectée dans la base de données dans un fichier journal. Ce fichier est écrit dans le même répertoire que celui qui contient le fichier .sdf de la base de données source. L'application ou un administrateur de base de données doit vérifier ce fichier journal pour déterminer si la base de données résultante est valide.
-
Si l'application n'utilise pas l'option RecoverAllOrFail, il incombe à l'application ou à l'administrateur de la base de données de valider la base de données résultante. Pour effectuer cette opération, il doit vérifier le fichier journal afin de déterminer si la base de données est fiable.
-
Si vous ou l'application ne pouvez pas valider la base de données résultante, restaurez la base de données à partir d'une sauvegarde, ou reconstruisez manuellement la base de données.
Procédures pour SQL Server Compact 4.0
Pour vérifier une base de données
Créez un objet Engine.
SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.sdf");
Appelez la méthode Verify pour examiner si la base de données contient des lignes endommagées.
if (false == engine.Verify()) {...}
Pour réparer une base de données
Si la base de données contient des lignes endommagées, appelez la méthode Repair pour réparer la base de données. Vous pouvez choisir de supprimer toutes les lignes endommagées en passant l'option de réparation DeleteCorruptedRows ou tenter de récupérer les lignes endommagées en passant l'option de réparation RecoverAllorFail.
engine.Repair (null, RepairOption.RecoverAllorFail );
Pour créer une base de données réparée qui respecte la casse, définissez la propriété de respect de la casse dans la propriété de chaîne de connexion de la méthode Repair. Pour plus d'informations sur les bases de données qui respectent la casse, consultez Utilisation des classements (SQL Server Compact). Exemple :
engine.Repair("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true;", RepairOption.RecoverAllorFail );
Exemple
Cet exemple illustre comment vérifier une base de données SQL Server Compact et, si des lignes endommagées sont détectées, comment réparer la base de données tout en récupérant les données des lignes endommagées.
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