同期フレームワークを使用してデータベースをサーバーに同期しているデスクトップクライアントがあります。テーブルの変更の追跡を「クリーンアップ」すると、問題が発生することがあります。
私はいくつかの調査を行い、テーブルのアンカーをリセットしてから再同期するコードを提供するインターネット上の投稿を見つけました。これは、テーブルを再ダウンロードして、問題を回避することを目的としています。(出典はこちら)
私は次のようにコードを実装しました:
=同期時::=
catch (SyncException ex)
{
Exception ex2 = ex.InnerException;
if (ex2.Message.Contains("cleaned up"))
{
try
{
syncStats = syncAgent.Synchronize(true);
//pass in true so removes anchors
catch (Exception anothererror)
{
//This will hit with another error equaling “Cleaned-up” on a table.
}
}
=同期エージェント::=
public SyncStatistics Synchronize(bool reinit)
{
if (!reinit)
return base.Synchronize();
try
{
ClientSyncProvider sqlCeProvider;
sqlCeProvider = (ClientSyncProvider)this.LocalProvider;
foreach (SyncTable st in this.Configuration.SyncTables)
{
if (st.SyncDirection != SyncDirection.Snapshot)
{
// Null anchors here
sqlCeProvider.SetTableReceivedAnchor(st.TableName, new SyncAnchor());
}
}
}
catch (Exception ex)
{
}
return base.Synchronize();
}
このコードは、変更追跡の「クリーンアップ」エラーを検出し、Synchronize(true)を呼び出して、各テーブルのすべてのアンカーをnullにし、別の同期を呼び出します。これは、正常に同期することを目的としたポイントですが、残念ながらそうではなく、別の「クリーンアップ」例外で「catch(ex anothererror){」にヒットします。
私が間違っているアイデアはありますか?
ありがとう、コーハン。