我正在尝试使用 SqlCeSyncProvider 在两个 SQL Compact 3.5 数据库之间设置同步。我能够为这两个数据库创建一个范围,从而创建一个元表。但是,当我尝试运行 SyncOrchestrator.Synchronize() 时,出现以下错误,并且在插入数据时无法使两个数据库同步:
"An error occurred when initializing adapters for scope 'Person'. Ensure that the scope name specified on the provider exists in the scope metadata table, and that the correct base tables are specified for that scope."
当我运行以下代码时,会为每个数据库创建三个表:Sync_Person_tracking、Sync_scope_config 和 Sync_scope_info。两个数据库在 Sync_scope_info 表中都包含相同的作用域名称 Person。
SqlCeSyncScopeProvisioning ceConfig = new SqlCeSyncScopeProvisioning();
SqlCeConnection ceConn = (SqlCeConnection)syncProvider.Connection;
string scopeName = syncProvider.ScopeName;
if (!ceConfig.ScopeExists(scopeName, ceConn)) {
var description = new DbSyncScopeDescription();
description.ScopeName = scopeName;
var table = new DbSyncTableDescription("Person");
var pkCol = new DbSyncColumnDescription("ID", "int");
pkCol.IsPrimaryKey = true;
table.Columns.Add(pkCol);
table.Columns.Add(new DbSyncColumnDescription("Name", "nvarchar 50"));
table.Columns.Add(new DbSyncColumnDescription("Height", "int"));
table.Columns.Add(new DbSyncColumnDescription("Weight", "int"));
description.Tables.Add(table);
ceConfig.PopulateFromScopeDescription(description);
ceConfig.SetCreateTableDefault(DbSyncCreationOption.Skip);
ceConfig.ObjectPrefix = "Sync";
ceConfig.Apply(ceConn);
}
在上面的代码中,syncProvider 是一个SqlCESyncProvider 对象,它附加了一个连接字符串到指定的数据库。
下面是我使用 SyncOrchestrator 在数据库之间设置同步的代码:
_syncOrchestrator.LocalProvider = localSyncProvider;
_syncOrchestrator.RemoteProvider = remoteSyncProvider;
_syncOrchestrator.Direction = SyncDirectionOrder.DownloadAndUpload;
try {
var sync = _syncOrchestrator.Synchronize();
Console.WriteLine(string.Format("Sync Downloads: {0}\nSync Uploads: {1}\nSync Start Time: {2}\nSync End Time: {3}",
sync.DownloadChangesTotal.ToString(), sync.UploadChangesTotal.ToString(),
sync.SyncStartTime, sync.SyncEndTime));
} catch (Exception ex) {
Console.WriteLine(string.Format("Sync Orchestrator threw exception: {0}", ex.Message));
}
在此先感谢您的帮助!
我能够通过更改配置来解决错误。我没有为两个数据库中的每一个调用上面的代码,而是创建了一个函数,如下所示:
这里的区别在于,对于两个数据库中的每一个,我现在在设置表描述时都引用另一个数据库的连接。