我有一个桌面客户端,它使用同步框架将数据库同步到服务器。我偶尔会遇到问题“清理”表格会改变跟踪。
我做了一些研究,并在互联网上发现了一个帖子,它提供了一些代码,可以重置桌面上的锚点然后重新同步。这是为了使表重新下载,从而解决问题。 (Source here)
我实现了代码:
= On Synchronization :: =
catch (SyncException ex)
{
Exception ex2 = ex.InnerException;
if (ex2.Message.Contains("cleaned up"))
{
try
{
syncStats = syncAgent.Synchronize(true);
//pass in true so removes anchors
catch (Exception anothererror)
{
//This will hit with another error equaling “Cleaned-up” on a table.
}
}
=同步代理:: =
public SyncStatistics Synchronize(bool reinit)
{
if (!reinit)
return base.Synchronize();
try
{
ClientSyncProvider sqlCeProvider;
sqlCeProvider = (ClientSyncProvider)this.LocalProvider;
foreach (SyncTable st in this.Configuration.SyncTables)
{
if (st.SyncDirection != SyncDirection.Snapshot)
{
// Null anchors here
sqlCeProvider.SetTableReceivedAnchor(st.TableName, new SyncAnchor());
}
}
}
catch (Exception ex)
{
}
return base.Synchronize();
}
此代码将检测更改跟踪“已清理”错误,然后调用Synchronize(true)并将每个表的所有锚定为null,然后调用另一个同步。这就是成功同步的意思,不幸的是情况并非如此,并且将会出现“catch(ex anothererror){”与另一个“清理”异常。
我出错的任何想法?
谢谢, 钢钣。
答案 0 :(得分:0)
问题可能出在适配器上。你在SQL命令中检查@sync_initialized
吗?
如果您没有区分增量命令中的初始化和未初始化同步,则会收到此错误,因为他们始终会在@last_recieved_anchor
和CHANGE_TRACKING_MIN_VALID_VERSION
之间执行检查。
我的增量插入命令遵循以下结构:
IF @sync_initialized = 0
BEGIN
//SELECT without limitation by the changetable.
END
ELSE
BEGIN
//SELECT limited by the changetable.
IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'[WorkOrder]')) > @sync_last_received_anchor RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. To recover from this error, the client must reinitialize its local database and try again',16,3,N'[WorkORder]')
END