- •Технології проектування баз даних в 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. Бд "поставщик книг"
- •Рекомендованная литература
6.3Вызов хранимых процедур
Если хранимая процедура выполняет действие, но не возвращает значений или возвращает 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;
6.4Триггеры
Триггер (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.<Имя столбца> /*Обращение к новому значению*/
