- •Технології проектування баз даних в 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.4.3Обращение к значению поля при помощи функции набора данных FieldByName
Если для НД не создан ни один объект-поле, получить доступ к значению поля этого НД можно с помощью его метода FieldByName, хотя этот метод можно применять и при наличии объектов-полей. Функция имеет вид:
function FieldByName(const FieldName: string): TField
В качестве парметра функция FieldByName получает имя поля НД. Тип возвращаемого значения может быть преобразован с помощью свойства AsXXXX. Например
quBooks.FieldByName('Year').AsInteger := 2000;
5.5Программный доступ к данным запроса
Для просмотра, вставки, редактирования и удаления записей в Delphi обычно используются соответствующие визуальные компоненты (TDBGrid, TDBEdit, TDBNavigator и т.д.), которые автоматически вызывают нужные методы НД.
Однако во многих случаях, необходим программный доступ к информации без использования визуальных компонент доступа к данным.
Программный доступ тесно связан с понятием курсора НД. Под курсором НД понимается указатель текущей записи в конкретном НД - таблице или запросе.
Текущая запись - это та запись, над которой в данный момент времени можно выполнять какие-либо операции, например, чтение значений, содержащихся в полях записи.
С помощью методов First, Last, Next, Prior, MoveBy, FindFirst, FindLast, FindNext, FindPrior можно изменять положение курсора и, следовательно, выбирать нужную запись в таблице или запросе.
5.5.1Общая схема программного доступа к данным запроса
При программном доступе к данным, прежде всего, необходимо открыть соответствующий НД, для чего используется метод Open.
Во многих случаях (см. примеры ниже) после этого нужно убедиться в том, что НД содержит записи. Для этого вызывается метод IsEmpty, который возвращает false, если в НД есть хотя бы одна запись, например
if not quBooks.IsEmpty then …
Если НД не пустой, курсор НД устанавливается на 1-ой записи этого НД и она может быть обработана.
После обработки текущей записи переход к следующей записи реализуется методом FindNext или Next. В следующем разделе подробно рассматриваются другие средства навигации по НД.
По окончанию обработки НД должен быть закрыт.
5.5.2Последовательная навигация по записям
Для выполнения действий по последовательному перебору записей, начиная от стартовой записи и до конца НД, используют цикл while...do или repeat...until.
Пусть НД представлен запросом quBooks (аналогично таблицей tbBooks). Для программного доступа ко всем записям этого НД может использоваться следующий вариант набора операторов:
quBooks.Open;
…
while not quBooks.EOF do begin
//Какие-либо действия над очередной записью, например
//заполняется компонент lbBooks типа TListBox
lbBooks.Items.Add(DM.quBooksbName.AsString); //объект-поле
//quBooksbName
quBooks.Next; // Переход к следующей записи
end;
…
quBooks.Close //закрытие таблицы
Другой вариант набора операторов программного доступа ко всем записям НД quBooks:
quBooks.Open; // открытие таблицы
…
if not quBooks.IsEmpty then // проверка набора на непустоту
repeat
//Какие-либо действия над очередной записью
until not quBooks.FindNext; // Переход к следующей записи
…
quBooks.Close;
Если же от момента открытия НД с ним уже проводились некоторыые действия и программист хочет задать начало очередной обработки с 1-ой или последней записи, то это можно реализовать следующим образом.
Пусть стартовой будет 1-ая запись набора.
quBooks.First;
while not quBooks.EOF do begin
//Какие-либо действия над очередной записью
quBooks.Next;
end; {while}
или
if not quBooks.IsEmpty then // проверка набора на непустоту
begin
quBooks.First;
repeat
{Какие-либо действия над очередной записью}
until not quBooks.FindNext;
end; {with}
Точно так же можно перемещаться от конца НД к его началу. Пусть стартовой будет последняя запись набора.
quBooks.Last;
while not quBooks.BOF do begin
{Какие-либо действия над очередной записью}
quBooks.Prior;
end; {while}
или
if not quBooks.IsEmpty then // проверка набора на непустоту
begin
quBooks.Last;
repeat
{Какие-либо действия над очередной записью}
until not quBooks.FindPrior;
Если НД допускает вызов записи по ее номеру (его свойство IsSequenced в этом случае должно содержать значение True), можно использовать цикл for. Например, следующий обработчик события TForm.OnActivate поместит все значения строкового поля BName НД tbBooks в многострочное текстовое поле Memo1:
var
RecNo: integer;
begin
…
if quBooks.IsSequenced then
for RecNo := 1 to quBooks.RecordCount do begin
{Какие-либо действия над очередной записью)
end;
…
Свойство RecNo определяет порядковый номер обрабатываемой записи НД (нумерация начинается с 1), а его свойство RecordCount - количество записей.
Примечание. Во всех случаях следует помнить, что, если в ходе выполнения цикла последовательного перебора записей, изменится ключевое поле записи или в НД будет вставлена новая (удалена старая) запись, курсор НД может изменить свое положение и правильная работа цикла будет нарушена (см. ниже).
