2010-03-24 5 views
1

Я пытаюсь синхронизировать базу данных SQL Server CE 3.5 с базой данных SQL Server 2008 с использованием служб MS Sync. Я использую 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

и здесь:

http://keithelder.net/blog/archive/2007/09/23/Sync-Services-for-SQL-Server-Compact-Edition-3.5-in-Visual.aspx

Похоже, что это должно "просто работать" на данный момент, но изменения сделанные на сервере, не находятся в локальном SDF-файле. Наверное, мне что-то не хватает, но я просто не вижу его прямо сейчас.

Я думал, это может быть из-за того, что я использовал версию 1 службы синхронизации, поэтому я удалил ссылки на Microsoft.Synchronization. * Сборки, установил среду Sync 2.0 и добавил новую версию сборок в проект. Это не имело никакого значения.

Идеи?

Edit: Я хотел включить трассировку, чтобы увидеть, если я мог отслеживать это вниз, но единственный способ сделать это через приложение WinForms, так как он требует записи в файле app.config (мой первоначальный проект был класс библиотека). Я создал проект WinForms и воссоздал все, и вдруг все работает. По-видимому, для этого почему-то нужен проект WinForm?

На самом деле это не так, как я планировал использовать это - я надеялся начать синхронизацию с помощью другого приложения, отличного от .NET, и предоставить ему интерфейс, чтобы опыт был немного более безвкусным для конечного пользователя. Если я не могу этого сделать, все в порядке, но мне бы очень хотелось узнать, как и как сделать эту работу как проект библиотеки классов.

ответ

0

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

+0

ли вы получить эту работу? – JohnnyJP

+0

Я заметил, что вы уже пробовали файл трассировки и теперь получили его работу с использованием проекта WinForm. Я согласен, что я не понимаю, почему это не работает с консольным приложением. – JohnnyJP

2

Вы можете загрузить конфигурационный файл в библиотеку DLL таким образом (в классе конструктор):

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", System.IO.Path.Combine(Environment.CurrentDirectory, "<dll name>.config")); 
System.Configuration.ConfigurationManager.RefreshSection("configuration"); 
Смежные вопросы