首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 操作 SQL Server Mobile / Compact 完整範例:建立、壓縮、同步、例外處理

     編輯:關於C語言

前言

SQL Server Mobile (後改名 SQL Server Compact / SQL CE) 是嵌入式資料庫,適用行動裝置、桌面單機應用。本文整理核心操作範例,涵蓋生命週期管理、同步複寫、RDA 遠端資料存取、SqlCeResultSet 高效能資料繫結與例外處理。

核心類別

  • SqlCeEngine:資料庫建立、驗證、修復、壓縮、收縮。
  • SqlCeConnection/SqlCeCommand:ADO.NET 標準連線命令。
  • SqlCeReplication:合併式複寫 (Merge Replication)。
  • SqlCeRemoteDataAccess:RDA (Remote Data Access) 拉取/推送。
  • SqlCeResultSet:可捲動、可更新、偵測變更的高效能游標。

1. 建立資料庫 (含加密)


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();

2. 驗證與修復


using (var engine = new SqlCeEngine("Data Source=App.sdf; Password='...';"))
{
    if (!engine.Verify())
    {
        MessageBox.Show("資料庫損毀,嘗試修復...");
        engine.Repair(null, RepairOption.RecoverCorruptedRows);
    }
}

3. 壓縮 - 重建檔案回收空間、可變更排序/加密/密碼


// 產生新檔
engine.Compact("Data Source=App_Compact.sdf; Password='NewPwd'; Encrypt=True;");

// 就地壓縮 (覆寫原檔)
engine.Compact(null);

4. 收縮 - 移動空頁至檔尾截斷,不建立暫存檔


engine.Shrink(); // 較快但空間回收較不徹底

5. 合併式複寫


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();                             // 同步
}

6. RDA 遠端資料存取 (較簡單、單向)


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;...;");
}

7. SqlCeResultSet 高效能繫結 DataGrid


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;
    }
}

8. SqlCeException 完整錯誤資訊擷取


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資料庫密碼 (加密必須)
EncryptTrue/False 啟用加密
Max Database Size最大檔案大小 (預設 256MB, 最大 4GB)
Default Lock Timeout鎖定等待毫秒數 (預設 2000)
Persist Security InfoTrue 讓連接字串保留密碼

遷移建議

SQL Server Compact 已停止開發 (最後版本 4.0 SP1)。新專案建議改用:

  • SQLite:零設定、跨平台、單一檔案、廣泛支援 (Microsoft.Data.Sqlite)。
  • LocalDB:真實 SQL Server 引擎、支援完整 T-SQL、開發機免安裝完整版。
  • EF Core + SQLite/LocalDB:現代 ORM 架構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved