清理了变更跟踪,清空表锚点不起作用,有什么想法吗?
我有一个桌面客户端,它使用同步框架将数据库同步到服务器。我偶尔会遇到“清理”表更改跟踪的问题。
我做了一些研究,发现互联网上有一篇文章提供了一些代码,可以重置桌子上的锚点,然后重新同步。这是为了导致表重新下载,从而解决该问题。 (来源此处)
我实现了这样的代码:
=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.
}
}
= Sync Agent:: =
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){”。
有什么想法我哪里出错了吗?
谢谢, 科汉。
I have a desktop client that is using the sync framework to synchronise the database to the server. I am experiencing problems occasionally with it "Cleaning up" the tables change tracking.
I did some research and found a post on the internet that gave some code that resets the anchors on the table and then resynchronises. This is meant to cause the table to re-download, thus getting round the problem. (Source here)
I implemented the code like so:
=On Synchronisation:: =
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.
}
}
= Sync Agent:: =
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();
}
This code will detect the change tracking "cleaned up" error, then call Synchronize(true) and null all the anchors for each table, it then calls for another synchronization. This is the point it is meant to successfully synchronize, unfortunately this is not the case and will hit "catch (ex anothererror){" with another "cleaned up" exception.
Any ideas where i am going wrong?
Thanks,
Kohan.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题可能出在适配器上。您是否在 SQL 命令中检查了
@sync_initialized
?如果您不区分增量命令中已初始化和未初始化的同步,您将收到此错误,因为它们始终会在
@last_recieved_anchor
和CHANGE_TRACKING_MIN_VALID_VERSION
之间执行检查。我的增量插入命令遵循以下结构:
The problem could be with the adapter. Do you check
@sync_initialized
in your SQL-command?If you don't distinguish between initialized and uninitialized synchronizations in your incremental commands you'll get this error since they'll always perform a check between
@last_recieved_anchor
andCHANGE_TRACKING_MIN_VALID_VERSION
.My incremental insert command follow this structure: