- •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. Бд "поставщик книг"
- •Рекомендованная литература
Обзор событий компонентаtQuery
Все запросы – точнее их НД, получают в свое распоряжение большое количество событий, унаследованных ими от родительского класса TBDEDataSet. Это те же события, что и для НД на основе таблиц.
Рисунок 4.55 –Состав событий набора данных TQuery
К наиболее важным событиям относятся события, связанные с реализацией каскадных изменений и бизнес-правил, а также ряд других событий.
Для реализации каскадных изменений и бизнес-правил в локальных или файл-серверных БД обычно используются обработчики событий AfterXXXX и BefогеХХХХ.
Примечание. Для клиент-серверных БД каскадные изменения и бизнес-правила реализуются средсвами самой БД, а именно триггерами. Они программируются администраторами БД, а не разработчиками программных приложений. Однако их суть для всех типов БД одна и та же.
Каскадные изменения и бизнес-правила связаны с изменениями НД (вставка, удаление или редактирование записи) и отличаются тем, что события BefогеХХХХ наступают непосредственно перед изменением НД, а события AfterXXXX - сразу после изменения.
Обработчики этих событий в качестве параметра получают ссылку на запрос и его НД, вызвавший соответствующее событие. Если необходимо прервать работу обработчика и предотвратить изменение таблиц БД, нужно возбудить исключение или вызвать процедуру Abort.
Безусловным достоинством реализации каскадных изменений и бизнес-правил именно в обработчиках этих событий является концентрация их в одном месте - модуле данных, (если, разумеется, все компоненты-наборы сосредоточены в едином модуле данных), что облегчает программисту их отслеживание и внесение в них необходимых изменений.
К другим событиям можно отнести события:
OnCalcFields, которое возникает в момент, когда программа должна сформировать значения для вычисляемых полей;
OnNewRecord, которое возникает при вставке новой записи.
Хранимые процедуры и триггеры
Хранимые процедуры
Хранимая процедура (Stored Procedure) — объект БД, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на клиент-сервере.
Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с БД, как описания данных, так и манипулирования данными. Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления потоком.
Хранимые процедуры существуют независимо от таблиц или каких-либо других объектов БД. Они вызываются клиентской программой, другой хранимой процедурой или триггером. Разработчик может управлять правами доступа к хранимой процедуре, разрешая или запрещая ее выполнение.
В большинстве СУБД при первом запуске хранимой процедуры она компилируется и в дальнейшем её обработка осуществляется быстрее.
Создание хранимых процедур
Очень толково http://www.ibase.ru/devinfo/sp_call.htm
Для иллюстрации реальных возможностей использования хранимых процедур используем СУБД InterBase. Синтаксис описания хранимых процедур подобен и для большинстваСУБД и имеет вид:
CREATE PROCEDURE
<Имя процедуры> [(<Список входных параметров>)]
[RETURNS (<Список выходных параметров>)]
AS <Тело процедуры>
Список параметров выглядит так:
<Имя параметра> <Тип параметра> [,<Имя параметра> <Тип параметра>]
При использовании параметра в выражениях тела процедуры перед его именем нужно указывать знак ":".
Тело процедуры состоит из двух частей – объявления переменных и исполнительной.
Объявление переменных:
declare variable <Имя переменной> <Тип переменной>;
Тип переменной совпадает с типом столбцов БД.
Исполнительная часть:
begin
<Оператор1>
…
<Операторn>
end
Операторы исполнительной части подобны операторам других языков программирования.
Пример. Процедура имеет ряд входных параметров и не возвращает параметров:
CREATE PROCEDURE InsNakl (pname varchar(20), pauthor varchar(20), …)
as
begin
INSERT BName, BAuthor, … INTO Nakls VALUES (:pname, :pauthor, …)
end
Специальный интерес представляет оператор SELECT. Различают2-а вида оператораSELECT.
Оператор выбора одной строкиSELECT,который возвращает одну строку. Значение столбцов возвращаемой строки присваиваются указанным переменным или параметрам.
Пример. Процедура возвращает одну строку из двух параметров:
CREATE PROCEDURE Payed
returns (psum float, pavg float) /*Выходные параметры*/
as
begin
SELECT sum(NSum), avg(NSum)
FROM Nakls
INTO :psum, :pavg; /*Запись в параметры*/
end
Оператор выбора нескольких строкFOR SELECT … DO, способный возвращать несколько строк:
for <Оператор выбора строки> do <Оператор>;
Пример. Обработка возвращаемых строк выполняется внутри процедуры. Но из процедуры строки не возвращаются:
CREATE PROCEDURE CountNakl
returns (psum integer)
as
declare variable n integer;
declare variable x integer;
begin
x = 0;
for SELECT NaklID FROM Nakls INTO :n do
x = x + 1;
:psum = x;
end
end
Для того, что бы процедура вернула строки, полученные с помощью оператора for select doпосле словаdoуказывается операторsuspend возврата значений, который передает в вызывающее приложение или хранимую процедуру значения выходных параметров.
Пример: Процедура возвращает строки.
CREATE PROCEDURE books (ppublish varchar(20))
returns (pname varchar(20), pauthor varchar(20))
as
begin
for SELECT BName, BAuthor
FROM Books
WHERE BPablish= : ppublish
INTO :pname; :pauthor
do suspend;
end
Ключевым в работе процедуры является указание suspend. В тот момент, когда выполнение процедуры доходит доsuspend, сервер останавливает выполнение процедуры, и ожидает, пока клиент не запопросит получение данных из процедуры. После получения данных (одной строки) сервер прокрутит следующий циклfor select doдо очередногоsuspend, и так далее, пока клиент не перестанет запрашивать строки, или пока строки в запросе не кончатся.
Из процедуры можно вызвать так же другую процедуру при помощи оператора execute procedure:
execute procedure <Имя процедуры> [(<Список входных параметров>)]
[returning_values (<Список выходных параметров>)]
Пример:
CREATE PROCEDURE ptest
returns (opresult float)
as
begin
execute procedure pdivide (100, 20) returning_values (opresult);
end
Хранимую процедуруможно удалить оператором
DROP PROCEDURE <Имя процедуры>
Изменяется хранимая процедураоператором
ALTER PROCEDURE <Имя процедуры>