2011-05-02 175 views
0

我正在使用SQL CE 3.5,Microsoft.Synchronization.Data.SqlServerCe 3.1和MSSQL 2008,對於每次插入,我都會使用ApplyChangeFailed事件捕獲相同的異常在ServerSyncProvider上。同步錯誤:「SQL Server更改跟蹤已清理跟蹤...」

我得到這個錯誤爲每個插入同步:「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空,groupMetadata.TablesMetadata [0] = .LastSentAnchor.Ancor字節[] {127,35,6,0,0,0, 0,0}

我敢打賭LastReceivedAnchor有關sync_last_received_anchor,但我不打電話syncAgent.Synchronize後得到任何有效的值()

同樣在SqlCeClientSyncProvider方法GetTableReceivedAnchor我得到空和GetTableSentAnchor我得到的值的byte [] {} 127,35,6,0,0,0,0,0。

那麼,爲什麼我會得到這個值null(0)?

根據第一評論UPDATE:

我有初始CE數據庫文件xyz.sdf它的連接字符串中的app.config爲聲明: 「添加名稱=‘的localConnection’的connectionString =「數據源= | 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(); 
    } 
+0

你是如何初始化客戶數據庫的?你使用本地數據庫緩存嚮導來生成同步Fx代碼還是你手動編寫代碼? – JuneT 2011-05-02 14:33:42

+0

它是預定義的sdf文件,更新後的更多細節。 – 2011-05-02 15:15:06

+0

任何機會,你有沒有嘗試增加保留和清理窗口?你可能已經看過http://social.microsoft.com/Forums/en-US/syncgeneral/thread/cc3d49e0-f188-4d93-b2dd-473137ae9fc6和http://www.sqlmonster.com/Uwe/Forum。 aspx/sql-server-ce/3911/MSFT-Client-must-reinintialize-database-error – 2011-05-02 16:19:16

回答

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; 
    } 
}