【问题标题】:Sync error: "SQL Server change tracking has cleaned up tracking..."同步错误:“SQL Server 更改跟踪已清理跟踪...”
【发布时间】: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 文件,更多细节在帖子更新中。
  • 您是否尝试过增加保留和清理窗口?你可能已经看过social.microsoft.com/Forums/en-US/syncgeneral/thread/…sqlmonster.com/Uwe/Forum.aspx/sql-server-ce/3911/…
  • 它设置为 2 天,无论如何两次连续插入都会两次给出此异常。我认为服务器应该将锚点(时间戳)发送到客户端数据库,但它永远不会发生。我将尝试清理 CE db 中的表声明,并尝试同步(不知道它是否可以这样工作)。
  • @Aurimas - 您如何创建或初始化客户端 SDF?在您将其作为同步过程的一部分之前,它是否已经包含行?

标签: c# synchronization microsoft-sync-framework


【解决方案1】:

如果还有人对如何解决此问题仍有疑问,请查看此帖子 Programming Microsoft Synchronization Services for ADO.NET (Devices)。这非常有帮助,由于找不到同步锚,新数据库的批处理也会失败,因此请先找到一种方法来实例化客户端数据库,然后才能对客户端数据库进行批处理。或者直接在客户端数据库上下载sdf文件。

我遇到了同样的情况,我编写了两种不同的 InitializeNewAnchorCommand() 方法,一种用于批处理,另一种用于一次性数据库同步,可以直接从代码中实例化我的数据库。

这就是我所拥有的,它对我有用。

try
{
    // Synchronize
    syncStats = syncAgent.Synchronize();
    App.SyncStats = syncStats;
}
catch (SyncException exception)
{
    if (exception.Message.Contains(" Unable to obtain a new server anchor."))
    {                    
        syncSnapShotStats = syncSnapShotAgent.Synchronize();
        App.SyncStats = syncSnapShotStats;
    }
    else
    {
        throw;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多