同步错误:" SQL Server更改跟踪已清理跟踪..."

时间:2011-05-02 13:44:15

标签: c# synchronization microsoft-sync-framework

我正在使用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服务器更改跟踪已清理跟踪信息 表''''%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; Max Database Size = 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();
    }

1 个答案:

答案 0 :(得分:0)

如果任何正文仍有疑问如何解决此问题,请查看此帖子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;
    }
}