- •Базы данных
- •Содержание
- •Введение
- •1. Создание приложений с использованием технологии bde
- •1.1. Лабораторная работа № 1: создание базы данных
- •1.1.1. Создание таблиц dBase IV
- •1.1.2. Создание индексов
- •1.1.3. Создание таблиц Paradox 7
- •1.1.4. Задание свойств таблицы Paradox 7
- •Задание на лабораторную работу № 1
- •1.2. Лабораторная работа № 2: установление связей между таблицами в многотабличной базе данных
- •1.2.1. Создание алиаса
- •1.2.2. Связывание таблиц
- •Задание на лабораторную работу № 2
- •1.3. Лабораторная работа № 3: работа с полями и компонентом dbGrid
- •1.3.1. Использование объектов-полей
- •1.3.2. Обращение к значению поля
- •1.3.3. События объекта-поля
- •1 Рис. 10. Пример использования события OnCellClick .3.4. События сетки dbGrid
- •1.3.5. Создание объектов-столбцов в dbGrid
- •1.3.6. Формирование списка возможных значений столбца
- •Задание на лабораторную работу № 3:
- •1.4. Лабораторная работа № 4: работа с наборами данных (компонент Table)
- •1.4.1. Открытие и закрытие набора данных
- •1.4.2. Доступ к записям
- •1.4.3. Навигация по набору данных
- •1.4.4. Поиск записей в наборах данных
- •1.4.5. Реализация каскадных изменений
- •1.4.6. Пример выполнения лабораторной работы
- •Задание на лабораторную работу № 4
- •1.5. Лабораторная работа № 5: работа с отчетами
- •1.5.1. Создание простейшего отчета
- •1.5.2. Создание отчета для связанных наборов данных
- •1.5.3. Использование выражений (компонент qrExpr)
- •1.5.4. Группирование данных в отчете
- •Задание на лабораторную работу № 5:
- •1.6. Лабораторная работа № 6: sql-запросы (компонент Query)
- •Задание на лабораторную работу № 6
- •2. Создание приложений, работающих с базами данных interbase
- •2.1. Лабораторная работа № 1: создание схемы базы данных
- •2.2. Лабораторная работа № 2: доступ к базе данных InterBase c использованием dbExpress
- •2.3. Лабораторная работа № 3: транзакции
- •2.4. Лабораторная работа № 4: отображение данных запроса
- •2.5. Лабораторная работа № 5: вычисляемые, агрегатные и подстановочные поля
- •2.5.1. Вычисляемые поля
- •2.5.2. Агрегатные поля
- •2.5.3. Подстановочные поля
- •2.6. Лабораторная работа № 6: связь Master-Detail
- •2.7. Лабораторная работа № 7: локальная репликация данных
- •Приложение 1 варианты заданий к лабораторным работам Вариант 1. Прием заказов
- •Вариант 2. Поставки товаров
- •Вариант 3. Исполнители
- •Вариант 4. Картинная галерея
- •Вариант 5. Порт
- •Вариант 6. Студенты
- •Вариант 7. Строительная компания
- •Вариант 8. Автосалон
- •Вариант 9. Аэропорт
- •Вариант 10. Диагностический центр
- •Вариант 11. Реклама
- •Вариант 12. Быстрая пицца
- •Вариант 13. Клуб собаководов
- •Вариант 14. Грузоперевозки
- •Вариант 15. Аптека
- •Вариант 16. Автовокзал
- •Вариант 17. Общественная организация
- •Вариант 18. Учет потребления газа
- •Приложение 2 порядок выполнения лабораторных работ
- •Библиографический список
2.3. Лабораторная работа № 3: транзакции
Задание: Разработать две транзакции для схемы из своего варианта индивидуального задания. Реализовать программу в Delphi, демонстрирующую работу каждой транзакции.
Выполнение.
Используйте программу, разработанную в предыдущей лабораторной работе. Определите транзакции, описав их, как показано в приведенном ниже коде, где TransDesc1 — имя одной из транзакций. Выполнение кода можно связать, например, с нажатием кнопки в окне программы. По окончании выполнения транзакции сообщите, было ли оно успешным, с помощью процедуры ShowMessage или MessageDlg.
procedure Tform1.Button1Click(Sender: TObject);
// объявление переменной, содержащей описание транзакции
var
TransDesc1: TTransactionDesc;
Begin
TransDesc1.TransactionID:= 1;
TransDesc1.IsolationLevel:= xilREADCOMMITTED;
SQLConnection.StartTransaction(TransDesc1);
// блок обработки исключений try…except…end
try
// здесь помещаются все операции над данными, производимые в транзакции
SQLConnection.ExecuteDirect(‘UPDATE Accounts
SET AccountAmount = AccountAmount – 100
WHERE AccountNum = 100100232113 AND AccountAmount >=100 ’);
SQLConnection.ExecuteDirect(‘UPDATE Accounts
SET AccountAmount = AccountAmount + 100
WHERE AccountNum = 458710232198’);
SQLConnection.Commit(TransDesc1);
ShowMessage(‘Транзакция выполнена успешно!’);
except
SQLConnection.Rollback(TransDesc1);
ShowMessage(‘При выполнении транзакции произошла ошибка.’);
end;
End;
Блок обработки исключений try … except … end позволяет выполнить главное условие транзакции: она или выполняется полностью, или не выполняется совсем. Если при исполнении кода, помещенного до ключевого слова except, произойдет ошибка, все действия над данными, относящиеся к транзакции, будут отменены (Rollback). Если же ошибок не возникнет, метод Commit сохранит произведенные изменения. Убедиться в этом можно, намеренно допустив синтаксическую ошибку в одном из операторов SQL транзакции. В этом случае ошибочный SQL-запрос, как и другие (даже верные) запросы транзакции, не даст результатов.
2.4. Лабораторная работа № 4: отображение данных запроса
Задание: С помощью компонентов SQLConnection, SQLDataSet, DataSetProvider, ClientDataSet, DataSource и DBGrid реализовать простую программу, отображающую результаты выполнения SQL-запросов, описанных в индивидуальном задании. Все запросы должны быть параметризированными.
Выполнение.
Поместите на форму все указанные в задании компоненты. Произведите их настройку (см. лаб. работу № 2). Интерфейс приложения рекомендуется организовать аналогично примеру, приведенному в лаб. работе № 6 по технологии BDE (см. раздел 1).
Для того чтобы можно было выполнять SQL-запросы, установите свойству CommandType компонента SQLDataSet значение ctQuery, a в свойстве CommandText укажите любой SQL-запрос. Этот запрос выполнится первым при запуске вашей программы.
Перед выполнением очередного запроса закройте основной и клиентский наборы данных:
ClientDataSet1.Close;
SQLDataSet1.Close;
Затем присвойте свойству CommandText набора данных SQLDataSet1 строку SQL-запроса:
SQLDataSet1.CommandText:= 'select rec_name from records r
where exists(select * from albums al, artists a
where al.id_artist= a.id_artist and a.a_name=:ANAME
and al.id_album=r.id_album)’;
После этого установите значения параметров запроса следующим образом:
SQLDataSet1.ParamByName('ANAME').AsString:=Edit5.Text;
Внимание: для выполнения запросов, которые не возвращают результатов (например, UPDATE или INSERT), используйте метод
SQLDataSet1.ExecSQL(false);
Значение false, передаваемое методу, говорит о том, что запрос содержит параметры. Вызвав этот метод, присвойте свойству CommandText строку любого SQL-запроса, возвращающего результат (т.е. SELECT).
Теперь откройте наборы данных (рекомендуется выполнять эту операцию в блоке try … except … end для обработки возможных исключительных ситуаций в случае, если запрос содержит ошибки):
SQLDataSet1.Open;
ClientDataSet1.Open;
Код выполненного SQL-запроса, т.е. значение свойства CommandText, выведите в отведенное для этого поле.
