Поделиться через


Пошаговое руководство. Выполнение синхронизации

В двух предыдущих пошаговых руководствах были подготовлены к синхронизации серверная база данных SyncDB и компактная баз данных SyncCompactDB. В этом пошаговом руководстве будет создано приложение командной строки, инициирующее процесс синхронизации этих двух баз данных. Подробные технические сведения о провизионировании серверов и клиентов и выполнении синхронизации см. в Как настроить и выполнить синхронизацию базы данных (SQL Server).

Выполнение синхронизации

  1. В Visual Studio в обозревателе решений щелкните правой кнопкой мыши Решение «SyncSQLServerAndSQLExpress», выберите Добавить и выберите Создать проект.

  2. Выберите Visual C# в Типы проектов и выберите Приложение командной строки в Шаблоны.

  3. Введите ExecuteExpressSync как имя проекта.

  4. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Создать проект.

  5. В обозревателе решений щелкните правой кнопкой мыши ExecuteExpressSync и выберите Добавить ссылку.

  6. Выберите Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer и нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить ссылку.

  7. Добавьте следующие инструкции using в начало файла Program.cs после имеющихся инструкций using.

    using System.Data;
    using System.Data.SqlClient;
    
    using Microsoft.Synchronization;
    using Microsoft.Synchronization.Data;
    using Microsoft.Synchronization.Data.SqlServer;
    
  8. Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL с базой данных Express.

    SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");
    
  9. Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL с серверной базой данных.

    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
    
    Важное примечаниеВажно!

    Если не используется экземпляр по умолчанию, в указанной выше инструкции замените имя сервера именем экземпляра используемого сервера. Например, если используемый экземпляр SQL Server имеет имя MYSQLINSTANCE, замените (local) на .\MYSQLINSTANCE.

  10. Добавьте следующую инструкцию к методу Main, чтобы создать модуль взаимодействия синхронизации. В коде будет создан модуль взаимодействия синхронизации, задан объект поставщика, связанного с базой данных SQL Server Express, в качестве локального поставщика модуля взаимодействия синхронизации, задан объект поставщика, связанного с серверной базой данных в качестве удаленного поставщика модуля взаимодействия синхронизации и задано направление сеанса синхронизации «передача и загрузка».

    1. Создайте экземпляр класса SyncOrchestrator. Класс SyncOrchestrator инициирует сеансы синхронизации и управляет ими.

    2. В качестве локального поставщика объекта модуля взаимодействия синхронизации задайте объект SqlSyncProvider, связанный с клиентской базой данных SyncExpressDB. Класс SqlSyncProvider инкапсулирует службу синхронизации для базы данных SQL Express, взаимодействующую с клиентом, и отделяет модуль взаимодействия синхронизации от подробностей реализации клиентской базы данных.

    3. В качестве удаленного поставщика модуля взаимодействия синхронизации задайте объект SqlSyncProvider, связанный с серверной базой данных SyncDB. Класс SqlSyncProvider представляет службу синхронизации, взаимодействующую с базой данных SQL Server, и отделяет другие компоненты Sync Framework от подробностей реализации клиентской базы данных.

    4. Для направления синхронизации модуля взаимодействия задайте UploadAndDownload, что позволит клиенту загружать и передавать изменения с сервера и на сервер.

    // create the sync orhcestrator
    SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
    
    // set local provider of orchestrator to a sync provider associated with the 
    // ProductsScope in the SyncExpressDB express client database
    syncOrchestrator.LocalProvider = new SqlSyncProvider("ProductsScope", clientConn);
    
    // set the remote provider of orchestrator to a server sync provider associated with
    // the ProductsScope in the SyncDB server database
    syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);
    
    // set the direction of sync session to Upload and Download
    syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
    
  11. Чтобы подписаться на уведомления об ошибках, возникающих при изменении клиента, добавьте следующий код. Если применение строки на клиенте завершилось неуспешно, то вызывается событие ApplyChangeFailed. Далее в этом пошаговом руководстве будет определен обработчик для событий ошибок.

    // subscribe for errors that occur when applying changes to the client
    ((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);
    
  12. Добавьте следующую инструкцию к методу Main. Этот код вызывает метод Synchronize()()()() на объекте SyncOrchestrator для начала синхронизации серверной базы данных SyncDB и базы данных SQL Server Express SyncExpressDB.

    // execute the synchronization process
    SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
    
  13. Добавьте следующие инструкции к методу Main для отображения статистики, возвращаемой методом Synchronize()()()(). Объект SyncOperationStatistics, возвращаемый этим методом, содержит статистику о выполненном сеансе синхронизации.

    // print 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);
    
  14. Добавьте в класс 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);
    }
    
  15. В обозревателе решений щелкните правой кнопкой мыши ExecuteExpressSync и выберите Построить.

  16. В обозревателе решений щелкните правой кнопкой мыши ExecuteExpressSync и выберите команду Назначить запускаемым проектом.

    Предупреждение

    Если этот шаг не выполнить, то при повторном нажатии клавиш Ctrl+F5 приложение ProvisionClient будет выполнено и будет получено сообщение об ошибке, где будет сказано, что область уже существует в клиентской базе данных.

  17. Нажмите клавиши Ctrl+F5, чтобы выполнить программу. Результат должен выглядеть приблизительно так:

    Start Time: 6/14/2010 6:24:19 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 3
    Complete Time: 6/14/2010 6:24:22 PM
    
    Press any key to continue . . .
    

    Три записи, существующие в таблице Products серверной базы данных SyncDB, загружаются в клиентскую базу данных SQL Server Express.

  18. Нажмите ВВОД, чтобы закрыть окно командной строки.

  19. В среде SQL Server Management Studio щелкните правой кнопкой мыши узел .\SQLEXPRESS и выберите Создать запрос, чтобы открыть окно запроса.

  20. Введите и выполните (нажав клавишу F5) следующую команду SQL, чтобы убедиться, что загрузка записей в клиентскую базу данных SQL Server Express выполнена успешно.

    select * from products
    
  21. В среде SQL Server Management Studio разверните (local) SQL Server, разверните Базы данных, разверните SyncDB, а затем разверните Таблицы.

  22. Щелкните правой кнопкой мыши dbo.Products и выберите Изменить 200 верхних строк.

  23. Добавьте в конце запись со значением 4 для ID, выберите Беспроводная мышь для Name и 45 для ListPrice. Убедитесь, что запись была сохранена, нажав TAB после ввода последнего значения.

  24. Теперь в Visual Studio нажмите клавиши Ctrl+F5, чтобы повторно выполнить клиентскую программу. Результат должен выглядеть приблизительно так:

    Start Time: 6/14/2010 6:32:44 PM
    Total Changes Uploaded: 0
    Total Changes Downloaded: 1
    Complete Time: 6/14/2010 6:32:47 PM
    
    Press any key to continue . . .
    

    После этого одна запись, добавленная на сервер, должна быть загружена в клиент. Это можно проверить, выполнив следующие действия.

  25. В среде SQL Server Management Studio выберите узел .\SQLEXPRESS.

  26. На панели инструментов нажмите кнопку Создать запрос.

  27. Введите и выполните (нажав клавишу F5) следующую команду SQL, чтобы убедиться, что загрузка записей в клиентскую базу данных SQL Server Express выполнена успешно.

    select * from products
    
  28. Чтобы закрепить навыки работы с технологией Sync Framework, можно поэкспериментировать с добавлением, обновлением и удалением записей на сервере или на клиенте. Например, после удаления записи с сервера при следующей синхронизации клиента с сервером должна удаляться соответствующая запись в клиентской базе данных.

  29. Не закрывайте Visual Studio и среду SQL Server Management Studio, если необходимо выполнить пошаговые руководства, которые приведены после этого учебника.

Полный пример кода

using System;
using System.Data;
using System.Data.SqlClient;

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;

namespace ExecuteExpressSync
{
    class Program
    {
        static void Main(string[] args)
        {
            // create connection to the SQL Express database
            SqlConnection clientConn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Initial Catalog=SyncExpressDB; Trusted_Connection=Yes");

            // create connection to the server database
            SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

            // create the sync orhcestrator
            SyncOrchestrator syncOrchestrator = new SyncOrchestrator();

            // set local provider of orchestrator to a sync provider associated with the 
            // ProductsScope in the SyncExpressDB express client database
            syncOrchestrator.LocalProvider = new SqlSyncProvider("ProductsScope", clientConn);

            // set the remote provider of orchestrator to a server sync provider associated with
            // the ProductsScope in the SyncDB server database
            syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);

            // set the direction of sync session 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();

            // print 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);
        }

        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)