Tag Archives: Data Synchronization

Видео: Visual Studio 2010, SQL Server и Change Tracking

Пример создания приложения на Visual Studio 2010, которое использует локальный кэш и синхронизацию с основной базой данных MS SQL Server с помощью технологии Change Tracking.

SQL Server, Change Tracking и Visual Studio 2010 – практический пример

В данной статье я хочу показать, как с помощью SQL Server, Change Tracking и Visual Studio 2012 создать небольшое приложение, которое будет иметь свою локальную базу данных и сможет выполнять двухстороннюю синхронизацию с основным сервером. Это как раз основное предназначение технологии. В качестве примера я буду использовать базу данных из своей предыдущей статьи (также скрипт создания базы можно скачать по этой ссылке). В качестве среды разработки буду использовать Visual Studio 2010 и C#, в качестве основного сервера баз данных MS SQL Server установленный локально на моем ноутбуке.

  1. Шаг первый: выполняем скрипт создания базы данных на локальном SQL Server.
  2. Запускаем Visual Studio и создаем новый проект Windows Forms.

  3. В меню Project -> Add New Item выбираем Local Database Cache и добавляем его в текущий проект.

  4. В проект будет добавлен файл .sync и откроется окно Configure Data Synchronization.

  5. Для установки Server connection нажимаем кнопку New и создаем подключение с нашим локальным SQL Server.

  6. Параметр Client Connection можно настроить на уже существующий файл SQL Server Compact Edition. Если нет локальной базы данных, можно оставить настройку TrackingChanges_test.sdf (new) по умолчанию для создания новой базы данных в проекте. Имя новой базы данных будет основываться на имени базы данных на сервере.
  7. Опцию Use SQL Server change tracking оставляем включенной по умолчанию.
  8. В раздел Cached Tables с помощью кнопки OK добавляем таблицы, для которых мы хотим настроить лакольное кэширование. Появляется окно Configure Tables for Offline Use. Значение параметра Data to download оставляем по умолчанию New and incremental changes after first synchronization. Наше приложение будет извлекать из сервера записи, которые были изменены с момента последней синхронизации. Во время первой синхронизации будет загружена вся таблица. Если выбрать значение Entire table each time, то при синхронизации локальная копия таблицы будет заменяться ее версией с сервера баз данных.

  9. Теперь в окне Configure Data Synchronization развернем раздел Advanced. С помощью опции Synchronize tables in a single transaction мы можем задать, будут ли таблицы синхронизированы по отдельности или в пределах одной транзакции. По умолчанию этот флажок не установлен, и все таблицы будут синхронизироваться по отдельности. Если возникнут ошибки, только таблицы с ошибками откатят свои изменения. Если выбран этот параметр, все таблицы синхронизируются в одной транзакции. Если обнаружены ошибки, все модификации для всех таблиц откатываются.
  10. Для параметра Create synchronization components оставляем значение по умолчанию Client and Server, т.к. мы хотим создать приложение, которое будет выполнять двухстороннюю синхронизацию между кэшем и основной базой данных.
  11. Если мы нажмем ссылку Show Code Example, то нам будет приведен пример кода для нашего приложения, который будет делать синхронизацию. Скопируем его в буфер обмена, т.к. он нам еще пригодится.

  12. Нажимаем кнопку OK и закрываем окно Configure Data Synchronization. Теперь перед нами появляется Data Source Configuration Wizard.

  13. Оставляем по умолчанию значение Dataset и жмем Next.
  14. В появившемся окне выбираем таблицы clients и orders, задаем имя нашему DataSet и жмем Finish.

  15. В принципе на этом настройка локального кэша в нашем приложении закончена. Давайте теперь добавим несколько элементов в наше приложение, чтобы визуально посмотреть, как все будет работать. В первую очередь добавим элемент DataGridView и в качестве Data Source я выберу таблицу clients из моего MyDataSet.

    Также я оставлю возможность редактировать записи прямо в моем DataGridView и для удобства переименую его в dataGridView_clients.

  16. Аналогичным образом я добавляю еще один DataGridView для таблицы orders. Также мне потребуются 3 кнопки: Sync, Submit Changes и Refresh Data.
  17. Кнопка Refresh Data будет обновлять наши элементы DataGridView записями из локального кэша. В обработчик на нажатие этой кнопки я добавлю следующий код.
  18. try
    {
        this.ordersTableAdapter.Fill(this.myDataSet.orders);
        this.clientsTableAdapter.Fill(this.myDataSet.clients);
    }
    catch (System.Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
  19. Задача кнопки Submit Changes – передавать и сохранять измененения в элементах DataGridView в наш локальный кэш приложения. На ней соответственно будет исполнятся следующий код.
  20. try
    {
        this.Validate();
     
        this.clientsBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
     
        this.clientsTableAdapter.Update(this.myDataSet.clients);
        this.ordersTableAdapter.Update(this.myDataSet.orders);
     
        MessageBox.Show("Update successful");
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed: " + ex.Message);
    }
  21. И наконец с помощью кнопки Sync будет выполняться синхронизация нашего локального кэша с основной базой данных.
  22. try
    {
        MyLocalDataCacheSyncAgent syncAgent = new MyLocalDataCacheSyncAgent();
        Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();
     
        MessageBox.Show("Changes downloaded: " + syncStats.TotalChangesDownloaded.ToString() + Environment.NewLine + "Changes uploaded: " + syncStats.TotalChangesUploaded.ToString());
    }
    catch (System.Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
  23. Также для того, чтобы обеспечить именно двухстороннюю синхронизацию, в окне Solution Explorer на MyLocalDataCache.sync жмем правой клавишей мыши, выбираем View Code и задаем такой код:
  24. namespace ChangeTrackingSyncApp_example {
     
        public partial class MyLocalDataCacheSyncAgent {
     
            partial void OnInitialized(){
                this._clientsSyncTable.SyncDirection = Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
             this._ordersSyncTable.SyncDirection = Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
            }
        }
    }

Вот в принципе и все. На этом маленьком и максимально упрощенном примере я хотел показать, как просто можно создать приложение с локальным кэшем и использовать Change Tracking для двухсторонней синхронизации данных. В дополнение к статье я выложу видео, в котором я проделаю те же самые шаги, что и в статье, а также покажу, как будет работать наше приложение. Оставайтесь на связи, я планирую опубликовать еще одну заметку по Change Tracking и затем перейти к технологии Change Data Capture.