Вычистили отслеживание изменений, якоря нулевой таблицы не работают, идеи? - PullRequest
3 голосов
/ 04 декабря 2009

У меня есть настольный клиент, который использует платформу синхронизации для синхронизации базы данных с сервером. У меня иногда возникают проблемы с этим "Очистка" отслеживания изменений таблиц.

Я провел некоторое исследование и нашел в Интернете сообщение, в котором содержится код, который сбрасывает привязки на столе и затем выполняет повторную синхронизацию. Это должно привести к повторной загрузке таблицы, что позволит обойти проблему. (Источник здесь)

Я реализовал код так:

= При синхронизации :: =

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) и обнулит все якоря для каждой таблицы, затем он вызывает другую синхронизацию. Именно в этом и заключается смысл успешной синхронизации, но, к сожалению, это не тот случай, и он вызовет «catch (ex anothererror) {» с другим исключением «cleaned».

Есть идеи, где я иду не так?

Спасибо, Кохан.

1 Ответ

0 голосов
/ 21 декабря 2009

Проблема может быть с адаптером. Вы проверяете @sync_initialized в своей SQL-команде?

Если вы не различаете инициализированную и неинициализированную синхронизацию в своих инкрементных командах, вы получите эту ошибку, поскольку они всегда будут выполнять проверку между @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
...