命名空間: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(); // 釋放非托管資源
}
}
| 屬性 | 作用 | 最佳實踐 |
|---|---|---|
| InternetUrl | IIS 虛擬目錄下的 sqlcesa30.dll 入口 | HTTPS + 域名,配置 SSL 證書 |
| HostName | 對應發布端 HOST_NAME() 參數化過濾 | 用戶 ID/設備 ID/機構代碼,確保唯一 |
| PublisherSecurityMode | 發布端認證方式 | NTAuthentication (Windows 整合) 首選 |
| Subscriber | 訂閱者標識 | GUID 或 設備唯一碼,避免衝突 |
| AddOption.CreateDatabase | 首次同步下載快照並創建 SDF | 僅首次調用,後續同步自動增量 |
new FileInfo(sdfPath).Length > 20 * 1024 → 同步成功。
int retry = 3;
while (retry-- > 0) {
if (Synchronize(...)) break;
Thread.Sleep(5000 * (3 - retry)); // 指數退避
if (retry == 0) AlertAdmin();
}
28001 (認證失敗)、28009 (快照過期需重新初始化)、28010 (衝突解決失敗)。@generation_leveling_threshold 控制代數層級,減少合並開銷。