Ошибка синхронизации: «Отслеживание изменений SQL Server очистило отслеживание ...» - PullRequest
0 голосов
/ 02 мая 2011

Я использую SQL CE 3.5, Microsoft.Synchronization.Data.SqlServerCe 3.1 и MSSQL 2008, и для каждой вставки я получаю одно и то же исключение с событием ApplyChangeFailed на ServerSyncProvider.

Я получил эту ошибку длякаждая вставка выполняется с синхронизацией: «Отслеживание изменений SQL Server очистило информацию отслеживания для таблицы '' ''% s '' ''. Чтобы устранить эту ошибку, клиент должен повторно инициализировать свою локальную базу данных и повторить попытку синхронизации." *

Я получил этот фрагмент SQL при вставке строки: «ЕСЛИ 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] '')) returns 146113 и, поскольку оно больше 0, генерируется указанное выше исключение.

В методе класса ServerSyncProvider ApplyChanges вызывается => serverSyncProvider.ApplyChanges (groupMetadata, dataSet, syncSession);

groupMetanchor.Na.= null, groupMetadata.TablesMetadata [0] .LastReceivedAnchor.Anchor = null, groupMetadata.TablesMetadata [0] .LastSentAnchor.Ancor = byte [] {127,35,6,0,0,0,0,0}

Могу поспорить, что LastReceivedAnchor связан с sync_last_received_anchor, но я не получаю никакого действительного значения после вызова syncAgent.Synchronize ()

Также в методе SqlCeClientSyncProvider GetTableReceivedAnchor я получаю нулевое значение и для GetTableSentAchor35,6,0,0,0,0,0}.

Так что может не хватать, чтобы я получил null (0) для этого значения?

ОБНОВЛЕНИЕ в соответствии спервый комментарий:

У меня есть исходный файл базы данных CE xyz.sdf. Строка подключения объявлена ​​в app.config как: 'add name = "localConnection" connectionString = "Data Source = | 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();
    }

1 Ответ

0 голосов
/ 04 октября 2014

Если у кого-то еще есть вопрос, как решить эту проблему, проверьте этот пост Программирование служб синхронизации Microsoft для ADO.NET (устройства) . Это очень полезно, также пакетирование завершается неудачно для новых баз данных, поскольку привязка синхронизации не найдена, поэтому найдите способ создания клиентской базы данных, прежде чем вы сможете выполнить пакетирование на клиентских базах данных. Или загрузите файл 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;
    }
}
...