如何:壓縮資料庫 (以程式設計的方式)
在此主題中,您將了解如何使用 SqlServerCe.Engine 物件的 Compact 方法和 SqlServerCe.Engine 物件的 Shrink 方法來壓縮 SQL Server Compact 4.0 資料庫。Compact 和 Shrink 方法在減少資料庫大小的方式上稍微有些不同。
您可以使用 Compact 方法來回收資料庫檔案中的空間。您也可以使用這種方法來變更資料庫設定,例如密碼和地區設定識別碼 (LCID) 等設定。當您以 Compact 方法壓縮資料庫時,系統會建立新的資料庫檔案和重組資料表頁面,以使這些頁面存在於相鄰的資料庫頁面中,並將所有的資料庫資料重新寫入新資料頁面中,以回收未使用的空間。
您也可以使用 Shrink 方法來回收資料庫檔案中的空間。不過,由於 Shrink 方法不會建立新的資料庫檔案,而只會重組記錄並刪除空白記錄,因此您無法使用 Shrink 方法來變更資料庫設定。
此外,本主題也會提供有關如何使用 Compact 方法來變更 SQL Server Compact 資料庫之區分大小寫設定的資訊。
如需有關 Compact 和 Shrink 的詳細資訊,請參閱<維護資料庫 (SQL Server Compact)>。如需有關使用 SqlServerCe 命名空間的詳細資訊,請參閱 SqlServerCe 命名空間參考文件集。
SQL Server Compact 4.0 的程序
若要壓縮資料庫
建立 Engine 物件,並傳遞到您要壓縮之現有資料庫的連接字串中。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
呼叫 Compact 方法。當呼叫 Compact 方法時,也可以指定新的資料庫屬性,包括加入密碼保護或加密。
engine.Compact("Data Source=; Password = <enterStrongPasswordHere>");
若要壓縮資料庫
建立 Engine 物件,並傳入您要壓縮之資料庫的連接字串。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdWks.sdf");
呼叫 Shrink 方法。
engine.Shrink();
變更壓縮資料庫的區分大小寫設定
建立 Engine 物件,並傳遞到您要壓縮之現有資料庫的連接字串中。
SqlCeEngine engine = new SqlCeEngine("Data Source= Test.sdf; LCID= 1033");
呼叫 Compact 方法。當您呼叫 Compact 方法時,也可以指定新的資料庫屬性,如區分大小寫。如果您在呼叫 Compact 方法時並未指定 "Case Sensitive",就不會變更區分大小寫的設定。
engine.Compact("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true");
注意
SQL Server Compact SP1 版本中開始導入區分大小寫的設定。如需詳細資訊,請參閱<使用定序 (SQL Server Compact)>。
範例
此範例壓縮現有的 SQL Server Compact 資料庫,並顯示如何變更資料庫屬性。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdventureWorks.sdf");
// Specify null destination connection string for in-place compaction
//
engine.Compact(null);
// Specify connection string for new database options
//
engine.Compact("Data Source=; Password =<enterStrongPasswordHere>");
Dim engine As New SqlCeEngine("Data Source = AdventureWorks.sdf")
' Specify null destination connection string for in-place compaction
engine.Compact(Nothing)
' Specify connection string for new database options
'
engine.Compact("Data Source=; Password =<enterStrongPasswordHere>")
本範例壓縮現有的 SQL Server Compact 資料庫。
SqlCeEngine engine = new SqlCeEngine("Data Source = AdventureWorks.sdf");
engine.Shrink();
Dim engine As New SqlCeEngine("Data Source = AdventureWorks.sdf")
engine.Shrink()
下列範例示範如何使用 Compact 方法來變更 SQL Server Compact 資料庫的區分大小寫設定。然後,此程式碼範例會呼叫 GetDatabaseInfo 方法來擷取資料庫的地區設定、加密模式和區分大小寫的值。
// Default case-insentive connection string.
string connStringCI = "Data Source= Test.sdf; LCID= 1033";
// Set "Case Sensitive" to true to change the collation from CI to CS.
string connStringCS =
"Data Source= Test.sdf; LCID= 1033; Case Sensitive=true";
if (File.Exists("Test.sdf"))
{
File.Delete("Test.sdf");
}
SqlCeEngine engine = new SqlCeEngine(connStringCI);
// The collation of the database is case-insensitive.
engine.CreateDatabase();
// The collation of the database will be case-sensitive because of
// the new connection string used by the Compact method.
engine.Compact(connStringCS);
SqlCeConnection conn = null;
conn = new SqlCeConnection(connStringCS);
conn.Open();
//Retrieve the connection string information - notice the 'Case
// Sensitive' value.
List<KeyValuePair<string, string>> dbinfo = conn.GetDatabaseInfo();
Console.WriteLine("\nGetDatabaseInfo() results:");
foreach (KeyValuePair<string, string> kvp in dbinfo)
{
Console.WriteLine(kvp);
}
' Default case-insentive connection string.
Dim connStringCI As String = "Data Source= Test.sdf; LCID= 1033"
' Set "Case Sensitive" to true to change the collation from CI to CS.
Dim connStringCS As String = "Data Source= Test.sdf; LCID= 1033; Case Sensitive=true"
If File.Exists("Test.sdf") Then
File.Delete("Test.sdf")
End If
Dim engine As New SqlCeEngine(connStringCI)
' The collation of the database is case insensitive.
engine.CreateDatabase()
' The collation of the database will be case sensitive because of
' the new connection string used by the Compact method.
engine.Compact(connStringCS)
Dim conn As SqlCeConnection = Nothing
conn = New SqlCeConnection(connStringCS)
conn.Open()
'Retrieve the connection string information - notice the 'Case Sensitive' value.
Dim dbinfo As List(Of KeyValuePair(Of String, String)) = conn.GetDatabaseInfo
Console.WriteLine(vbNewLine & "GetDatabaseInfo() results:")
Dim kvp As KeyValuePair(Of String, String)
For Each kvp In dbinfo
Console.WriteLine(kvp)
Next