- •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. Бд "поставщик книг"
- •Рекомендованная литература
Обращение к значению поля при помощи функции набора данных FieldByName
Если для НД не создан ни один объект-поле, получить доступ к значению поля этого НД можно с помощью его метода FieldByName, хотя этот метод можно применять и при наличии объектов-полей. Функция имеет вид:
function FieldByName(const FieldName: string): TField
В качестве парметра функция FieldByNameполучает имя поляНД. Тип возвращаемого значения может быть преобразован с помощью свойстваAsXXXX. Например
quBooks.FieldByName('Year').AsInteger := 2000;
Программный доступ к данным запроса
Для просмотра, вставки, редактирования и удаления записей в Delphi обычно используются соответствующие визуальные компоненты (TDBGrid, TDBEdit, TDBNavigator и т.д.), которые автоматически вызывают нужные методы НД.
Однако во многих случаях, необходим программный доступ к информации без использования визуальных компонент доступа к данным.
Программный доступ тесно связан с понятием курсора НД.Под курсором НД понимается указатель текущей записи в конкретномНД - таблице или запросе.
Текущая запись - это та запись, над которой в данный момент времени можно выполнять какие-либо операции, например, чтение значений, содержащихся в полях записи.
С помощью методов First,Last,Next,Prior,MoveBy,FindFirst,FindLast,FindNext,FindPriorможно изменять положение курсора и, следовательно, выбирать нужную запись в таблице или запросе.
Общая схема программного доступа к данным запроса
При программном доступе к данным, прежде всего, необходимо открыть соответствующий НД, для чего используется метод Open.
Во многих случаях (см. примеры ниже) после этого нужно убедиться в том, что НД содержит записи. Для этого вызывается метод IsEmpty, который возвращает false, если в НД есть хотя бы одна запись, например
if not quBooks.IsEmpty then …
Если НД не пустой, курсор НД устанавливается на 1-ой записи этого НД и она может быть обработана.
После обработки текущей записи переход к следующей записи реализуется методом FindNext или Next. В следующем разделе подробно рассматриваются другие средства навигации по НД.
По окончанию обработки НД должен быть закрыт.
Последовательная навигация по записям
Для выполнения действий по последовательному перебору записей, начиная от стартовой записи и до конца НД, используют цикл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 - количество записей.
Примечание. Во всех случаях следует помнить, что, если в ходе выполнения цикла последовательного перебора записей, изменится ключевое поле записи или в НД будет вставлена новая (удалена старая) запись, курсор НД может изменить свое положение и правильная работа цикла будет нарушена (см. ниже).