データベースを検証および修復する方法 (プログラム)
このトピックでは、Engine オブジェクトを使用して、破損した Microsoft SQL Server Compact 3.5 データベースを検証し、修復する方法について学習します。SqlServerCe 名前空間の使用については、SqlServerCe 名前空間のリファレンス ドキュメントを参照してください。
SQL Server Compact 3.5 データベース ファイルは、4 KB 単位の論理的な名前付きページに分割されています。各ページがデータベース ファイルに書き込まれると、SQL Server Compact 3.5 によってそのページのチェックサムが計算され、保存されます。ファイルに書き込まれた後でページが変更されたり破損した場合、そのページのチェックサムは予想されたものと一致しなくなります。
System.Data.SqlServerCe.SqlCeEngine クラスの Verify メソッドを呼び出すと、データベース ファイル内のすべてのページのチェックサムが再計算され、それらのチェックサムが予想された値と一致するかどうかが検証されます。このメソッドが true を返した場合、データベース ファイルの破損はありません。このメソッドが false を返した場合、データベース ファイルが破損しています。アプリケーションで Repair メソッドを呼び出す必要があります。
データベース ファイルが破損した場合、SqlCeEngine オブジェクトの Repair メソッドを使用して、データベース ファイルを修復できます。Repair メソッドを使用すると、データベースがスキャンされ、ページ チェックサムが計算されます。このチェックサムが、ページがデータベースに書き込まれたときに計算されたチェックサムに一致しない場合、ページは破損していると見なされます。
Repair メソッドの呼び出しでは 2 つのオプションを使用できます。
RepairOption.DeleteCorruptedRows
DeleteCorruptedRows 値を使用して Repair メソッドを呼び出した場合、すべての破損ページが破棄されます。この場合、破損ページにデータベース スキーマが含まれていると、重要なデータの損失が発生する可能性があります。しかし、このオプションを使って修復したデータには破損が含まれません。
RepairOption.RecoverCorruptedRows
RecoverCorruptedRows 値を使用して Repair メソッドを呼び出した場合、破損ページからのデータの読み取りが試行されます。この場合、より多くのデータが修復されますが、修復されたデータに論理上の破損が含まれている可能性があります。
注意
Repair メソッドが役立つのは、SQL Server Compact 3.5 がネイティブ エラー番号 25017 (SSCE_M_DATABASECORRUPTED) のエラーを返すか、SqlCeEngine オブジェクトの Verify メソッドへの呼び出しで false が返される場合のみです。
SQL Server Compact 3.5 での手順
データベースを検証するには
Engine オブジェクトを作成します。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
Verify メソッドを呼び出して、データベースに破損した行があるかどうかを調べます。
if (false == engine.Verify()) {...}
データベースを修復するには
データベースに破損した行がある場合、Repair メソッドを呼び出してデータベースを修正します。破損した行をすべて削除する場合は DeleteCorruptedRows 修復オプションを渡し、破損した行の修復を試みる場合は RecoverCorruptedRows 修復オプションを渡します。
engine.Repair(null, RepairOption.RecoverCorruptedRows);
大文字と小文字が区別される修復データベースを作成するには、Repair メソッドの接続文字列プロパティで、大文字と小文字の区別のプロパティを設定します。大文字と小文字が区別されるデータベースの詳細については、「照合順序の使用 (SQL Server Compact)」を参照してください。次に例を示します。
engine.Repair("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true;", RepairOption.RecoverCorruptedRows);
使用例
次の例は、SQL Server Compact 3.5 データベースを検証する方法、および破損した行が見つかった場合に、破損した行のデータを修復しつつ、データベースを修復する方法を示しています。
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