清理了变更跟踪,清空表锚点不起作用,有什么想法吗?

发布于 2024-08-13 09:50:02 字数 1904 浏览 1 评论 0原文

我有一个桌面客户端,它使用同步框架将数据库同步到服务器。我偶尔会遇到“清理”表更改跟踪的问题。

我做了一些研究,发现互联网上有一篇文章提供了一些代码,可以重置桌子上的锚点,然后重新同步。这是为了导致表重新下载,从而解决该问题。 (来源此处)

我实现了这样的代码:

=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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

帅气尐潴 2024-08-20 09:50:02

问题可能出在适配器上。您是否在 SQL 命令中检查了 @sync_initialized

如果您不区分增量命令中已初始化和未初始化的同步,您将收到此错误,因为它们始终会在 @last_recieved_anchorCHANGE_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

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 and CHANGE_TRACKING_MIN_VALID_VERSION.

My incremental insert command follow this structure:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文