Службы синхронизации фактически не синхронизируются
Я пытаюсь синхронизировать базу данных SQL Server CE 3.5 с базой данных SQL Server 2008 с помощью MS Sync Services. Я использую VS 2008. Я создал локальный кэш базы данных, подключил его к SQL Server 2008 и выбрал таблицы, которые я хотел синхронизировать. Я выбрал отслеживание SQL Server. Он изменил базу данных для отслеживания изменений и создал локальную копию (SDF) данных.
Мне нужна двусторонняя синхронизация, поэтому я создал частичный класс для агента синхронизации и добавил код в OnInitialized(), чтобы установить для SyncDirection для таблиц двунаправленное. Я прошел через отладчик, и этот код работает.
Затем я создал еще один частичный класс для поставщика синхронизации сервера кэша и добавил обработчик событий в OnInitialized(), чтобы подключить его к событию ApplyChangeFailed. Этот код также работает нормально - мой код запускается при возникновении конфликта.
Наконец, я вручную внес некоторые изменения в данные сервера для проверки синхронизации. Я использую этот код для запуска синхронизации:
var agent = new FSEMobileCacheSyncAgent();
var syncStats = agent.Synchronize();
syncStats, кажется, показывает количество # изменений, которые я сделал на сервере, и показывает, что они были применены. Однако, когда я открываю локальный файл SDF, никаких изменений не происходит.
Я в основном следовал инструкциям, которые нашел здесь:
http://msdn.microsoft.com/en-us/library/cc761546%28SQL.105%29.aspx
и здесь:
Кажется, что в этот момент это должно "просто работать", но изменения, внесенные на сервере, отсутствуют в локальном файле SDF. Я предполагаю, что что-то упустил, но я просто не вижу этого прямо сейчас.
Я подумал, что это может быть из-за того, что я, похоже, использовал версию 1 Sync Services, поэтому я удалил ссылки на сборки Microsoft.Synchronization. *, Установил Sync Framework 2.0 и добавил новую версию сборок в проект. Это не имеет никакого значения.
Идеи?
Изменить: я хотел включить трассировку, чтобы увидеть, смогу ли я отследить это, но единственный способ сделать это - через приложение WinForms, так как для этого требуются записи в файле app.config (мой первоначальный проект был библиотекой классов). Я создал проект WinForms и воссоздал все, и вдруг все работает. Итак, по-видимому, для этого нужен проект WinForm по какой-то причине?
Это не совсем то, как я планировал использовать это - я надеялся запустить синхронизацию через другое приложение, не являющееся.NET, и предоставить там пользовательский интерфейс, чтобы конечный пользователь мог показаться немного более простым. Если я не могу этого сделать, это нормально, но мне бы очень хотелось узнать, если / как сделать так, чтобы это работало как проект библиотеки классов.
2 ответа
Вы можете загрузить файл конфигурации dll следующим образом (в конструкторе вашего класса):
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", System.IO.Path.Combine(Environment.CurrentDirectory, "<dll name>.config"));
System.Configuration.ConfigurationManager.RefreshSection("configuration");
Senario, который вы описываете, должен работать. У меня есть похожее приложение, которое использовало синхронизацию внутри класса, и это нормально.. Вам нужно иметь возможность устанавливать свойства трассировки, проще всего через app.config, но это не ваша проблема... Об ошибках не сообщалось метод Syncronize?
Конфликт ошибок не возник?
Если у вас все еще возникают трудности, вы можете добавить следующие биты в файл конфигурации вашего приложения, в разделе
<switches>
<add name="DefaultSwitch" value="Information" />
<!-- Sync Tracer Setting 0-off, 1-error, 2-warn, 3-info, 4-verbose. -->
<add name="SyncTracer" value="4" />
</switches>
<trace autoflush="true">
<listeners>
<add name="TestSyncListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\SyncTraceFile.txt" />
</listeners>
</trace>
Тогда посмотрите в c:\SyncTraceFile.txt для любых проблем.