【发布时间】:2011-05-02 13:44:15
【问题描述】:
我使用的是 SQL CE 3.5、Microsoft.Synchronization.Data.SqlServerCe 3.1 和 MSSQL 2008,对于每个插入,我都会在 ServerSyncProvider 上的 ApplyChangeFailed 事件中捕获相同的异常。
每次使用同步进行的插入都会引发此错误:“SQL Server 更改跟踪已清理了 表 ''''%s''''。要从此错误中恢复,客户端必须重新初始化其本地数据库并尝试再次同步。”
我在插入行时得到了这条 SQL:“IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N''[TargetMetricValue]'')) > @sync_last_received_anchor RAISERROR(N''SQL Server 更改跟踪已清理跟踪信息 表 ''''%s''''。要从此错误中恢复,客户端必须重新初始化其本地数据库并尝试再次同步。'', 16,3,N''[TargetMetricValue]'')" 得到这个:"@sync_last_received_anchor=0"
CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N''[TargetMetricValue]'')) 返回 146113,大于 0 时会抛出上述异常。
在调用ServerSyncProvider类方法ApplyChanges => serverSyncProvider.ApplyChanges(groupMetadata, dataSet, syncSession);
groupMetadata.NewAnchor = null, groupMetadata.TablesMetadata[0].LastReceivedAnchor.Anchor = null, groupMetadata.TablesMetadata[0].LastSentAnchor.Ancor = byte[]{127,35,6,0,0,0,0 ,0}
我打赌 LastReceivedAnchor 与 sync_last_received_anchor 相关,但在调用 syncAgent.Synchronize() 后我没有得到任何有效值
同样在 SqlCeClientSyncProvider 方法 GetTableReceivedAnchor 上,我得到 null,对于 GetTableSentAnchor,我得到值 byte[]{127,35,6,0,0,0,0,0}。
那么,我为该值得到 null (0) 可能缺少什么?
根据第一条评论更新:
我有初始 CE db 文件 xyz.sdf 它的连接字符串在 app.config 中声明为: 'add name="localConnection" connectionString="Data Source = |DataDirectory|\Data\xyz.sdf;最大数据库大小=3968" providerName="System.Data.SqlServerCe.3.5"'
它是用这段代码初始化的:
public SyncAgent()
{
systemTables = new List<string> {"__syncArticles", "__syncSubscriptions", "__syncTransactions"};
ClientSyncProvider = new SqlCeClientSyncProvider(ConfigurationManager.ConnectionStrings["localConnection"].ConnectionString, true);
LocalProvider = ClientSyncProvider;
InitializeAllSyncTables();
}
【问题讨论】:
-
您是如何初始化客户端数据库的?您是使用本地数据库缓存向导生成 Sync Fx 代码还是手动编写代码?
-
这是预定义的 sdf 文件,更多细节在帖子更新中。
-
它设置为 2 天,无论如何两次连续插入都会两次给出此异常。我认为服务器应该将锚点(时间戳)发送到客户端数据库,但它永远不会发生。我将尝试清理 CE db 中的表声明,并尝试同步(不知道它是否可以这样工作)。
-
@Aurimas - 您如何创建或初始化客户端 SDF?在您将其作为同步过程的一部分之前,它是否已经包含行?
标签: c# synchronization microsoft-sync-framework