如何:驗證及修復資料庫 (以程式設計方式)
在此主題中,您將學習如何使用 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 方法時有兩個選項:
RepairOption.DeleteCorruptedRows
若以 DeleteCorruptedRows 值叫用此修復方法,就會放棄所有已損毀的頁面。如果損毀的頁面含有資料庫結構描述,這可能會造成嚴重的資料遺失。然而,使用此選項復原的資料應該就不會含有損毀的部分。
RepairOption.RecoverCorruptedRows
若以 RecoverCorruptedRows 值叫用此修復方法,資料庫就會嘗試讀取損毀頁面中的資料。這可能會復原較多的資料,但不保證復原的資料沒有任何邏輯損毀。
注意
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 方法設定連接字串屬性內的 case sensitive 屬性。如需有關區分大小寫之資料庫的詳細資訊,請參閱<使用定序 (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