同步错误:“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();
}
如果有人仍然对如何解决这个问题有疑问,请查看这篇文章为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;
}
}