- •Bde та ado
- •Введение
- •Введение в базы данных
- •Типы субд
- •Стандарт odbc
- •Технологии взаимодействия delphi с бд
- •Особенности технологии bde
- •Особенности технологии ado
- •Таблицы бд и связи между ними
- •Первичные ключи и индексы
- •Демонстрационная бд "поставщик книг"
- •Использование odbc для подключения источника данных. Внешний псевдоним бд
- •Создание внешнего псевдонима бд
- •Создание проекта с бд в технологии bde
- •Особенности использованияbdeдля соединения с источником данных
- •Структура проекта с бд и визуальными компонентами
- •Активизация проекта
- •Главная форма проекта
- •Модуль данных
- •Создание модуля данныхTDataModule
- •Создание компонента tDatabase
- •Создание компонента tTable
- •Создание компонентаTDataSource
- •Связь модуля главного окна с модулем данных
- •Связь сеткиTdbGrid и навигатораDbNavigatorcисточником данныхTDataSource
- •Связь главный-детальный между наборами данных
- •Задание реляционной связи между наборами данных
- •Активизация наборов данных
- •Недостатки полученных решений и пути их устранения
- •Объекты-столбцы сетки dbGrid
- •Объекты-поля наборов данных
- •Создание объектов-полей
- •Присоединение к наборам данных новых полей
- •Присоединение полей из других таблиц. Подстановочные поля
- •Вычисляемые поля
- •Обработчики событий компонент работы с бд
- •Обработчики событий OnGetText полей нд и компонента визуализации данныхTdbGrid
- •Установка системных переменных в обработчике событяOnCreate
- •Бизнес-правила иобработчики событий компонент работы с бд
- •Implementation
- •Sql запросы к бд
- •КомпонентtQuery
- •СозданиекомпонентаtQuery
- •ИспользованиякомпонентаtQuery
- •Свойство sql
- •Методы Open и ExecSql
- •Параметрические запросы
- •Параметрические запросы и свойство DataSource компонента tQuery
- •Связь главный-детальный с компонентомTQuery в качестве детального набора данных
- •Доступ к полям запроса
- •Обращение к значению поля при помощи свойств объектов-полейValueиAsXxxx
- •Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •Обращение к значению поля при помощи функции набора данных FieldByName
- •Программный доступ к данным запроса
- •Общая схема программного доступа к данным запроса
- •Последовательная навигация по записям
- •Обзор событий компонентаtQuery
- •Хранимые процедуры и триггеры
- •Хранимые процедуры
- •Создание хранимых процедур
- •Вызов хранимых процедур
- •Триггеры
- •Наборы данных
- •Обзор событий класса tdbDataSet
- •Реализация каскадных изменений и бизнес-правил
- •Другие события
- •Технология ado
- •Основные особенности технологии ado
- •Реализация технологии ado в Delphi
- •Создание проекта с бд в технологии ado. Установка связи с бд
- •Создание модуля данных
- •Начало настройки связи
- •Выбор провайдера
- •Настройка провайдера
- •Настройка провайдераMicrosoftJet4.0oledbProvider
- •Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •Завершение настройки связи
- •Настройка оставшихся компонент модуля данных
- •Особенности использования компонентов ado
- •Базовые объекты ado
- •ОбъектRecordset
- •ОбъектCommand
- •ОбъектParameter
- •Компонент tadoCommand
- •Свойства, методы и события ado компонентов-наборов
- •Общие свойства с bde-компонентами
- •Специфические свойства
- •Методы класса tCustomAdoDataSet
- •События класса tCustomAdoDataSet
- •Компонент tadoDataSet
- •Компонент tadoTable
- •Компонент tadoQuery
- •Компоненты визуализации данных вDelphi
- •Компонент tdbGrid
- •Свойства
- •Дополнительные возможности сетки
- •Компоненты визуализации полей текущей записи
- •Компонент tdbText
- •Компонент tdbEdit
- •Компонент tdbCheckBox
- •Компонент tdbRadioGroup
- •Списочные компоненты
- •Компонент tdbMemo
- •Компонент tdbRichEdit
- •Компонент tdbCtrlGrid
- •Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
Вызов хранимых процедур
Если хранимая процедура выполняет действие, но не возвращает значений или возвращает 1-ну строку
Если хранимая процедура выполняет действие, но не возвращает значений или возвращает 1-ну строку, то можно использовать:
компонент TStoredProc;
компонент TQuery.
Рассмотрим, для примера, процедуру, которая выполняет оператор Insert.
Примечание. В действительности для вставки записи использовать хранимую процедуру не стоит, ведь процедуры предполагают определенную функциональную обработку. Но это хороший пример процедуры, которая не возвращает значений.
Пример вызова хранимой процедуры с помощью компонента TStoredProc:
DB.StartTransaction; //старт транзакции
with StoredProc1 do
try
StoredProcName := 'InsNakl';
//Подготовка параметров
Prepare;
ParamByName('pname').AsString := Edit1.Text;
ParamByName('pauthor').AsString := Edit2.Text;
…
ExecProc;
Close;
DB.Commit; //если все хорошо
except
DB.Rollback; //если ошибка
end;
Пример вызова хранимой процедуры с помощью компонента TQuery:
DB.StartTransaction; //старт транзакции
with Query1. do
begin
SQL.Clear;
//Вызов хранимой процедуры InsNakl с несколькими параметрами
SQL.Add('EXECUTE PROCEDURE InsNakl (:pname, :pauthor, …)');
//занесение параметров
ParamByName('pname').AsString := Edit1.Text;
ParamByName('pauthor').AsString := Edit2.Text;
…
try
ExecSql;
Close;
DB.Commit; //если все хорошо
except
DB.Rollback; //если ошибка
end;
Если хранимая процедура возвращаетнесколькострок
Если хранимая процедура возвращает несколько строк, то можно использовать только компонент TQuery. Например, для процедурыBooksполучим:
DB.StartTransaction; //старт транзакции
with Query1. do
begin
SQL.Clear;
//Вызов хранимой процедуры Books с 1-м входным параметром
SQL.Add('SELECT * FROM Books(:ppublish)');
//занесение параметров
ParamByName('ppublish').asString := Edit1.Text;
try
ExecSql;
Close;
DB.Commit; //если все хорошо
except
DB.Rollback; //если ошибка
end;
Примечание. Следует подчеркнуть, что в операторе SELECT список параметров задается символом "*".
К соответствующему полю результата запроса, содержащего хранимую процедуру, возвращающую значения, можно обратиться по его порядковому номеру, например,
Query1.Fields[0].AsString;
StoredProc1.Fields[0].AsString
или по имени, если вы его знаете, например
Query1.FieldByName('pname').asString;
StoredProc1.FieldByName('pname').asString;
Триггеры
Триггер (trigger) представляет собой процедуру особого типа, которая вызывается автоматически при модификации записей БД, т. е. при изменении значений столбцов или при их удалении и добавлении. Фактически триггеры являются разновидностью хранимых процедур, но пользователю они не доступны, а доступны только БД.
Запуск триггера обусловлен наступлением определенного события (действия) — по сути, добавления INSERT или удаления DELETE строки в заданной таблице, а так же при модификации UPDATE данных в определенном столбце заданной таблицы БД.
Момент запуска триггера определяется с помощью ключевых слов BEFORE, когда триггер запускается до выполнения связанного с ним события, например, до добавления записи, или AFTER, когда триггер запускается до выполнения связанного с ним события. В случае, если триггер вызывается до наступления события, он может внести изменения в модифицируемую событием запись, конечно, при условии, что событие — не удаление записи.
Триггеры обычно используются для поддержки ссылочной целостности, каскадного изменения или удаления данных, архивирования удаленных или измененных данных, отслеживания изменений или вызова пользовательских или системных хранимых процедур и программной реализации, так называемых бизнес-правил.
Триггер – поименованный объект БД, который ассоциирован с таблицей и активируется при наступлении определенного события, связанного с этой таблицей. Триггер запускается сервером БД автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.
Создание триггера подобно для многих СУБД. Покажем это на примереСУБД InterBase:
CREATE TRIGGER <Имя триггера> FOR <Имя таблицы>
[active | inactive]
{before | after}
{update | insert | delete}
[position <Число>]
AS <Тело триггера>
Описатели activeиinactiveопределяет активность триггера стразу после его создания. По умолчанию действуетactive.
Описатели beforeиafterзадают момент начала выполнения триггера.
Описатели update, insertиdeleteопределяют момент (событие) выполнения триггера.
При наличии нескольких триггеров для одного события определяют порядок вызова триггеров, который указывается в операнде position.
Триггер можно удалить оператором DROP TRIGGER <Имя триггера>
Изменяется триггер оператором ALTER TRIGGER <Имя триггера>
Программирование триггера ничем не отличается от программирования хранимых процедур. Например:
CREATE TRIGGER Table_example_bi FOR Nakls
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NPrice IS NULL) then
NPrice = 0.0;
end
Отметим, что для доступа к значениям столбца используются конструкции формата:
old.<Имя столбца> /*Обращение к старому значению*/
new.<Имя столбца> /*Обращение к новому значению*/