SQL Server Mobile (後改名 SQL Server Compact / SQL CE) 是嵌入式資料庫,適用行動裝置、桌面單機應用。本文整理核心操作範例,涵蓋生命週期管理、同步複寫、RDA 遠端資料存取、SqlCeResultSet 高效能資料繫結與例外處理。
SqlCeEngine:資料庫建立、驗證、修復、壓縮、收縮。SqlCeConnection/SqlCeCommand:ADO.NET 標準連線命令。SqlCeReplication:合併式複寫 (Merge Replication)。SqlCeRemoteDataAccess:RDA (Remote Data Access) 拉取/推送。SqlCeResultSet:可捲動、可更新、偵測變更的高效能游標。
string connStr = "Data Source='Test.sdf'; Password='P@ssw0rd'; Encrypt=True;";
if (File.Exists("Test.sdf")) File.Delete("Test.sdf");
using (var engine = new SqlCeEngine(connStr))
engine.CreateDatabase();
using (var engine = new SqlCeEngine("Data Source=App.sdf; Password='...';"))
{
if (!engine.Verify())
{
MessageBox.Show("資料庫損毀,嘗試修復...");
engine.Repair(null, RepairOption.RecoverCorruptedRows);
}
}
// 產生新檔
engine.Compact("Data Source=App_Compact.sdf; Password='NewPwd'; Encrypt=True;");
// 就地壓縮 (覆寫原檔)
engine.Compact(null);
engine.Shrink(); // 較快但空間回收較不徹底
using (var repl = new SqlCeReplication())
{
repl.InternetUrl = "https://server/sqlcesa30.dll";
repl.InternetLogin = "webUser";
repl.InternetPassword = "webPwd";
repl.Publisher = "PubServer";
repl.PublisherDatabase = "PubDB";
repl.PublisherLogin = "pubUser";
repl.PublisherPassword = "pubPwd";
repl.Publication = "SalesPublication";
repl.Subscriber = "MobileDevice01";
repl.SubscriberConnectionString = "Data Source=Local.sdf; Password='...';";
repl.AddSubscription(AddOption.CreateDatabase); // 建立本地訂閱
repl.Synchronize(); // 同步
}
using (var rda = new SqlCeRemoteDataAccess())
{
rda.InternetUrl = "https://server/sqlcesa30.dll";
rda.InternetLogin = "webUser";
rda.InternetPassword = "webPwd";
rda.LocalConnectionString = "Data Source=Local.sdf; Password='...';";
// 從 SQL Server 拉取資料
rda.Pull(
"Employees", // 本地資料表名
"SELECT * FROM DimEmployee", // 遠端查詢
"Provider=SQLOLEDB;Server=...;Database=AdventureWorks;Uid=sa;Pwd=...;",
RdaTrackOption.TrackingOnWithIndexes,
"ErrorTable");
// 修改本地資料後推回伺服器
rda.Push("DimEmployee", "Provider=SQLOLEDB;...;");
// 在伺服器執行 DDL
rda.SubmitSql("CREATE TABLE Log (Id INT)", "Provider=SQLOLEDB;...;");
}
using (var conn = new SqlCeConnection("Data Source=Northwind.sdf;"))
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM Orders";
conn.Open();
var options = ResultSetOptions.Scrollable | ResultSetOptions.Updatable | ResultSetOptions.Sensitive;
using (var rs = cmd.ExecuteResultSet(options))
{
// 只顯示特定欄位 (0-based ordinal)
var view = rs.CreateResultSetView(new[] { 1, 3, 5, 8 });
dataGrid.DataSource = view;
}
}
public static void ShowSqlCeErrors(SqlCeException ex)
{
var sb = new StringBuilder();
foreach (SqlCeError err in ex.Errors)
{
sb.AppendLine($"Error Code: 0x{err.HResult:X}");
sb.AppendLine($"Message: {err.Message}");
sb.AppendLine($"Native Error: {err.NativeError}");
sb.AppendLine($"Source: {err.Source}");
foreach (int num in err.NumericErrorParameters)
if (num != 0) sb.AppendLine($"Num Param: {num}");
foreach (string str in err.ErrorParameters)
if (!string.IsNullOrEmpty(str)) sb.AppendLine($"Err Param: {str}");
sb.AppendLine("---");
}
MessageBox.Show(sb.ToString(), "SQL CE Error");
}
| 參數 | 說明 |
|---|---|
| Data Source | .sdf 檔案路徑 |
| Password | 資料庫密碼 (加密必須) |
| Encrypt | True/False 啟用加密 |
| Max Database Size | 最大檔案大小 (預設 256MB, 最大 4GB) |
| Default Lock Timeout | 鎖定等待毫秒數 (預設 2000) |
| Persist Security Info | True 讓連接字串保留密碼 |
SQL Server Compact 已停止開發 (最後版本 4.0 SP1)。新專案建議改用:
Microsoft.Data.Sqlite)。