- •Кременчук 2010 Розповсюдження і тиражування без офіційного дозволу Кременчуцького університету економіки інформаційних технологій і управління та авторів заборонено.
- •1 Мета та завдання дисципліни
- •2 Методичні вказівки до виконання лабораторних робіт
- •3 Завдання до лабораторніх робіт
- •3.1 Лабораторна робота № 1
- •1 Теоретичні відомості
- •2 Хід роботи
- •2.1 Створення бази даних
- •2.2 Реєстрація бази даних
- •2.3 Підключення до бази даних
- •2.4 Видалення бази даних
- •2.5 Отримання метаданих
- •2.6 Резервне копіювання і відновлення
- •3 Завдання
- •4 Звіт про виконання роботи
- •5 Контрольні питання
- •3.2 Лабораторна робота № 2
- •1 Теоретичні відомості
- •1.1 Типи даних InterBase
- •2 Хід роботи
- •3 Завдання
- •4 Звіт про виконання роботи
- •5 Контрольні питання
- •3.3 Лабораторна робота № 3
- •1 Теоретичні відомості
- •1.1 Таблиці (Tables)
- •1.2 Індекси
- •2 Хід роботи
- •3 Завдання
- •4 Звіт про виконання роботи
- •5 Контрольні питання
- •3.4 Лабораторна робота № 4
- •1 Теоретичні відомості
- •1.2 Обмеження первинного ключа (Primary key)
- •1.2 Обмеження унікальності (Unique)
- •1.3 Обмеження зовнішнього ключа (Foreign keys)
- •1.4 Контрольні обмеження (Checks)
- •2 Хід роботи
- •3 Завдання
- •4 Звіт про виконання роботи
- •5 Контрольні питання
- •3.5 Лабораторна робота №5.
- •1 Теоретичні відомості
- •1.1 Генератори (Generators)
- •1.2 Бізнес-правила
- •1.3 Тригери (Triggers)
- •2. Хід роботи
- •3 Завдання
- •4 Звіт про виконання роботи
- •5 Контрольні питання
- •3.6 Лабораторна робота №6
- •1 Теоретичні відомості
- •1.1 Додавання нових даних
- •1.2 Видалення існуючих даних
- •1.3 Оновлення існуючих даних
- •2. Хід роботи
- •3. Завдання
- •4. Звіт про виконання роботи
- •5. Контрольні питання
- •3.7 Лабораторна робота №7
- •1 Теоретичні відомості
- •2. Хід роботи
- •3. Завдання
- •4. Звіт про виконання роботи
- •5. Контрольні питання
- •3.8 Лабораторна робота №8
- •1 Теоретичні відомості
- •1.1 Представлення (Views)
- •1.2 Представлення, що модифікуються
- •2 Хід роботи
- •3 Завдання
- •4 Звіт про виконання роботи
- •5 Контрольні питання
- •3.9 Лабораторна робота №9
- •1 Теоретичні відомості
- •1.1 Процедури, що зберігаються (Procedures)
- •1.2 Види процедур, що зберігаються, в InterBase
- •2 Хід роботи
- •3 Завдання
- •4. Звіт про виконання роботи
- •5. Контрольні питання
- •3.10 Лабораторна робота №10
- •1 Теоретичні відомості
- •2 Компоненти доступу до даних
- •3 Хід роботи
- •4. Звіт про виконання роботи
- •5. Контрольні питання
- •3.11 Лабораторна робота №11
- •1 Теоретичні відомості
- •1.2 Компонент tibsql
- •2. Порядок виконання
- •3. Звіт про виконання роботи
- •4. Контрольні питання
- •Перелік рекомендованої літератури
2 Компоненти доступу до даних
Для зв'язку з базою даних компоненти InterBase Express застосовують компоненти з'єднання TIBDatabase. Для цього вони використовують властивість Database: TIBDatabase; Доступ до зв'язаної транзакції здійснюється через властивість Transaction: TIBTransaction; При використанні компонентів в додатках необхідно враховувати деякі особливості. Оновлення набору даних виконується не при кожному збереженні змін. Така поведінка компонента визначається властивістю в ForcedRefresh: Boolean; яке за умовчанням має значення False. Це прискорює роботу компонента. При необхідності виконувати оновлення даних з максимальною частотою властивості ForcedRefresh потрібно привласнити значення True.
Компонент TIBTable реалізує всі можливості стандартного компонента, що інкапсулює таблицю. При відкритті набору даних впорядковування записів здійснюється відповідно до значення властивості Defaultlndex: Boolean; При значенні True запису розташовуються в порядку, визначуваному первинним індексом таблиці БД.
Компонент TIBQuery виконує всі стандартні функції компонента запиту і успадковує можливості класу TIBCustomDataSet. Як і в останніх компонентів запитів, властивість SQL: TStrings; містить текст запиту і дозволяє редагувати його. З цією властивістю пов'язаний спеціалізований редактор. Для перегляду тексту запиту можна використовувати властивість Text: string; Параметри запиту зберігаються в стандартній властивості Params: TParams; При створенні нових записів в редагованих наборах даних компонентів запитів виникає проблема привласнення значень полям первинних індексів. При збереженні нового запису в базі даних поле первинного індексу буде інкременовано засобами сервера InterBase (відповідним генератором і тригером). Проте набути цього значення в додатку можна лише зберігши зміни і відновивши набір даних, що часто вимагає великих витрат ресурсів. Для вирішення цієї проблеми в компоненті TIBQuery використовується властивість GeneratorField: TIBGeneratorField; Редактор властивості дозволяє пов'язати генератор з інкрементним полем.
Список Generator дозволяє вибрати один з доступних генераторів бази даних. Список Field задає поле набору даних, що инкременується. У рядку Increment By визначається крок значення поля, що додається.
Група радіокнопок Apply Event визначає подію, при якій спрацьовує генератор:
On New Record — при створенні нового запису;
On Post — при збереженні нового запису;
On Server — генератор управляється сервером.
Редактор властивості GeneratorField просто привласнює значення полям екземпляра класу TIBGeneratorField.
Методи-обробники подій повністю відповідають класу TIBCustomDataSet
3 Хід роботи
У Delphi створимо новий додаток, що демонструє описані вище теоретичні відомості. Головна форма міститиме таблицю з інформацією про покупців бази даних Sales. Для виконання необхідних дій із записами таблиці помістимо на форму кнопки з відповідними написами. Вигляд готової форми в режимі розробки приведений нижче.
Для роботи з базою даних необхідно створити форму-модуль даних (FileNewData Module), на яку помістимо компоненти для зв'язку з базою даних і здобуття даних (рисунок 10.1).
У властивості Name вкажемо ім'я Connection модуля даних, а збережемо файл модуля даних на диску з ім'ям ConnectionModule (замість Unit2). Вигляд форми модуля даних з компонентами приведений нижче. Для установки з'єднання з БД помістимо в модуль даних компоненти IBDatabase1 і IBTransaction1 з вкладки Interbase. Задамо параметри цих компонентів.
Рисунок 10.1 – Модуль даних
Двічі клацнемо по компоненту IBDatabase1, викликавши таким чином редактор властивостей цього компонента (рисунок 10.2). Вибираємо локальне з'єднання. За допомогою кнопки Browse викликаємо діалоговий режим вибору БД Sales.gdb. Заповнюємо параметри як показано на рисунку. Прибираємо галочку у властивості LoginPrompt для того, щоб не заводити параметри підключення при кожному запуску додатка на етапі розробки і відладки. Закриваємо редактор, при цьому автоматично заносяться відповідні властивості компонента. Прослідите які це властивості (вони виділені жирним шрифтом). Встановимо зв'язок з компонентом транзакції через властивість DefaultTransaction = IBTransaction1. Переведемо властивість Connected в True. З'єднання з БД встановлене. Для компонента транзакції через властивість DefaultDatabase = IBDatabase1 встановимо зв'язок з БД.
Рисунок 10.2 – Редактор компонента IBDatabase1
Для отримання даних про покупців додамо в модуль даних компонент-набір даних IBDataSet1 і задамо його властивості:
Database = IBDatabase1
Transaction = IBTransaction1
Компонент TIBDataSet призначений для представлення в додатках набірів даних від складних запитів При цьому набір даних залишається редагованим. Це досягається можливістю задати додаткові запити на видалення, зміну і додавання даних. Аналогічним чином працює стандартний компонент TUpdateSQL. Проте в компоненті TIBDataSet інтегровані одночасно і сам основний запит, і допоміжні запити. Основний запит міститься у властивості
property SELECTSQL: TStrings;
Створення запиту полегшує простий редактор, що викликається при клацанні на кнопці в полі редагування властивості в Інспекторі об'єктів
У властивості SELECTSQL. клацнемо по багатокрапці і в редакторі, що з'явився, клацнемо двічі по CUSTOMERS, в результаті отримаємо запит, заздалегідь після Select проставивши * (всі поля).
Аби автоматично задати всі останні запити (на видалення, зміну, додавання і оновлення даних), викличемо редактор компонента IBDataSet1 вибравши команду DataSet Editor в контекстом меню цього компонента (рисунок 10.3).
У списку Кеу Fields виділимо поле, по якому в таблиці CUSTOMERS створений первинний ключ CNUM. У списку Update Fields залишаються виділеними всі поля. Далі клацаємо по кнопці Generate SQL. Переходимо на вкладку SQL редактора. Вибираючи в Statement Type типа запиту отримуємо його текст в полі SQL Text.
Рисунок 10.3 – Редактор компонента IBDataSet1
Тепер задамо властивість GeneratorField компонента IBDataSet1 для того, щоб при додаванні нового запису в таблицю CUSTOMERS, значення в стовпці первинного ключа автоматично збільшувалося на одиницю. Клацнемо по багатокрапці в цій властивості, викликавши таким чином редактор цієї властивості. У списку Generator виберемо ім'я генератора GEN_CUSTID (він має бути створений заздалегідь в InterBase командою SQL : CREATE GENERATOR GEN_CUSTID; )
У списку Field обираємо поле первинного ключа CNUM таблиці CUSTOMERS, в текстовому полі Increment By вказуємо на скільки буде збільшено значення CNUM для нового запису.
У групі радіокнопок Apply Event визначимо подію, при якій спрацьовує генератор: On Server — генератор управляється сервером.
Для цього в базі даних SALES.GDB для таблиці CUSTOMERS заздалегідь має бути створений тригер вставки
SET TERM ^ ;
CREATE TRIGGER SET_CUST_NO FOR CUSTOMERS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.cnum = GEN_ID(gen_custid, 1);
END ^
SET TERM ;^
Відкриємо набір даних IBDataSet1, перевівши його властивість Active в True.
Настроїмо властивості компонента IBQuery1. Цей компонент нам необхідний для отримання підстаночного поля прізвища продавця для таблиці CUSTOMERS з таблиці SALESPEOPLE, до якого прикріплений кожен замовник. В результаті ми дістанемо можливість відображувати в DBGrid замість кодів SNUM в таблиці CUSTOMERS, підстановочний стовпець SNAME з таблиці SALESPEOPLE. При цьому при редагуванні і додаванні новому запису в таблицю CUSTOMERS, ми можемо оперувати не кодом продавця, а його прізвищем.
Database = IBDatabase1
Transaction = IBTransaction1
У властивість SQL цього компонента за допомогою редактора властивості запишемо запит SELECT * FROM SALESPEOPLE.
Відкриємо набір даних IBQuery1, перевівши його властивість Active в True.
Тепер створимо підстановочне поле прізвища продавця для таблиці CUSTOMERS з таблиці SALESPEOPLE. Для того відкриємо редактор полів компонента IBDataSet1, клацнувши по ньому двічі.
Знаходячись у вікні редактора полів, правою кнопкою викличемо контекстне меню, з якого виконаємо команду Add fields, в результаті всі поля таблиці CUSTOMERS відображуватимуться у вікні редактора (рисунок10.4).
Рисунок 10.4 – Редактор полів компонента IBDataSet1
Для додавання підстаночного поля Sname у вікні редактора полів правою кнопкою викличемо контекстне меню, з якого виконаємо команду New Field. З'явиться вікно редактора нового поля (рисунок 10.5).
Рисунок 10.5 – Вікно редактора нового поля
У текстовому полі Name вкажемо ім'я підстановочного поля sname. Із списку Type виберемо типа поля String. У Field Type виберемо Lookup- підстановлювальне поле. У Luokup definition здійснимо наступне: із списку DataSet виберемо IBQuery1 (з якого набору даних береться підстановочне поле), із списку Result Field виберемо Sname (яке поле підставляється), із списку Кеу Fields виберемо поле SNUM таблиці CUSTOMERS, із списку Lookup Keys виберемо поле SNUM таблиці SALESPEOPLE. Налаштування готове, натискуємо кнопку ОК.
Для того, щоб з даними набірів даних (IBDataSet1, IBQuery1) можна було працювати при проектуванні головної форми, пов'яжемо їх з компонентами джерелами даних TDataSource (находяться на вкладці DataAccess). Помістимо два таких компонента в модуль даних. Для DataSource1 у властивості DataSet виберемо IBDataSet1, а для DataSource2 - IBQuery1.
Тепер переходимо до налаштування головної форми. У розділ USES додамо ConnectionModule для посилань на компоненти модуля даних. Далі поміщаємо на форму і настроюємо наступні компоненти:
DBGrid1 (вкладка Data Controls). У властивості DataSource обираємо Connection.DataSource1 для відображення записів таблиці CUSTOMERS.
Три компоненти TDBEdit для відображення і редагування поточного запису таблиці CUSTOMERS: DBEdit1 помістимо під стовпцем прізвища покупця (замовника) DBGrid1 і настроїмо таким чином: у властивості DataSource обираємо Connection.DataSource1, у властивості DataField виберемо CNAME (прізвище покупця).
DBEdit2 помістимо під стовпцем назви міста замовника в DBGrid1 і настроїмо таким чином: у властивості DataSource обираємо Connection.DataSource1, у властивості DataField виберемо CITY (місто покупця).
DBEdit3 помістимо під стовпцем рейтингу замовника в DBGrid1 і настроїмо таким чином: у властивості DataSource обираємо Connection.DataSource1, у властивості DataField виберемо RATING (рейтинг покупця).
Під стовпцем підстановочного поля DBGrid1 розмістимо об'єкт DBLookupComboBox1, пов'язаний з підстановочним полем Sname, перетягнувши його мишкою з редактора полів компонента IBDataSet1. Властивості компонента DBLookupComboBox1 настроються автоматично.
Якщо всі налаштування виконані правильно, в перерахованих вище компонентах відображуватимуться дані таблиці CUSTOMERS і підстановочне поле з таблиці SALESPEOPLE.
Тепер помістимо на форму п'ять командних кнопок і запишемо в них відповідні коди
Для кнопки Нова (запис):
procedure TForm1.InsertBtnClick(Sender: TObject);
begin
with Connection.IBDataSet1 do begin
Last;
dbEdit1.SetFocus;
Insert;
end;
end;
Для кнопки Видалити (запис):
procedure TForm1.DeleteBtnClick(Sender: TObject);
begin
with Connection.IBDataSet1 do begin
Delete;
end;
end;
Для кнопки Прийняти (зміни):
procedure TForm1.PostBtnClick(Sender: TObject);
begin
with Connection.IBDataSet1 do begin
if Modified then
Post;
end;
end;
Для кнопки Зберегти (зміни):
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
with Connection do begin
try
IBDataSet1.ApplyUpdates;
IBTransaction1.CommitRetaining;
except
IBTransaction1.Rollback;
end;
end;
end;
Для кнопки Відновити (з БД):
procedure TForm1.Button1Click(Sender: TObject);
begin
Connection.IBDataSet1.Close;
Connection.IBDataSet1.Open;
Connection.IBDataSet1.Last;
end;
Тепер при додаванні нового запису заповнюються дані в полях редагування під сіткою, причому продавця можна вибрати з випадного списку DBLookupComboBox1. Стовпець CNUM (код замовника не заповнюється, його значення автоматично генерується тригером вставки). Після редагування запису або вставки нового запису кнопка «Прийняти» дозволяє зберегти зміни в буфері пам'яті (метод Post компонента набору даних).
Якщо після цього натискувати кнопку «Відновити», ми побачимо дані до зміни.
Збережуться зміни в БД лише після виконання методу ApplyUpdates компонента набору даних.
Вигляд форми приведений нижче (рисунок 10.6).
Рисунок 10.6 – Головна форма на етапі розробки
