共用方式為


如何:驗證及修復資料庫 (以程式設計方式)

在此主題中,您將學習如何使用 Engine 物件來驗證及修復損毀的 Microsoft SQL Server Compact 4.0 資料庫。如需有關使用 SqlServerCe 命名空間的詳細資訊,請參閱 SqlServerCe 命名空間參考文件集。

SQL Server Compact 資料庫檔案會分割成 4 KB 的邏輯單位,稱為頁面。在各個頁面寫入資料庫檔案時,SQL Server Compact 會計算並儲存該頁面的總和檢查碼。如果該頁面在寫入檔案之後受到修改或損毀,就不會符合預期的總和檢查碼。

呼叫 System.Data.SqlServerCe.SqlCeEngine 類別的 Verify 方法,會重新計算資料庫檔案中每個頁面的總和檢查碼,並且驗證其總和檢查碼是否符合預期的值。若此方法傳回 True,就表示沒有任何資料庫檔案損毀。若此方法傳回 False,則表示資料庫檔案已受損,而且應用程式應該呼叫 Repair 方法。

如果資料庫檔案受損,您可以使用 SqlCeEngine 物件的 Repair 方法,嘗試修復此資料庫。Repair 方法會掃描資料庫,並且計算頁面的總和檢查碼。如果總和檢查碼與先前該頁面寫入資料庫時所計算的總和檢查碼不符,就會認為此頁面已損毀。

以下是呼叫 Repair 方法時的選項:

  • RepairOption.RecoverAllOrFail

    如果使用 RecoverAllorFail 值來叫用 Repair 方法,只有當無資料遺失時,復原才會成功。如果偵測到資料遺失,則會停止復原,並擲回例外狀況。這是防止資料遺失及修復的資料庫損毀的最有效選項。

  • RepairOption.RecoverAllPossibleRows

    如果是使用 RecoverAllPossibleRows 值來叫用 Repair 方法,則資料庫會嘗試從損毀的頁面讀取所有資料,包括資料列。這可能會讓更多的資料得以復原。然而,使用此選項並不保證復原的資料沒有任何形式的損毀。

  • RepairOption.DeleteCorruptedRows

    若以 DeleteCorruptedRows 值叫用此修復方法,就會放棄所有已損毀的頁面。如果損毀的頁面含有資料列或資料庫結構描述,這可能會造成嚴重的資料遺失。然而,使用此選項復原的資料應該就不會含有損毀的部分。

  • RepairOption.RecoverCorruptedRows

    此選項在 SQL Server Compact 4.0 中已被取代。您應該改用 RecoverAllPossibleRows 選項。若以 RecoverCorruptedRows 值叫用此修復方法,資料庫就會嘗試讀取損毀頁面中的資料。這可能會復原較多的資料,但不保證復原的資料沒有任何邏輯損毀。

重要

管理員在使用 Repair 方法時及使用之後,都應該牢記以下要點。

  • Repair 方法並不保證可完整復原每一個資料庫的資料。某些形式的資料損毀無法完全修復,不論應用程式選取的 Repair 選項為何。

  • 管理員在修復來源資料庫之後,應該在目的地資料庫上執行 Verify 方法。

  • 不論選取的修復選項為何,Repair 方法都會將有關任何資料庫不一致的詳細資料寫入記錄檔中。這個檔案會寫入包含來源資料庫 .sdf 檔案的相同目錄中。應用程式或資料庫管理員應該檢查此記錄檔,以判斷產生的資料庫是否有效。

  • 當應用程式並未使用 RecoverAllOrFail 選項時,應用程式或資料庫管理員必須驗證產生的資料庫。其作法是檢查此記錄檔,以判斷資料庫是否可靠。

  • 如果您或應用程式無法驗證產生的資料庫,請從備份還原資料庫,或是手動重新建構資料庫。

SQL Server Compact 4.0 的程序

若要驗證資料庫

  1. 建立 Engine 物件。

    SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.sdf");
    
  2. 呼叫 Verify 方法,以檢查資料庫中損毀的資料列。

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

若要修復資料庫

  • 如果資料庫含有損毀的資料列,請呼叫 Repair 方法以修正資料庫。您可選擇傳入 DeleteCorruptedRows 修復選項以刪除所有損毀的資料列,或傳入 RecoverAllorFail 修復選項以嘗試復原損毀的資料列。

    engine.Repair (null, RepairOption.RecoverAllorFail );
    
  • 為了建立區分大小寫且已修復的資料庫,請使用 Repair 方法設定連接字串屬性內的 case sensitive 屬性。如需有關區分大小寫之資料庫的詳細資訊,請參閱<使用定序 (SQL Server Compact)>。範例:

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

範例

本範例顯示如何驗證 SQL Server Compact 資料庫,以及如果發現損毀的資料列,應如何修復資料庫並從損毀的資料列復原資料。

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

請參閱

概念

維護資料庫 (SQL Server Compact)