Пошаговое руководство. Выполнение синхронизации со вторым клиентом
Вторая компактная база данных SyncCompactDB2 уже должна быть синхронизирована с серверной базой данных SyncDB, поскольку SyncCompactDB2 является моментальным снимком SyncCompactDB, которая уже была синхронизирована с базой данных SyncDB.
В этом пошаговом руководстве будет создано приложение командной строки, которое синхронизирует второй компактный клиент с сервером, добавляет новую запись на сервер, синхронизирует второй компактный клиент с сервером, а также синхронизирует первый компактный клиент с сервером. Подробные технические сведения о провизионировании серверов и клиентов и выполнении синхронизации см. в Как настроить и выполнить синхронизацию базы данных (SQL Server).
Выполнение синхронизации
В обозревателе решений щелкните правой кнопкой мыши Решение «SyncSQLServerAndSQLCompact», укажите Добавить и выберите Создать проект.
Выберите Visual C# в Типы проектов и выберите Приложение командной строки в Шаблоны.
Введите ExecuteSecondCompactSync как имя проекта.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Создать проект.
В обозревателе решений щелкните правой кнопкой мыши ExecuteSecondCompactSync и выберите Добавить ссылку.
Выберите Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer, Microsoft.Synchronization.Data.SqlServerCe и нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить ссылку.
Повторите два предыдущих шага, чтобы добавить ссылку к сборке System.Data.SqlServerCe.
Добавьте следующие инструкции using в начало файла Program.cs после существующих инструкций using.
using System.Data; using System.Data.SqlClient; using System.Data.SqlServerCe; using Microsoft.Synchronization; using Microsoft.Synchronization.Data; using Microsoft.Synchronization.Data.SqlServer; using Microsoft.Synchronization.Data.SqlServerCe;
Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL со второй компактной базой данных.
//create a connection to the second compact database SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='C:\SyncSQLServerAndSQLCompact\SyncCompactDB2.sdf'");
Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL с серверной базой данных.
//create connection to the server database SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
Важно!
Если не используется экземпляр по умолчанию, в указанной выше инструкции замените имя сервера именем экземпляра используемого сервера. Например, если используемый экземпляр SQL Server имеет имя MYSQLINSTANCE, замените (local) на .\MYSQLINSTANCE.
Добавьте следующий код к методу Main, чтобы создать модуль взаимодействия синхронизации, инициирующий и управляющий сеансами синхронизации. Модуль взаимодействия синхронизации содержит две службы синхронизации, которые будут применяться в сеансе синхронизации. Для описываемого сценария потребуется объект поставщика для серверной базы данных и объект службы для второй компактной клиентской базы данных SQL Server. Общие этапы создания модуля взаимодействия для этого сценария таковы:
Создайте экземпляр класса SyncOrchestrator. Класс SyncOrchestrator инициирует сеансы синхронизации и управляет ими.
Задайте в качестве локального поставщика объекта модуля взаимодействия синхронизации объект SqlCeSyncProvider, связанный с клиентской базой данных SyncCompactDB2. Класс SqlCeSyncProvider инкапсулирует службу синхронизации для SQL Server Compact, взаимодействующую с клиентом, и отделяет модуль взаимодействия синхронизации от подробностей реализации клиентской базы данных.
В качестве удаленного поставщика модуля взаимодействия синхронизации задайте объект SqlSyncProvider, связанный с серверной базой данных SyncDB. Класс SqlSyncProvider представляет службу синхронизации, взаимодействующую с базой данных SQL Server, и отделяет другие компоненты Sync Framework от подробностей реализации клиентской базы данных.
Для направления синхронизации модуля взаимодействия задайте UploadAndDownload, что позволит клиенту загружать и передавать изменения с сервера и на сервер.
// create a sync orchestrator SyncOrchestrator syncOrchestrator = new SyncOrchestrator(); // set the local provider to a CE sync provider associated with the // ProductsScope in the Sync Compact DB 2 database syncOrchestrator.LocalProvider = new SqlCeSyncProvider("ProductsScope", clientConn); // set the remote provider to a server sync provider associated with the // ProductsScope in the Sync DB server database syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn); // set the diretion to Upload and Download syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
Чтобы подписаться на уведомления об ошибках, возникающих при изменении клиента, добавьте следующий код. Если применение строки на клиенте завершилось неуспешно, то вызывается событие ApplyChangeFailed. Далее в этом пошаговом руководстве будет определен обработчик для событий ошибок.
// subscribe for errors that occur when applying changes to the client ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
Добавьте следующий код к методу Main, чтобы синхронизировать SQL Server и SQL Server Compact. Этот код вызывает метод Synchronize()()()() на объекте SyncOrchestrator для начала синхронизации серверной базы данных SyncDB и компактной базы данных SyncCompactDB.
// execute the synchronization process SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
Добавьте следующие инструкции к методу Main для отображения статистики, возвращаемой методом Synchronize()()()(). Объект SyncOperationStatistics, возвращаемый этим методом, содержит статистику о выполненном сеансе синхронизации.
//print sync statistics Console.WriteLine("Start Time: " + syncStats.SyncStartTime); Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal); Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal); Console.WriteLine("Complete Time: " + syncStats.SyncEndTime); Console.WriteLine(String.Empty);
Добавьте в класс Program после метода Main следующий метод для обработки события ApplyChangeFailed. Параметр DbApplyChangeFailedEventArgs содержит сведения об ошибке или конфликте, вызвавших сбой выполнения операции. Обработчик события может обработать событие несколькими различными способами, например, указав службе синхронизации, что строку необходимо попытаться применить повторно. Свойство Error объекта содержит метаданные, относящиеся к исключениям, возникшим во время синхронизации. В следующем образце кода отображается эта ошибка и тип конфликта (типа DbConflictType), произошедшего при синхронизации.
static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e) { // display conflict type Console.WriteLine(e.Conflict.Type); // display error message Console.WriteLine(e.Error); }
В обозревателе решений щелкните правой кнопкой мыши ExecuteSecondCompactSync и выберите команду «Построить».
В обозревателе решений щелкните правой кнопкой мыши ExecuteSecondCompactSync и выберите команду Назначить запускаемым проектом.
Внимание!
Если этот шаг не сделан, то при повторном нажатии клавиш Ctrl+F5 приложение ProvisionSecondCompactClient будет выполнено снова и будет получено сообщение об ошибке, где будет сказано, что область уже существует в клиентской базе данных.
Нажмите клавиши Ctrl+F5, чтобы выполнить программу. Результат должен выглядеть приблизительно так:
Start Time: 6/14/2010 8:03:31 PM Total Changes Uploaded: 0 Total Changes Downloaded: 0 Complete Time: 6/14/2010 8:03:34 PM Press any key to continue . . .
Записи загружены не будут, поскольку клиент уже синхронизирован с сервером.
Нажмите ВВОД, чтобы закрыть окно командной строки.
В среде SQL Server Management Studio разверните (local) SQL Server, разверните Базы данных, разверните SyncDB, а затем разверните Таблицы.
Щелкните правой кнопкой мыши dbo.Products и выберите Изменить 200 верхних строк.
Добавьте в конце запись со значением 5 для ID, выберите Беспроводная клавиатура для Name и 30 для ListPrice. Убедитесь, что запись сохранена, нажав TAB.
Теперь в Visual Studio нажмите клавиши Ctrl+F5, чтобы повторно выполнить клиентскую программу. Результат должен выглядеть приблизительно так:
Start Time: 6/14/2010 8:06:21 PM Total Changes Uploaded: 0 Total Changes Downloaded: 1 Complete Time: 6/14/2010 8:06:23 PM Press any key to continue . . .
После этого одна запись, добавленная на сервер, должна быть загружена в клиент. Это можно проверить, выполнив следующие действия:
В среде SQL Server Management Studio выберите SQL Server Compact [Мой компьютер\...\SyncCompactDB2].
На панели инструментов нажмите кнопку Создать запрос.
Введите и выполните (нажав клавишу F5) следующую команду SQL, чтобы убедиться, что загрузка записей в компактный клиент выполнена успешно.
select * from products
Первый компактный клиент еще не синхронизирован. Для проверки выполните следующее:
В обозревателе объектов выберите SyncCompactDB (без цифры 2 в конце).
На панели инструментов нажмите кнопку Создать запрос.
Введите и выполните следующую команду:
select * from products
Последняя запись, добавленная на сервер, еще не будет отображена. Второй клиент синхронизирован, а первый нет.
В Visual Studio в обозревателе решений щелкните правой кнопкой мыши ExecuteCompactSync, а затем выберите Назначить запускаемым проектом.
Теперь в Visual Studio нажмите клавиши Ctrl+F5, чтобы повторно выполнить клиентскую программу. Результат должен выглядеть приблизительно так:
Start Time: 6/14/2010 8:10:54 PM Total Changes Uploaded: 0 Total Changes Downloaded: 1 Complete Time: 6/14/2010 8:10:56 PM Press any key to continue . . .
После этого одна запись, добавленная на сервер, должна быть загружена в первый клиент. Это можно проверить следующим образом: в среде SQL Server Management Studio выполните команду SELECT, выполненную ранее в первой компактной базе данных (SyncCompactDB).
Чтобы закрепить навыки работы с технологией Sync Framework, можно поэкспериментировать с добавлением, обновлением и удалением записей на сервере или на клиенте. Например, после удаления записи с сервера при следующей синхронизации клиента с сервером должна удаляться соответствующая запись в клиентской базе данных.
Не закрывайте Visual Studio и среду SQL Server Management Studio, если необходимо выполнить необязательные пошаговые руководства, посвященные работе с параметризованными областями.
Полный пример кода
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlServerCe;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using Microsoft.Synchronization.Data.SqlServerCe;
namespace ExecuteSecondCompactSync
{
class Program
{
static void Main(string[] args)
{
//create a connection to the second compact database
SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='C:\SyncSQLServerAndSQLCompact\SyncCompactDB2.sdf'");
//create connection to the server database
SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
// create a sync orchestrator
SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
// set the local provider to a CE sync provider associated with the
// ProductsScope in the Sync Compact DB 2 database
syncOrchestrator.LocalProvider = new SqlCeSyncProvider("ProductsScope", clientConn);
// set the remote provider to a server sync provider associated with the
// ProductsScope in the Sync DB server database
syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);
// set the diretion to Upload and Download
syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
// subscribe for errors that occur when applying changes to the client
((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
// execute the synchronization process
SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
}
static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{
// display conflict type
Console.WriteLine(e.Conflict.Type);
// display error message
Console.WriteLine(e.Error);
}
}
}
См. также
Другие ресурсы
Как настроить и выполнить синхронизацию базы данных (SQL Server)