同步错误:“SQL Server更改跟踪已清理跟踪”

本文关键字:跟踪 错误 SQL Server 同步 | 更新日期: 2023-09-27 17:54:05

我使用SQL CE 3.5, Microsoft.Synchronization.Data.SqlServerCe 3.1和MSSQL 2008,对于每次插入,我都会在ServerSyncProvider上捕获ApplyChangeFailed事件的相同异常。

我得到了这个错误抛出的每插入与同步:"SQL Server更改跟踪已清理跟踪信息表"% s"。要从此错误中恢复,客户端必须重新初始化其本地数据库并尝试再次同步。"

当插入行时,我得到了这段SQL:"如果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。锚= null, groupMetadata.TablesMetadata[0]. lastsentanchor .Ancor = byte[]{127,35,6,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。它的连接字符串在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();
    }

同步错误:“SQL Server更改跟踪已清理跟踪”

如果有人仍然对如何解决这个问题有疑问,请查看这篇文章为ADO编程微软同步服务。净(设备)。这是非常有用的,因为没有找到同步锚点,所以新数据库的批处理失败,所以在对客户端数据库进行批处理之前,要找到一种方法来实例化客户端数据库。或者直接在客户端数据库上下载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;
    }
}