- •Содержание
- •Лабораторная №1 Проектирование структуры базы данных. Нормализация таблиц.
- •Лабораторная №2 Создание серверной части приложения: алиас, файл базы данных, таблицы.
- •Лабораторная работа №3 Визуальное проектирование структуры базы данных.
- •Лабораторная работа № 4 Отображение данных на клиенте.
- •Лабораторная №5 Добавление/редактирование/удаление данных.
- •Лабораторная работа №6 Создание генераторов и триггеров. Каскадные воздействия.
- •Лабораторная №7 Создание и использование хранимых процедур в ibExpert.
- •Лабораторная №8 Сортировка данных. Поиск. Фильтрация.
- •Лабораторная №9 Работа с транзакциями. Кэширование изменений.
- •Лабораторная №10 Обеспечение достоверности данных, исключительные ситуации.
- •Лабораторная №11 Работа с отчетами.
- •Лабораторная №12 Установление привилегий доступа.
Лабораторная №10 Обеспечение достоверности данных, исключительные ситуации.
Цель работы: научится определять место и причину возникновения исключительной ситуации; создавать обработчик исключительной ситуации; организовывать мягкий выход из исключительной ситуации.
Исключения — механизм сообщения об ошибках, которые возникают в процессе исполнения хранимых процедур и триггеров.
Исключение создают командой Database->New Exception:
Примечание Длина сообщения не должна превышать 78 символов.
Для генерации исключения в процедуре или триггере используют команду: EXCEPTION ИмяИсключения, например:
В данном примере, при запуске процедуры с неположительным числом будет выведено исключение:
Когда исключение сгенерировано:
завершается процедура (триггер), в которой оно было возбуждено, и отменяются все действия, которые были ею выполнены непосредственно или косвенно;
возвращается сообщение об ошибке в вызывающее приложение;
его можно обработать командой when. Если оно обрабатывается, то его проведение отличается от выше описанного.
При использовании процедур на обновление данных одной записи таблицы требуется знать код этой записи (для задания условия поиска в update … set … = … where [условие]), который можно передавать как параметр этой процедуры, например:
create procedure UPDATE_RN (sel_id char(20), n_rn numeric(6,2))
as
begin
if (:n_rn <= 0) then
exception impossible_rn;
else
update rent
set rn = :n_rn
where TYP = :sel_id;
end
где sel_id – это код изменяемой записи, а n_rn – новое значение для записи.
В Delphi-приложении запустить процедуру и задать эти параметры можно следующим способом (используя компонент TIBStoredProc):
try
IBStoredProc1.StoredProcName := 'UPDATE_RN'; // имя процедуры
IBStoredProc1.ParamByName('SEL_ID').AsString :=
TRENT.Fields.Fields[0].AsString; // ключевое поле (индекс может быть другим)
IBStoredProc1.ParamByName('N_RN').AsInteger :=
StrToInt(Edit1.Text); // новое значение (например, вводится через TEdit)
IBStoredProc1.Prepare; // подготовка процедуры к запуску
IBStoredProc1.ExecProc; // запуск процедуры
finally
// здесь можно прописать код для неудачного запуска процедуры или возникновения исключения
end;
TRENT.Refresh;
Для перехвата исключительной ситуации код следует поместить в блок try..finally.
Лабораторная №11 Работа с отчетами.
Цель работы: научится форматировать отчеты.
Для создания простого отчета в формате txt можно использовать класс TStringList для формирования и сохранения отчета в файл. Для работы с этим классом сначала его нужно создать, а при завершении работы с ним - удалить из памяти, далее пример:
var
S : TStringList;
begin
S := TStringList.Create; // создание экземпляра класса
S.Free; // уничтожение экземпляра класса
end;
Для формирования отчета будем проходить по всем записям таблиц и выводить их в удобочитаемом формате в отчет (сначала в S : TStringList, затем из него в файл report.txt).
procedure TForm1.Button4Click(Sender: TObject);
var
s : TStringList;
begin
s := TStringList.Create;
// таблица OWNER
TOWNER.First;
while not TOWNER.Eof do
begin
s.Add(TOWNER.Fields.Fields[0].AsString + ' ' +
TOWNER.Fields.Fields[1].AsString + ' ' +
TOWNER.Fields.Fields[2].AsString);
// таблица LEASE
TLEASE.First;
while not TLEASE.Eof do
begin
s.Add (#9+TLEASE.Fields.Fields[0].AsString + ' ' +
TLEASE.Fields.Fields[1].AsString + ' ' +
TLEASE.Fields.Fields[2].AsString + ' ' +
TLEASE.Fields.Fields[4].AsString + ' ' +
TLEASE.Fields.Fields[5].AsString );
// таблица REALTY
TREALTY.First;
while not TREALTY.Eof do
begin
s.Add (#9#9+TREALTY.Fields.Fields[1].AsString);
// таблица RENT
TRENT.First;
while not TRENT.Eof do
begin
s.Add(#9#9#9+TRENT.Fields.Fields[1].AsString);
TRENT.Next;
end;
s.Add(#13#10);
TREALTY.Next;
end;
s.Add(#13#10);
TLEASE.Next;
end;
s.Add('----------------------------------------------------');
TOWNER.Next;
end;
// сохранение сформированного отчета в файл
s.SaveToFile('report.txt');
s.Free;
end;