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


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

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

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

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

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

  3. Укажите ExecuteExpressFilteredSync в качестве имени проекта.

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

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

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

  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.

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

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

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

  10. Добавьте следующий код к методу Main, чтобы создать модуль взаимодействия синхронизации, инициирующий и управляющий сеансами синхронизации. Модуль взаимодействия синхронизации содержит две службы синхронизации, которые будут применяться в сеансе синхронизации. Для описываемого сценария потребуется объект поставщика для серверной базы данных и объект поставщика для клиентской базы данных SQL Express. Общие этапы создания модуля взаимодействия для этого сценария таковы:

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

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

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

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

    // create a sync orchestration object
    SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
    
    // set the local provider of sync orchestrator to a sync provider that is
    // associated with the OrdersScope-NC scope in the SyncExpressDB database
    syncOrchestrator.LocalProvider = new SqlSyncProvider("OrdersScope-NC", clientConn);
    
    
    // set the remote provider of sync orchestrator to a server sync provider that is
    // associated with the OrdersScope-NC scope in the SyncDB database
    syncOrchestrator.RemoteProvider = new SqlSyncProvider("OrdersScope-NC", serverConn);
    
    // set the direction 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, чтобы синхронизировать SQL Server и SQL Express. Этот код вызывает метод Synchronize()()()() на объекте SyncOrchestrator для начала синхронизации серверной базы данных SyncDB и базы данных SQL Server Express SyncExpressDB.

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

    // prints statistics from the sync session
    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. В обозревателе решений щелкните правой кнопкой мыши ExecuteExpressFilteredSync и выберите команду Построить.

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

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

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

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

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

    Две записи, для набора столбцов которых OriginalState задано «NC», загружаются из таблицы Orders на сервере SyncDB в клиентскую базу данных SQL Express.

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

  19. В среде SQL Server Management Studio выберите .\SQLEXPRESS.

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

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

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

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

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

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

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

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

            // create a sync orchestration object
            SyncOrchestrator syncOrchestrator = new SyncOrchestrator();

            // set the local provider of sync orchestrator to a sync provider that is
            // associated with the OrdersScope-NC scope in the SyncExpressDB database
            syncOrchestrator.LocalProvider = new SqlSyncProvider("OrdersScope-NC", clientConn);

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

            // set the direction 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);

            // starts the synchornization session
            SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();

            // prints statistics from the sync session
            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)