ADO.NET Synchronization Services за 10 минут

ADO.NET Synchronization Services за 10 минут

 

это статья – стенография по мотивам доклада

https://www.techdays.ru/videos/1200.html

(ADO.NET Synchronization Services за 10 минут )

качество может отличаться от обычного текста :)

Как обычно происходит работа с данными в ADO.NET? У нас имеется приложение и сервер.

image

Мы делаем запрос на сервере базы данных с помощью DataAdapter, DataAdapter запускает selectCommand и возвращает DataSet.

 

image

 

После этого DataSet структурирует все в памяти, мы же в свою очередь вносим какие-либо изменения и отправляем обратно в команды Insert, Update, Delete.

image

В итоге, получается, мы постоянно используем сервер. Мы почти не используем клиент или какое-либо другое локальное хранилище, но все операции выполняются только в памяти.

 

И если, не дай Бог, у нас сломается сеть, то приложение работать перестанет.

image

 

Тем не менее, существуют приложения, способные работать без сети. Например,

Microsoft Outlook, который может локально писать письма и отправлять их при подключении к сети, Live Mesh(www.mesh.com), позволяющий синхронизировать данные и многие другие программы.

 

 

ADO.NET Sync Services

image

 

 

Каким же образом при помощи ADO.NET Sync Services написать такое приложение? Sync Services работает следующим образом. Вместо прямого соединения к серверу мы используем локальное хранилище на основе SQL Server Compact Edition версии 3.5 или выше. Sync Services обеспечивает нам готовый механизм синхронизации данных между локальным и удаленным хранилищем.

image

 

 

 

Теперь проблемы с сетью для нас не страшны и, в случае если сеть перестанет работать, мы сможем продолжить работу локально. При появлении сети, мы совершаем синхронизацию.

 

image

 

Существуют различные сценарии использования данной технологии:

 

 

1 сценарий. Кеширование.

 

Допустим, у нас есть сервер, где размещена база «NorthWindSync», в которой находятся несколько таблиц. Например, табличка с данными заказы – скомпанованные вместе Order и Order Details, и таблички-справочники Customers и Products.

Также, у нас существует клиентское приложение, имеющее локальное хранилище, которое содержит в себе копии таблиц customers и products. Это приложение может редактировать заказы напрямую в режиме онлайн, что является очень важным, ведь при создании заказа должен запускаться какой-либо бизнес-процесс.

image

Таблички же customers и products, поскольку меняются они редко, размещены локально, чтобы не скачивать их каждый раз с сервера. Однако периодически с помощью ADO.NET Sync Services с ними будет производиться синхронизация.

image

 

2 сценарий.

 

Работа с табличками, документами, справочниками может быть организована полностью локально. И периодически мы проводим синхронизацию с основным сервером.

image

 

Сценарий демо.

 

В рассматриваемом нами демо у нас будет приложение, полностью работающее в режиме оффлайн. Оно будет работать с табличками Categories и Products и обеспечивать синхронизацию с сервером с теми же табличками Categories и Products, соответственно.

ДЕМО.

image

 

Давайте создадим новое Windows Forms приложение, которое назовем демо1.

image

 

Нам необходимо создать локальную копию таблиц Categories и Products, которая будет синхронизироваться по нажатию специальной кнопки.

Так, у нас есть база «NorthWindSync», где находятся таблицы Categories и Products.

image

 

Начнем с того, что откроем solution explorer, выберем наш проект демо1 и в контекстном меню добавим новый элемент, который называется Local DataBase Cache (проще найти его в категории data).

image

 

Local Database Cache фактически представляет собой некого дизайнера, который помогает нам настроить первичную синхронизацию.

 

 

Выбираем серверное соединение. Дальше, как вы видите, можно выбрать клиентское соединение, например, одну из существующих таблиц баз SQL Сompact.

image

 

Или же можно создать новую. Здесь мы выбираем нужные нам таблицы. В данном случае Categories и Products. Нажимаем ОК.

image

 

У нас используется SQL change tracking, опция, появившаяся в 2008 сервере, которая помогает следить за изменениями на серверной стороне. В противном случае у нас бы создались сами триггеры.

 

 

Здесь также есть ссылка, при нажатии на которую мы получаем код, осуществляющий синхронизацию.

image

 

 

 

 

 

Давайте нажмем ОК. Что сейчас будет происходить? Начнет создаваться локальная база данных и будет произведена первичная синхронизация.

image

 

У нас в проекте появилась новая база данных и Visual Studio тут же предлагает нам составить Dataset. По сути, SQL Сompact может работать эффективнее, но для скорости данного демо мы создадим Dataset.

image

 

Теперь приступим к созданию формы.

Редактируя табличку products, выбираем параметр Details для таблички Products и CategoryID для ComboBox.

image image

 

 

Средство дизайнера Visual Studiо позволяет нам быстро создавать форму. Перетаскиваем табличку Products в окно дизайнера.

image

 

Нам необходимо сделать табличку Categories ComboBox, т.е. чтобы пользователь, нажимая на выпадающий список, видел не ID, а название категории.

image

 

Добавим кнопочку Sync для последующей синхронизации.

image

 

 По нажатию на нее будет генерироваться код, который создала сама Visual Studio. Этот код вызовет синхронизацию между локальной базой данных SQL Сompact и базой данных SQL сервера. Но поскольку форма в памяти еще не знает, что у нас поменялись данные в нижележащем SQL сервере, нам необходимо перегрузить наши адаптеры.

image

 

Запустим приложение. Список категорий работает.

image

 

Теперь откроем SQL Server и попробуем что-нибудь изменить. В контекстном меню таблицы Categories выбираем «Edit top 200 rows» и внесем какое-либо изменение в список категорий.

Затем вернемся к нашему приложению и, нажав кнопочку «sync»,т.е. совершив синхронизацию, обнаружим, что список категорий также изменился.

image

 

Теперь, давайте посмотрим, как работает приложение с локальной базой данных. Для этого мы просто остановим SQL Server. Таким образом, мы эмулируем сбой в сети. Убедимся, что приложение по-прежнему продолжает работать, мы можем вносить и сохранять данные.

image

Теперь, поднимая SQL Server обратно, мы без проблем синхронизируем изменения.

Однако сейчас изменения шли только в одну сторону. Чтобы сделать возможность двусторонних изменений, необходимо в Visual Studio открыть Solution Explorer и в контекстном меню LocalDataCache1.sync выбрать просмотр кода «view code».

image

 

Перед нам некий код сишарп файла, который представляет собой partial class.

image

Для двусторонней синхронизации изменений из SQL Сompact на сервер и обратно мы должны перкрыть OnIntialized() и в неких настройках категории SyncTable, класса, описывающего синхронизацию данной таблицы, сказать:

 this._categoriesSyncTable.SyncDirection = Microsoft.Synchronzation.Data.SyncDirection.Bidirectional;

 

То же самое и для второй таблицы:

this._productSyncTable.SyncDirection = Microsoft.Synchronzation.Data.SyncDirection.Bidirectional;

 

 

 

 

image

 

И вот теперь, если мы запустим наше приложение, синхронизация будет двусторонняя.

 

 

И так, мы с вами посмотрели, как за достаточно короткое время можно написать приложение, использующее локальные копии данных и синхронизирующее их с сервером.

 

 

Полезные ссылки

 

https://www.techdays.ru/Search.ado.net+sync+services – ссылка на techdays, позволяющая по этим тегам найти все, что связано с ADO.NET Sync Services.

https://msdn.microsoft.com/sync

https://blogs.msdn.com/SqlServerCompact

https://blogs.msdn.com/SteveLasker - cайты, посвященные Sync Framewok, частным случаем которого является ADO.NET Sync Services и несколько интересных блогов.

 

 

Если у вас есть вопросы, вы можете отправить их на почтовый ящик i-maratb@microsoft.com или посетить блог https://Blogs.msdn.com/mbakirov

 

 

https://www.microsoft.com/rus/msdn/events

https://www.microsoft.com/rus/msdn/events/developer_webcasts/