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

SQL Server 合並複製訂閱端代碼實戰:.NET Compact Framework 同步核心邏輯與錯誤處理

     編輯:關於SqlServer

核心類:SqlCeReplication

命名空間:System.Data.SqlServerCe,封裝了合並複製的所有訂閱端操作。

標準同步代碼模板


using System.Data.SqlServerCe;

public bool Synchronize(string serverUrl, string webUser, string webPwd,
                        string publisher, string pubDb, string publication,
                        string hostName, string localConnStr)
{
    SqlCeReplication repl = null;
    try
    {
        repl = new SqlCeReplication();
        repl.InternetUrl = serverUrl;                    // IIS SQL Mobile Agent URL
        repl.InternetLogin = webUser;                    // Web 訪問帳號
        repl.InternetPassword = webPwd;                  // Web 訪問密碼
        repl.Publisher = publisher;                      // 發布服務器名
        repl.PublisherDatabase = pubDb;                  // 發布數據庫
        repl.Publication = publication;                  // 發布名
        repl.HostName = hostName;                        // 參數化過濾鍵 (HOST_NAME())
        repl.PublisherSecurityMode = SecurityType.NTAuthentication; // 發布端認證
        repl.Subscriber = Guid.NewGuid().ToString();     // 訂閱者唯一標識
        repl.SubscriberConnectionString = localConnStr;  // 本地 SDF 連接串

        // 首次同步自動創建本地數據庫
        if (!File.Exists(localConnStr.Split(';')[0].Replace("Data Source=", "")))
            repl.AddSubscription(AddOption.CreateDatabase);

        repl.Synchronize();  // 執行同步(阻塞直到完成/失敗/取消)
        return true;
    }
    catch (SqlCeException ex)
    {
        LogError(ex); // 記錄 NativeError, Message, 錯誤上下文
        return false;
    }
    finally
    {
        repl?.Dispose(); // 釋放非托管資源
    }
}

關鍵參數深度解析

屬性作用最佳實踐
InternetUrlIIS 虛擬目錄下的 sqlcesa30.dll 入口HTTPS + 域名,配置 SSL 證書
HostName對應發布端 HOST_NAME() 參數化過濾用戶 ID/設備 ID/機構代碼,確保唯一
PublisherSecurityMode發布端認證方式NTAuthentication (Windows 整合) 首選
Subscriber訂閱者標識GUID 或 設備唯一碼,避免衝突
AddOption.CreateDatabase首次同步下載快照並創建 SDF僅首次調用,後續同步自動增量

同步後驗證機制

  • 快照初始 SDF 約 20KB,同步成功後體積顯著增大。
  • 代碼檢查:new FileInfo(sdfPath).Length > 20 * 1024 → 同步成功。
  • 網絡中斷導致僅 20KB → 視為失敗,需重試/告警。

錯誤處理與重試策略


int retry = 3;
while (retry-- > 0) {
    if (Synchronize(...)) break;
    Thread.Sleep(5000 * (3 - retry)); // 指數退避
    if (retry == 0) AlertAdmin();
}
  • 常見錯誤碼:28001 (認證失敗)、28009 (快照過期需重新初始化)、28010 (衝突解決失敗)。
  • 衝突解決:合並複製默認「發布者勝出」,可在發行項屬性配置「訂閱者勝出」或自定義解決程序。

性能優化建議

  • 壓縮: IIS 啟用動態壓縮,減少快照/變更傳輸體積。
  • 批次: 發布端 @generation_leveling_threshold 控制代數層級,減少合並開銷。
  • 索引: 本地 SDF 同步表關鍵列建索引,加速衝突檢測/應用。
  • 並發: 避免多線程同時同步同一 SDF(單文件鎖),多數據庫可並行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved