Основи створення додатків

Розмова про ADONET 20 не можна вважати закінченим, якщо не згадати в ньому про різних методиках програмування, про які вже йшлося в цій главі У цьому розділі як приклади вам будуть запропоновані:

■ програмний код, що використовує для взаємодії з SQL Server первинну interop-складання NET adodb dll

■ програмний код, що використовує SqlClient для виконання еквівалентної операції

■ код, що демонструє доступ за допомогою SQL Native Client і узагальнених базових класів

Як вже зазначалося вище, технології ADO і ADONET фундаментально відрізняються один від одного, незважаючи на подібне призначення У пропонованих прикладах ви побачите, як різні операції взаємодії з базою даних реалізовані в кожній з цих технологій

Тут ми приділимо мало уваги проектуванню графічного інтерфейсу, XML і віддаленій роботі в середовищі NET Framework Конструктор Windows Forms, ASPNET, SOA і віддалений доступ – дуже великі питання, вимагають більше місця, чим їм може бути відведено в справжній книзі У цьому розділі будуть продемонстровані методи переміщення інформації в джерело даних і з нього, а також методи роботи з компонентами ADONET Основною нашою метою було показати, наскільки просто і витончено можна переміщати інформацію з рівня додатки на рівень даних і в зворотному напрямку Що буде згодом відбуватися з даними, до яких отриманий доступ, нехай вирішить сам розробник

У будь-якому проекті ADONET в першу чергу потрібно підключитися до джерела (або джерел) даних, який буде використовуватися на етапі розробки проекту в Server Explorer

Приклади програм, наведені в цій главі, можна завантажити з Web-в сайта книги У цьому коді використано консольний додаток для демонстраційною ^ ^ Мережі ції нижчеописаних методик

Підключення до SQL Server

Найпростішим способом створення підключення є використання майстра конфігурування джерела даних Виберіть у меню Visual Studio команду Data ^ Add New Data Source або перегляньте джерела даних, асоційовані з існуючим проектом програми, вибравши в меню пункт Data ^ Show Data Sources

Не складніше визначити рядок підключення і програмним шляхом Рядок підключення являє собою набір пар імя-значення. Єдине, що дещо ускладнює ситуацію, – це те, що рядки підключення у різних постачальників NET дещо відрізняються, а підключення ADO взагалі стоїть осторонь

У середовищі NET Framework 20 рядки підключення більш гнучкі, ніж у попередніх Рада версіях Наприклад, у рядках підключення постачальника ADODBdll або SNAC

дозволено називати SQL Server і як Data Source, і як Server.

Можна визначити рядок підключення, грунтуючись на значеннях, збережених у файловій системі, реєстрі або обумовлених самим користувачем Якщо використовується узагальнений базовий клас, можна визначити використовуваного постачальника і рядок підключення у файлі арр conf ig

Адаптери даних

Майстер конфігурування джерела даних дозволяє задати таблиці, подання, збережені процедури і функції, які будуть використані для створення набору даних DataSet, як типизированного, так і нетипізованого Як альтернатива набір даних DataSet може бути доданий в проект і визначено в Solution Explorer В останньому випадку в проекті відкриється вікно Dataset Designer

Для визначення джерела даних і набору даних програми вікно Dataset Designer дозволяє використовувати Server Explorer і панель інструментів Інструмент Dataset Designer реалізує ще один відмінний спосіб створення наборів даних, що гарантує створення тільки типізованих наборів Прихильники чистого програмування можуть за бажання вводити вручну визначення типізованих наборів даних, хоча навряд Чи для використання такого підходу знайдуться достатні пояснення

Згадаймо, що типізований набір даних DataSet дозволяє уникнути проникнення в код помилок перетворення даних в процесі виконання програми Якщо ви збираєтеся використовувати нетипізований набір DataSet, то немає причин використовувати і Dataset Designer Все, що в даному випадку потрібно, – це оголосити новий, порожній обєкт DataSet перед тим, як він буде заповнюватися за допомогою заданого обєкта адаптера DataAdapter:

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp заповнення нетипізованого набору даних з адаптера Dim daScrapReasons As SqlDataAdapter = _

New SqlDataAdapter(sSQLScrapReasons, cnADONET2)

‘Створення нетипізованого набору даних Dim dsWOWithScrap As New DataSet

‘Заповнення набору даних з адаптера daScrapReasonsFill (dsWOWithScrap, ScrapReason)

Якщо розробник вибирає типізований набір даних, то можна використовувати майстер конфігурування адаптера таблиці (Table Adapter Configuration Wizard) для створення адаптера до кожної з таблиць, визначених в обєкті DataSet Цей майстер запускається з контекстного меню області конструктора Dataset Designer У цього майстра розробник може вибрати таблиці бази даних або визначити запити і збережені процедури, звідки будуть наповнюватися адаптери таблиць Як тільки спосіб наповнення таблиць буде визначений, майстер автоматично створить інструкції INSERT, UPDATE і DELETE, що виконуватимуться при виклику в наборі даних методу DataAdapter Update Сформовані інструкції можна переглянути і відредагувати на панелі властивостей адаптера Також можна переглянути і програмний код, сформований на панелі конструктора Редагування цього коду не рекомендується, так як будь-які зміни можуть викликати некоректну роботу обєкта Водночас будь-які зміни, виконані вручну, будуть втрачені, якщо набір даних або адаптер таблиці буде заново згенерований майстром

Обєкт читання даних і набори записів

Обєкт Recordset моделі ADO може бути оброблений як програмний інтерфейс серверного курсора або як клієнтський курсор На стороні клієнта цей обєкт може використовуватися після закриття зєднання з базою даних, але тільки від розробника залежить те, як і коли дані можуть бути змінені і повернуті на сервер

‘Набір записів з серверного курсора ADO Dim rsADOWOWithScrap As New ADODBRecordset

rsADOWOWithScrapCursorLocation = CursorLocationEnumadUseServer

rsADOWOWithScrapOpen(sSQLWOWithScrap, cnADO,_

CursorTypeEnumadOpenForwardOnly, _

LockTypeEnumadLockReadOnly)

‘Ізольований набір даних з клієнтського курсора ADO Dim cmdADOWOWithScrapl As New ADODBCommand Dim rsADOWOWithScrapl As New ADODBRecordset cmdADOWOWithScraplCommandText = sSQLWOWithScrap cmdADOWOWithScraplCommandType = _

CommandTypeEnumadCmdText rsADOWOWithScraplCursorType = _

CursorTypeEnumadOpenStatic rsADOWOWithScraplLockType = _

LockTypeEnumadLockBatchOptimistic rsADOWOWithScraplCursorLocation = _

CursorLocationEnumadUseClient

cmdADOWOWithScraplActiveConnection = cnADO rsADOWOWithScrapl = cmdADOWOWithScraplExecute

Обєкт DataReader моделі ADO являє собою односпрямований клієнтський курсор Його можна завантажити за необхідності в обєкт DataTable Обєкт DataAdapter містить методи вставки, оновлення та видалення даних обєкта DataTable набору даних DataSet і повернення змін до бази даних

Потоки

Дані можуть бути спрямовані в потік і витягнуті з нього або у форматі XML, або в двійковому вигляді Через перехідною природи з потоками кілька важко працювати У загальному випадку потік може бути поглинений тільки одного разу, після чого він зникає:

Dim bfBINWOWithScrap As New BinaryBinaryFormatter Dim msXMLWOWithScrap As New MemoryStream()

Dim msBINWOWithScrap As New MemoryStream()

‘Отримання потоку XML з набору даних bfBINWOWithScrapSerialize (msXMLWOWithScrap, _ dsBINWOWithScrap)

Зазвичай потоки XML використовуються в домені додатку NET Framework і для переміщення даних у середовищі, орієнтованої на служби Двійкові потоки найчастіше використовують в сценаріях, де використовується віддалений доступ між доменами додатків Для серіалізациі довічного потоку (наприклад, при записі на диск) необхідно глибоке знання даних Водночас потоки XML містять метадані та можуть бути серіалізовані будь-яким одержувачем, який здатний маніпулювати форматом XML

Асинхронне виконання

В окремих випадках для роботи з базою даних запиту або процедурі потрібен тривалий час, протягом якого може бути виконана інша корисна робота Незважаючи на те що існує ряд правил, обмежують ситуації, коли може бути використано асинхронне виконання, ця можливість істотно підвищує гнучкість додатків, що і продемонстровано в наступному прикладі:

Dim rdrAsyncScrapCountlnit As IAsyncResult = _ cmdScrapCountBeginExecuteReader

‘Виконуємо іншу роботу

Dim rdrAsyncScrapCount As SqlDataReader = _

cmdScrapCountEndExecuteReader(rdrAsyncScrapCountlnit)

Підключення до бази даних може одночасно обслуговувати тільки один асинхронний запит Це означає, що додатку або компоненту середнього рівня може знадобитися кілька підключень У ADONET 20 не підтримується асинхронні запити із серверних процедур CLR

Використання одного значення з бази даних

Додатки часто цікавлять значення тільки одного або декількох стовпців рядка таблиці У ADO існувала можливість виконати запит і повернути результат в обєкт Recordset, що має один рядок і один стовпець Також було можливо виконати інструкцію з вихідними параметрами, визначеними в її колекції параметрів Використання в обєкті Recordset одного значення або одного рядка вважається найменш масштабованим рішенням завдяки додатковому навантаженні, необхідної для багаторазового створення та роздроблення цього обєкта Виходячи з цього, в ADO завжди віддавалася перевага використанню колекції параметрів: paramscrapWOCount = _

cmdScrapWOByProduct CreateParameter ( &quot ScrapWOCount11, _

DataTypeEnumadlnteger, _

ParameterDirectionEnumadParamOutput) cmdScrapWOByProductParametersAppend(paramscrapWOCount) cmdScrapWOByProductParametersItem(&quotProductName&quot)Value = sProduct- Name

У ADONET вибір варіантів набагато ширше, і вибір самого підходящого з них не настільки очевидний Значення може бути повернуто в обєкт DataTable, що має один рядок в довжину Цей метод має певні переваги в деяких сценаріях, де точка даних використовується спільно з іншими таблицями DataTable в обєкті DataSet До того ж може бути використаний метод ExecuteNonQuery для заповнення змінних за допомогою колекції параметрів, коли інтерес викликають декілька стовпців одного рядка Також може бути використаний метод ExecuteScalar, коли необхідне отримання тільки одного значення:

Dim iScrapWOCount As Integer = _ cmdScrapCountExecuteScalar()

або

cmdScrapCountByProductParametersAdd(&quot@ScrapWOCount&quot, _

SqlDbTypeInt)Direction = _

ParameterDirectionOutput cmdScrapCountByProductExecuteNonQuery()

Модифікація даних

Коли додаток NET вносить в дані небудь зміни, вони повинні бути відображені в базі даних Це можна здійснити як у песимістичній моделі конкуренції, так і в оптимістичній Модель конкуренції за своєю суттю є механізмом, здатним допомогти розробнику вирішити, чи використовувати для обміну даними з базою ізольований обєкт ADONET DataClass (у моделі оптимістичній конкуренції) або метод, вимагає наявності підключення (в песимістичній моделі)

Песимістична модель конкуренції може виявитися корисною при масовій На замітку завантаженні даних або в разі використання в інструкції ExecuteNonQuery запитів DML (insert, update або delete) Використання оптимістичній моделі конкуренції вигідно в тих випадках, коли додатку потрібно при збоях операцій модифікації даних вживати повторну спробу виконання операції або записувати повідомлення в журнал помилок

Оновлення набору даних у додатку NET вимагає не більше ніж звичайної операції присвоєння Все або кілька рядків в обєкті DataSet можуть бути вставлені, видалені або оновлені Коли деяка рядок модифікується в обєкті DataSet, вона позначається як змінена Запуск методу Update обєкта DataAdapter викликає виконання інструкції INSERT, UPDATE або DELETE, визначеної в обєкті, в базі даних з використанням адаптера даних Існує ймовірність, що між операціями читання в адаптер даних і записом оновлень з нього в базу деякий інший користувач уже змінив вихідні дані в базі У такому випадку, якщо операція вставки зривається, в програмному коді слід визначити, чи мала місце помилка конкуренції Це зазвичай виконується з використанням стовпця timestamp або за допомогою порівняння вихідних значень набору даних з поточними значеннями бази даних у ході виконання методу Update Дозвіл виникаючих колізій конкуренції цілком покладається на розробника

У ADONET 11 інструкції INSERT, UPDATE і DELETE, виконуються методом Update, можуть бути автоматично згенеровані майстром конфігурування адаптера таблиці Згенеровані інструкції порівнюють все стовпчики таблиці в наборі даних з відповідними стовпцями бази даних, використовуючи параметр конкуренції NET CompareAllSearchableValues Згенеровані інструкції були некерованими, малопродуктивними і не дозволяють зручно вирішувати колізії У даній ситуації краще використовувати збережені процедури, навіть для інструкцій обєкта DataAdapter У ADONET 20 збережені процедури можуть створюватися за допомогою відповідного майстра, хоча їх складно назвати оптимальними Можуть бути також визначені різні параметри конкуренції, відмінні від CompareAllSearchableValues Зокрема, для ідентифікації виникнення колізії можна використовувати параметр CompareRowVersion для перевірки зміни первинного ключа і версії рядки, а також OverwriteChanges для перевірки тільки первинного ключа Ці параметри дещо покращують роботу методу оновлення, проте все ж краще створювати власні інструкції для адаптера даних, використовуючи при цьому збережені процедури, а не впроваджені в обєкт інструкції SQL

Звязування з елементами управління

Щоб скоротити обсяг створюваного вручну програмного коду, в Visual Studio для звязування даних з елементом управління потрібно всього лише перетягнути компонент даних на потрібний елемент В результаті буде створений повязаний елемент управління даними Ясно, що будуть потрібні і додаткові дії, проте це вже відноситься не до програмування в ADONET, а до питань проектування форм

Резюме

У цьому розділі ми порівняли обєктні моделі ADO і ADONET і досліджували деякі їхні переваги За загальним визнанням, перевага віддається ADONET Незважаючи на те що в деяких сценаріях використання ADONET 1 jc навряд чи має перевагу над використанням старої доброї ADO, в цьому розділі ми спробували показати, що версія ADONET 20 запропонувала на даний момент найбільш повноцінну технологію високорівневого доступу до даних, розроблену компанією Microsoft

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*