清理更改跟踪,使表锚无效,想法?

时间:2009-12-04 16:32:56

标签: c# sql-server-2008 synchronization microsoft-sync-framework

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

我做了一些研究,并在互联网上发现了一个帖子,它提供了一些代码,可以重置桌面上的锚点然后重新同步。这是为了使表重新下载,从而解决问题。 (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){”与另一个“清理”异常。

我出错的任何想法?

谢谢, 钢钣。

1 个答案:

答案 0 :(得分:0)

问题可能出在适配器上。你在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