- •Технології проектування баз даних в delphi
- •6.051001 - Метрологія та інформаційно-вимірювальні технології
- •Технології проектування баз даних в delphi
- •6.051001 - Метрологія та інформаційно-вимірювальні технології
- •1Введение
- •2Введение в базы данных
- •2.1Типы субд
- •2.2Стандарт odbc
- •2.3Технологии взаимодействия delphi с бд
- •2.3.1Особенности технологии bde
- •2.3.2Особенности технологии ado
- •2.4Таблицы бд и связи между ними
- •2.5Первичные ключи и индексы
- •2.6Демонстрационная бд "поставщик книг"
- •3Использование odbc для подключения источника данных. Псевдонимы бд
- •3.1Внешний и внутренний псевдонимы бд
- •3.1.1Создание внешнего псевдонима
- •3.1.2Проверка работоспособности внешнего псевдонима в среде Delphi
- •3.2Внутренний псевдоним бд
- •3.2.1Назначение внутреннего псевдонима бд
- •3.2.2Создание внутреннего псевдонима
- •3.2.3Преимущества использования внутреннего псевдонима и проблемы перехода на другие субд
- •4Создание проекта с бд в технологии bde
- •4.1Особенности использования bde для соединения с источником данных
- •4.2Структура проекта с бд и визуальными компонентами
- •4.3Активизация проекта
- •4.4.4Компоненты tdbGrid
- •4.5Модуль данных
- •4.5.1Создание модуля данных tDataModule
- •4.5.2Связь модуля главного окна с модулем данных
- •4.5.3Создание компонента tDatabase
- •4.5.4Создание компонента tTable
- •4.5.5Создание компонента tDataSource
- •4.5.6Связь модуля главного окна с модулем данных
- •4.5.7Связь сетки tdbGrid и навигатора dbNavigator c источником данных tDataSource
- •4.5.8Связь главный-детальный между наборами данных
- •4.5.9Задание реляционной связи между наборами данных
- •4.5.10Активизация наборов данных
- •4.5.11Недостатки полученных решений и пути их устранения
- •4.6Объекты-столбцы сетки dbGrid
- •4.6.1Создание объектов-столбцов
- •4.6.2Редактирование объекта-столбца
- •4.7Объекты-поля наборов данных
- •4.7.1Назначение объектов-полей
- •4.7.2Создание объектов-полей
- •4.7.3Присоединение к наборам данных новых полей
- •4.7.4Присоединение полей из других таблиц. Подстановочные поля
- •4.7.5Вычисляемые поля
- •4.8Обработчики событий компонент работы с бд
- •4.8.1Обработчики событий OnGetText полей нд и компонента визуализации данных tdbGrid
- •4.8.2Установка системных переменных в обработчике событя OnCreate
- •4.9Бизнес-правила и обработчики событий компонент работы с бд
- •5Sql запросы к бд
- •5.1Компонент tQuery
- •5.2Создание компонента tQuery
- •5.3Использования компонента tQuery
- •5.3.1Свойство sql компонента tQuery
- •5.3.2Методы Open и ExecSql
- •5.3.3Схема программного формирования sql-запроса
- •5.3.4Параметрические запросы
- •5.3.5Параметрические запросы и свойство DataSource компонента tQuery
- •5.3.6Связь главный-детальный с компонентом tQuery в качестве детального набора данных
- •5.4Доступ к полям запроса
- •5.4.1Обращение к значению поля при помощи свойств объектов-полей Value и AsXxxx
- •5.4.2Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •5.4.3Обращение к значению поля при помощи функции набора данных FieldByName
- •5.5Программный доступ к данным запроса
- •5.5.1Общая схема программного доступа к данным запроса
- •5.5.2Последовательная навигация по записям
- •5.6Обзор событий компонента tQuery
- •6Хранимые процедуры и триггеры
- •6.1Хранимые процедуры
- •6.2Создание хранимых процедур
- •6.3Вызов хранимых процедур
- •6.4Триггеры
- •7Наборы данных
- •7.1Обзор событий класса tdbDataSet
- •7.1.1Реализация каскадных изменений и бизнес-правил
- •7.1.2Другие события
- •8Технология ado
- •8.1Основные особенности технологии ado
- •8.2Реализация технологии ado в Delphi
- •8.3Создание проекта с бд в технологии ado. Установка связи с бд
- •8.3.1Создание модуля данных
- •8.3.2Начало настройки связи
- •8.3.3Выбор провайдера
- •8.3.4Настройка провайдера
- •8.3.5Настройка провайдера Microsoft Jet 4.0 ole db Provider
- •8.3.6Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •8.3.7Завершение настройки связи
- •8.3.8Настройка оставшихся компонент модуля данных
- •8.4Особенности использования компонентов ado
- •8.4.1Базовые объекты ado
- •8.4.2Объект Recordset
- •8.4.3Объект Command
- •8.4.8Связной компонент tadoConnection
- •8.4.9Компонент tadoCommand
- •8.5Свойства, методы и события ado компонентов-наборов
- •8.5.1Общие свойства с bde-компонентами
- •8.5.2Специфические свойства
- •8.5.3Методы класса tCustomAdoDataSet
- •8.5.4События класса tCustomAdoDataSet
- •8.6Компонент tadoDataSet
- •8.7Компонент tadoTable
- •8.8Компонент tadoQuery
- •9Компоненты визуализации данных в Delphi
- •9.1Компонент tdbGrid
- •9.1.1Свойства
- •9.1.2Дополнительные возможности сетки
- •9.2Компоненты визуализации полей текущей записи
- •9.2.1Компонент tdbText
- •9.2.2Компонент tdbEdit
- •9.2.3Компонент tdbCheckBox
- •9.2.4Компонент tdbRadioGroup
- •9.2.5Списочные компоненты
- •9.2.6Компонент tdbMemo
- •9.2.7Компонент tdbRichEdit
- •9.2.8Компонент tdbCtrlGrid
- •9.2.9Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
5.6Обзор событий компонента tQuery
Все запросы – точнее их НД, получают в свое распоряжение большое количество событий, унаследованных ими от родительского класса TBDEDataSet. Это те же события, что и для НД на основе таблиц.
Рисунок 4.65 – Состав событий набора данных TQuery
К наиболее важным событиям относятся события, связанные с реализацией каскадных изменений и бизнес-правил, а также ряд других событий.
Для реализации каскадных изменений и бизнес-правил в локальных или файл-серверных БД обычно используются обработчики событий AfterXXXX и BefогеХХХХ.
Примечание. Для клиент-серверных БД каскадные изменения и бизнес-правила реализуются средсвами самой БД, а именно триггерами. Они программируются администраторами БД, а не разработчиками программных приложений. Однако их суть для всех типов БД одна и та же.
Каскадные изменения и бизнес-правила связаны с изменениями НД (вставка, удаление или редактирование записи) и отличаются тем, что события BefогеХХХХ наступают непосредственно перед изменением НД, а события AfterXXXX - сразу после изменения.
Обработчики этих событий в качестве параметра получают ссылку на запрос и его НД, вызвавший соответствующее событие. Если необходимо прервать работу обработчика и предотвратить изменение таблиц БД, нужно возбудить исключение или вызвать процедуру Abort.
Безусловным достоинством реализации каскадных изменений и бизнес-правил именно в обработчиках этих событий является концентрация их в одном месте - модуле данных, (если, разумеется, все компоненты-наборы сосредоточены в едином модуле данных), что облегчает программисту их отслеживание и внесение в них необходимых изменений.
К другим событиям можно отнести события:
OnCalcFields, которое возникает в момент, когда программа должна сформировать значения для вычисляемых полей;
OnNewRecord, которое возникает при вставке новой записи.
6Хранимые процедуры и триггеры
6.1Хранимые процедуры
Хранимая процедура (Stored Procedure) — объект БД, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на клиент-сервере.
Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с БД, как описания данных, так и манипулирования данными. Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления потоком.
Хранимые процедуры существуют независимо от таблиц или каких-либо других объектов БД. Они вызываются клиентской программой, другой хранимой процедурой или триггером. Разработчик может управлять правами доступа к хранимой процедуре, разрешая или запрещая ее выполнение.
В большинстве СУБД при первом запуске хранимой процедуры она компилируется и в дальнейшем её обработка осуществляется быстрее.
6.2Создание хранимых процедур
Очень толково 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 <Имя процедуры>
