НОУ ІНТУІТ, Лекція, Використання баз даних у додатках

Від'єднані набори даних

Розглянута раніше логіка взаємодії клієнтського додатка з базою даних, заснована на з'єднанні, виправдана реалізації одностороннього зв'язку з базою даних. Це може бути отримання даних, або виконання запитів, пов'язаних із внесенням змін до неї. Реалізація складних операцій взаємодії з БД при цьому є дуже трудомістким процесом і вимагає написання великої кількості програмного коду, його налагодження і т. д. ADO.NET надає більш досконалі способи організації двосторонньої взаємодії програми з базою даних, заснованої на від'єднаних наборах даних.

Основною ідеєю використання від'єднаних наборів даних є зміна алгоритмів взаємодії програми з базою даних за рахунок підключення до набору даних, виконання запиту та створення копії даних на стороні клієнта, відключення від БД, здійснення маніпуляцій з даними на стороні клієнта, при необхідності внесення змін до бази даних , підключення до неї, передачі змін та відключення. Таким чином, всі основні маніпуляції з даними відбуваються у від'єднаному наборі даних, який є копією даних, що зберігаються в БД, а внесення змін відбувається в одній пакетній операції. Все це зменшує час, протягом якого має бути відкрито з'єднання з БД, прискорює роботу та спрощує логіку взаємодії програми з даними. Розглянемо об'єкт ADO.NET, що реалізує даний механізм.

Клас DataSet

Об'єкт DataSet є контейнером, що містить об'єкти DataTable і Relation . DataTable є таблицею, що складається з рядків і стовпців. Рядки таблиці представлені об'єктом DataRow, який, у свою чергу,є колекцією стовпців таблиці (об'єкт DataColumn). Дані DataSet від'єднані від БД. Усі зміни даних кешуються в об'єктах DataRow. При виникненні необхідності передачі змін у даних об'єкта DataSet існує можливість передачі лише частини даних, що змінилася, що дозволяє значно економити ресурси каналу зв'язку, тому що в цьому випадку передається набагато менший обсяг даних. Узагальнюючи все вищесказане, можна дійти невтішного висновку у тому, що використання об'єкта DataSet часом виявляється ефективнішим, ніж DataReader . Найбільш типовими ситуаціями, в яких рекомендується застосовувати об'єкт DataSet, є:

Більш детальна інформація щодо сценаріїв використання DataSet знаходиться в [1].

Використання DataSet

Вище говорилося у тому, що DataSet складається з таблиць, які, своєю чергою, складаються з рядків, які, своєю чергою, - зі стовпців. Кожен із перелічених елементів реалізований у вигляді класу. Для керування автономними змінами DataSet відстежує інформацію про версію кожного об'єкта DataRow. Це означає, що коли відбувається редагування рядка, його вихідне значення зберігається у пам'яті, а рядок позначається як змінений. Аналогічні дії відбуваються і при додаванні та зміні рядків DataTable. Надалі до бази даних можна перенести значення лише рядків, які торкнулися змінами. Таким чином, DataSet ніколи не підтримує постійне з'єднання з базою даних.

Для вилучення даних з бази даних та наповнення ними об'єкта DataSet необхідно використовувати ще один об'єкт DataAdapter , який також дозволяє оновлювати дані БД на основі внесених до DataSet змін.

Клас DataAdapter

DataAdapterє сполучною ланкою між базою даних та DataSet. Точніше, він пов'язує БД та об'єкт DataTable, розташований усередині DataSet.

DataAdapter містить три основні методи, які дозволяють йому виконувати всі необхідні операції, пов'язані із вилученням та оновленням даних.

FillВиконання запиту типу Select , визначеного у властивості SelectCommand , та додавання таблиці, одержуваної в результаті цього запиту, DataSet .
FillSchema()Виконання запиту типу Select , текст якого розташований у властивості SelectCommand , та додавання таблиці, що містить лише структуру даних, отриманих в результаті виконання запиту, DataSet .
Update()Застосовує всі зміни, внесені до DataTable, до джерела даних. При цьому виконуються команди вставки, оновлення та видалення, розташовані у властивостях InsertCommand, UpdateCommand, DeleteCommand.

Розглянемо приклад використання об'єктів DataSet та DataAdapter для вилучення даних із БД, наповнення DataSet та відображення даних на сторінці Web-програми.

Перш за все необхідно встановити підключення до джерела даних. Для цього потрібно використовувати рядок підключення та об'єкт Connection . У цьому прикладі підключення відбуватиметься до бази даних Test_Db, розташованої на локальному сервері SQL Server Express 2005:

Створимо об'єкт DataAdapter і передамо йому як параметр рядок запиту, а також рядок підключення до БД:

Тепер необхідно створити об'єкт DataSet і заповнити його даними за допомогою DataAdapter:

З наведеного вище прикладу видно, що метод Fill об'єкта da як параметр використовує ім'я об'єкта DataSet , куди необхідно помістити дані,які повертаються в результаті виконання запиту, який визначений у рядку sqlString . У другому параметрі можна вказати ім'я, яке буде зіставлено з таблицею, створеною в DataSet. З прикладу видно, що у разі не використовується явний виклик методу Open об'єкта Connection - даний метод викликається неявно у виконанні методу Fill . Таким чином DataAdapter спочатку відкриває з'єднання з БД, потім виконує необхідні маніпуляції з даними, після чого закриває відкрите раніше з'єднання. Якщо з якихось причин такий алгоритм взаємодії з базою даних потрібно змінити, необхідно до виклику методу Fill відкрити з'єднання з базою даних. У цьому випадку DataAdapter використовуватиме вже існуюче з'єднання.

Після того, як необхідний набір даних було вилучено з бази даних, його необхідно відобразити на веб-сторінці. Для цього можна скористатися способом, описаним раніше, під час розгляду об'єкта DataReader. Однак в даному випадку набагато більш ефективного використання можна досягти із застосуванням можливостей прив'язування даних до візуальних об'єктів, здатних виводити дані на екран. Основна ідея, що лежить в основі прив'язки даних, полягає у створенні зв'язку між об'єктом даних та елементом керування. Всю подальшу роботу, пов'язану з вилученням даних та виведенням їх на екран, виконує ASP.NET Розглянемо основні способи прив'язки даних та особливості їх виведення на екран, реалізовані у різних елементах управління.

Прив'язка та відображення даних

Прив'язка даних дуже потужним засобом організації автоматичного відображення даних в елементі управління без використання програмування.

Більшість елементів керування ASP. NET підтримують прив'язку даних. При цьому прив'язка може працювати як для даних зодним значенням, так даних з множинними значеннями. Прив'язка з одним значенням означає, що елемент керування може відображати єдине значення , що отримується з джерела даних. Такі принципи використовуються елементами керування TextBox, LinkButton, Image, Hyperlink. Прив'язка з множиною означає, що елемент керування може відображати кілька значень, що витягуються з джерела даних. Елементи керування, що підтримують прив'язку з множинними значеннями, будуються на основі списків та електронних таблиць. Типовими представниками таких елементів управління є ListBox та GridView.

Для прив'язування елементів керування джерела даних необхідно встановити значення властивості DataSource , у якому вказати найменування об'єкта, що містить дані, необхідні відображення. Під час встановлення властивості DataSource створюється логічний зв'язок між елементом управління, здатним відображати дані, та об'єктом даних, що підлягають відображенню. Після того, як джерело даних визначено, необхідно заповнити його даними. Для цього використовується метод DataBind() елемента управління, що заповнюється даними, який витягує дані з джерела, проходить у циклі джерела, визначеному в DataSource , і оновлює сторінку. Прив'язка з множинними значеннями є найбільш потужним типом прив'язки, тому що в цьому випадку не потрібно програмувати циклічний перебір значень джерела даних і виведення їх на екран - ця логіка вже реалізована в елементі керування, що підтримує прив'язку.

Розглянемо основні засади використання обох типів прив'язування даних.

Прив'язка з одним значенням

Елементи управління, що підтримують прив'язку даних з одним значенням, дозволяють здійснити прив'язкудеякі з їх властивостей до даних за допомогою виразу прив'язки даних. Вираз прив'язки даних вводиться в тексті сторінки .aspx і полягає усередині обмежувачів.

Як вираз прив'язки даних може бути використана загальнодоступна або захищена змінна, а також будь-який інший вираз, який може бути обчислений в момент виконання сторінки. Так, як вираз прив'язки даних допустимо використовувати функції, властивості, об'єкти, визначені в класі сторінки.

Щоб обчислити вираз прив'язки, необхідно в коді програми викликати метод Page.DataBind() . У момент виклику даного методу ASP.NET перевіряє всі вирази на поточній сторінці, при необхідності здійснює обчислення та замінює їх відповідними значеннями.

Як приклад, розглянемо прив'язку елемента Label до даних таблиці "Товари". Для цього створимо метод GetProductName() , який повертає як значення вміст першого рядка стовпця "НайменуванняТовара" таблиці "Товари".

Тепер необхідно додати елемент Label на сторінку .aspx і встановити вираз прив'язки властивості Text даного елемента.

У методі Page.Load() зробимо виклик методу Page.DataBind() .

Результат роботи цього додатка представлений на рис. 10.11.

інтуіт

Повний текст вихідного коду цього прикладу виглядає так:

Як очевидно з цього прикладу, у такий спосіб можна відобразити лише одне значення будь-якого поля таблиці. Про те, яким чином можна здійснювати множинну прив'язку і виводити всі значення, що витягуються з бази даних, буде розказано нижче.

Крім виразів прив'язки, ASP.NET підтримує також $-вирази, що є послідовністю коду, яку можна додавати на aspx-сторінку та яка буде виконуватись у момент звернення до сторінки. Visual Studio 2005 містить вбудований будівельник $-виразів, який дозволяє витягувати налаштування користувача та інформацію про рядок підключення, розташовані у файлі web.config . Наприклад, для вилучення налаштування програми на ім'я MySetting і виведення її вмісту на екран можна помістити на сторінці елемент Literal , у властивості Text якого встановити значення .