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


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

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

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

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

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

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

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

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

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

  7. Повторите два предыдущих шага, чтобы добавить ссылку к сборке System.Data.SqlServerCe.

  8. Добавьте следующие инструкции 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;
    
  9. Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL с компактной базой данных.

    // create a connection to the SyncCompactDB database
    SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='C:\SyncSQLServerAndSQLCompact\SyncCompactDB.sdf'");
    
  10. Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL с серверной базой данных.

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

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

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

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

    2. Задайте в качестве локального поставщика объекта модуля взаимодействия синхронизации объект SqlCeSyncProvider, связанный с клиентской базой данных SyncCompactDB. Класс SqlCeSyncProvider инкапсулирует службу синхронизации для SQL Server Compact, взаимодействующую с клиентом, и отделяет модуль взаимодействия синхронизации от подробностей реализации клиентской базы данных.

    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 CE sync provider associated with the 
    // ProductsScope in the SyncCompactDB compact client database
    syncOrchestrator.LocalProvider = new SqlCeSyncProvider("OrdersScope-NC", 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("OrdersScope-NC", serverConn);
    
    // set the direction of sync session to Upload and Download
    syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
    
  12. Чтобы подписаться на уведомления об ошибках, возникающих при изменении клиента, добавьте следующий код. Если применение строки на клиенте завершилось неуспешно, то вызывается событие ApplyChangeFailed. Далее в этом пошаговом руководстве будет определен обработчик для событий ошибок.

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

    // execute the synchronization process
    SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
    
  14. Добавьте следующие инструкции к методу 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);
    
  15. Добавьте в класс 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);
    }
    
  16. В обозревателе решений щелкните правой кнопкой мыши ExecuteCompactFilteredSync и выберите команду Построить.

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

    ПредупреждениеВнимание!

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

  18. Нажмите клавиши 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 в компактный клиент.

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

  20. В среде SQL Server Management Studio выберите SQL Server Compact [Мой компьютер\...\SyncCompactDB].

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

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

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

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

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 ExecuteCompactFilteredSync
{
    class Program
    {
        static void Main(string[] args)
        {
            // create a connection to the SyncCompactDB database
            SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='C:\SyncSQLServerAndSQLCompact\SyncCompactDB.sdf'");

            // create a connection to the SyncDB 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 CE sync provider associated with the 
            // ProductsScope in the SyncCompactDB compact client database
            syncOrchestrator.LocalProvider = new SqlCeSyncProvider("OrdersScope-NC", 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("OrdersScope-NC", 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)