3

同期フレームワークを使用してデータベースをサーバーに同期しているデスクトップクライアントがあります。テーブルの変更の追跡を「クリーンアップ」すると、問題が発生することがあります。

私はいくつかの調査を行い、テーブルのアンカーをリセットしてから再同期するコードを提供するインターネット上の投稿を見つけました。これは、テーブルを再ダウンロードして、問題を回避することを目的としています。(出典はこちら)

私は次のようにコードを実装しました:

=同期時::=

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){」にヒットします。

私が間違っているアイデアはありますか?

ありがとう、コーハン。

4

1 に答える 1

0

問題はアダプターにある可能性があります。@sync_initializedSQLコマンドをチェックインしますか?

インクリメンタルコマンドで初期化された同期と初期化されていない同期を区別しないと、との間で常にチェックが実行されるため、このエラーが発生し@last_recieved_anchorますCHANGE_TRACKING_MIN_VALID_VERSION

私のインクリメンタル挿入コマンドは、次の構造に従います。

IF @sync_initialized = 0
BEGIN 
//SELECT without limitation by the changetable.
END 
ELSE
BEGIN
//SELECT limited by the changetable.
IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(N'[WorkOrder]')) > @sync_last_received_anchor RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. To recover from this error, the client must reinitialize its local database and try again',16,3,N'[WorkORder]')
END
于 2009-12-21T15:31:13.203 に答える