ADO.NET Synchronization Services за 10 минут
ADO.NET Synchronization Services за 10 минут
это статья – стенография по мотивам доклада
https://www.techdays.ru/videos/1200.html
(ADO.NET Synchronization Services за 10 минут )
качество может отличаться от обычного текста :)
Как обычно происходит работа с данными в ADO.NET? У нас имеется приложение и сервер.
Мы делаем запрос на сервере базы данных с помощью DataAdapter, DataAdapter запускает selectCommand и возвращает DataSet.
После этого DataSet структурирует все в памяти, мы же в свою очередь вносим какие-либо изменения и отправляем обратно в команды Insert, Update, Delete.
В итоге, получается, мы постоянно используем сервер. Мы почти не используем клиент или какое-либо другое локальное хранилище, но все операции выполняются только в памяти.
И если, не дай Бог, у нас сломается сеть, то приложение работать перестанет.
Тем не менее, существуют приложения, способные работать без сети. Например,
Microsoft Outlook, который может локально писать письма и отправлять их при подключении к сети, Live Mesh(www.mesh.com), позволяющий синхронизировать данные и многие другие программы.
ADO.NET Sync Services
Каким же образом при помощи ADO.NET Sync Services написать такое приложение? Sync Services работает следующим образом. Вместо прямого соединения к серверу мы используем локальное хранилище на основе SQL Server Compact Edition версии 3.5 или выше. Sync Services обеспечивает нам готовый механизм синхронизации данных между локальным и удаленным хранилищем.
Теперь проблемы с сетью для нас не страшны и, в случае если сеть перестанет работать, мы сможем продолжить работу локально. При появлении сети, мы совершаем синхронизацию.
Существуют различные сценарии использования данной технологии:
1 сценарий. Кеширование.
Допустим, у нас есть сервер, где размещена база «NorthWindSync», в которой находятся несколько таблиц. Например, табличка с данными заказы – скомпанованные вместе Order и Order Details, и таблички-справочники Customers и Products.
Также, у нас существует клиентское приложение, имеющее локальное хранилище, которое содержит в себе копии таблиц customers и products. Это приложение может редактировать заказы напрямую в режиме онлайн, что является очень важным, ведь при создании заказа должен запускаться какой-либо бизнес-процесс.
Таблички же customers и products, поскольку меняются они редко, размещены локально, чтобы не скачивать их каждый раз с сервера. Однако периодически с помощью ADO.NET Sync Services с ними будет производиться синхронизация.
2 сценарий.
Работа с табличками, документами, справочниками может быть организована полностью локально. И периодически мы проводим синхронизацию с основным сервером.
Сценарий демо.
В рассматриваемом нами демо у нас будет приложение, полностью работающее в режиме оффлайн. Оно будет работать с табличками Categories и Products и обеспечивать синхронизацию с сервером с теми же табличками Categories и Products, соответственно.
ДЕМО.
Давайте создадим новое Windows Forms приложение, которое назовем демо1.
Нам необходимо создать локальную копию таблиц Categories и Products, которая будет синхронизироваться по нажатию специальной кнопки.
Так, у нас есть база «NorthWindSync», где находятся таблицы Categories и Products.
Начнем с того, что откроем solution explorer, выберем наш проект демо1 и в контекстном меню добавим новый элемент, который называется Local DataBase Cache (проще найти его в категории data).
Local Database Cache фактически представляет собой некого дизайнера, который помогает нам настроить первичную синхронизацию.
Выбираем серверное соединение. Дальше, как вы видите, можно выбрать клиентское соединение, например, одну из существующих таблиц баз SQL Сompact.
Или же можно создать новую. Здесь мы выбираем нужные нам таблицы. В данном случае Categories и Products. Нажимаем ОК.
У нас используется SQL change tracking, опция, появившаяся в 2008 сервере, которая помогает следить за изменениями на серверной стороне. В противном случае у нас бы создались сами триггеры.
Здесь также есть ссылка, при нажатии на которую мы получаем код, осуществляющий синхронизацию.
Давайте нажмем ОК. Что сейчас будет происходить? Начнет создаваться локальная база данных и будет произведена первичная синхронизация.
У нас в проекте появилась новая база данных и Visual Studio тут же предлагает нам составить Dataset. По сути, SQL Сompact может работать эффективнее, но для скорости данного демо мы создадим Dataset.
Теперь приступим к созданию формы.
Редактируя табличку products, выбираем параметр Details для таблички Products и CategoryID для ComboBox.
Средство дизайнера Visual Studiо позволяет нам быстро создавать форму. Перетаскиваем табличку Products в окно дизайнера.
Нам необходимо сделать табличку Categories ComboBox, т.е. чтобы пользователь, нажимая на выпадающий список, видел не ID, а название категории.
Добавим кнопочку Sync для последующей синхронизации.
По нажатию на нее будет генерироваться код, который создала сама Visual Studio. Этот код вызовет синхронизацию между локальной базой данных SQL Сompact и базой данных SQL сервера. Но поскольку форма в памяти еще не знает, что у нас поменялись данные в нижележащем SQL сервере, нам необходимо перегрузить наши адаптеры.
Запустим приложение. Список категорий работает.
Теперь откроем SQL Server и попробуем что-нибудь изменить. В контекстном меню таблицы Categories выбираем «Edit top 200 rows» и внесем какое-либо изменение в список категорий.
Затем вернемся к нашему приложению и, нажав кнопочку «sync»,т.е. совершив синхронизацию, обнаружим, что список категорий также изменился.
Теперь, давайте посмотрим, как работает приложение с локальной базой данных. Для этого мы просто остановим SQL Server. Таким образом, мы эмулируем сбой в сети. Убедимся, что приложение по-прежнему продолжает работать, мы можем вносить и сохранять данные.
Теперь, поднимая SQL Server обратно, мы без проблем синхронизируем изменения.
Однако сейчас изменения шли только в одну сторону. Чтобы сделать возможность двусторонних изменений, необходимо в Visual Studio открыть Solution Explorer и в контекстном меню LocalDataCache1.sync выбрать просмотр кода «view code».
Перед нам некий код сишарп файла, который представляет собой partial class.
Для двусторонней синхронизации изменений из SQL Сompact на сервер и обратно мы должны перкрыть OnIntialized() и в неких настройках категории SyncTable, класса, описывающего синхронизацию данной таблицы, сказать:
this._categoriesSyncTable.SyncDirection = Microsoft.Synchronzation.Data.SyncDirection.Bidirectional;
То же самое и для второй таблицы:
this._productSyncTable.SyncDirection = Microsoft.Synchronzation.Data.SyncDirection.Bidirectional;
И вот теперь, если мы запустим наше приложение, синхронизация будет двусторонняя.
И так, мы с вами посмотрели, как за достаточно короткое время можно написать приложение, использующее локальные копии данных и синхронизирующее их с сервером.
Полезные ссылки
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/
Comments
- Anonymous
May 27, 2009
У нас в команде решили провести эксперимент – перевод части докладов techdays   в виде статьи. Итак,