- •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. Бд "поставщик книг"
- •Рекомендованная литература
Методы класса tCustomAdoDataSet
Своеобразной особенностью ADO-наборов являются инкапсулированные в них методы SaveToFile и LoadFromFile. В ADO эти методы используются в качестве одного из возможных механизмов обмена данными между разными компьютерами, а также для отложенной обработки данных. Перед вызовами этих методов ADО-набор должен быть закрыт. После успешного вызова LoadFromFile набор автоматически открывается в том состоянии, в котором он был сохранен методом SaveToFile. ADO-наборы можно сортировать по закладкам (метод FilterOnBookmarks). Например:
procedure TForm1.Button1Click(Sender: TObject);
var
BM1, BM2: TBookmarkStr;
begin
with ADODataSet1 do begin
BM1 := Bookmark;
MoveBy(3);
BM2 := Bookmark;
FilterOnBookmarks([BMl, BM2]);
end;
end;
Для работы в многопользовательском режиме может оказаться полезным метод Clone, с помощью которого уже созданный НД дублируется в вызывающий. Например:
ADOTable1.Open; // Создан исходный НД
ADOTable2.Clone(ADOTablel, ltReADOnly); // Создан дубликат в НД
// ADOTable2
Для ADO-наборов определен метод Requery, с помощью которого программист может обновить НД. Его действие фактически эквивалентно последовательному использованию методов Close и Open. Особенностью является то обстоятельство, что влияющие на НД свойства, такие как CursorLocation, CursotType, LockTable и т. п., остаются неизменными, в то время как в промежутке между использованием методов Close и Open эти свойства можно изменить и тем самым повлиять на результирующий НД.
Весьма необычным является метод Seek, осуществляющий поиск записи по заданному значению (значениям) ключевого поля (полей). В принципе он реализует те же действия, что и метод Locate, но отличается от него несколькими важными особенностями. Во-первых, для Locate не имеет значения, индексировано ли Поле (поля), по которому (которым) ищутся записи. В то же время Seek ищет только по индексированным полям, которые к тому же должны быть указаны в свойстве IndexNames или IndexFields. Далее, для Locate курсор не перемещается, если поиск неудачен, для Seek — перемещается всегда в зависимости от указанного параметра SeekOption (если запись не найдена, курсор перемещается: в начало НД, в конец НД, непосредственно перед искомой записью или сразу за ней). И, наконец, Seek не может вести поиск с игнорированием возможной разницы в регистре букв или по частичному совпадению поисковых значений. К сожалению, многие провайдеры OLE DB не допускают установки значений свойства IndexNames или IndexFields и, таким образом, не поддерживают метод Seek.
С помощью метода Supports можно проверить различные характеристики набора, в частности, поддерживает ли он метод Seek:
ADOTable1.Open;
if Supports([coSeek]) then
ADOTable1.Seek(90001, soAfterEQ)
else if Supports ([coLocate]) then
ADOTable1.Locate('Number', 90001, [] );
События класса tCustomAdoDataSet
Некоторые события используют следующие типы данных, определяющие статус и смысл события:
type TEventStatus = (esOK, esErrorsOccured, esCantDeny, esCancel,
esUnwantedEvent);
Здесь:
esOK — нет ошибок;
esErrorsOccured — событие вызвало ошибки;
esCantDeny — ожидаемую связь нельзя разорвать;
esCancel — ожидаемую связь можно разорвать до ее активизации;
esUnwantedEvent — блокирует связанные события.
type TEventReason = (erAddNew, erDelete, erUpdate, erUndoUpdate,
erUndoAddNew, erUndoDelete, erRequery,
erResynch, erClose, erMove, erFirstChange,
erMoveFirst, erMoveNext, erMovePrevious,
erMoveLast);
Здесь:
erAddNew —добавлена запись;
erDelete — удалена запись;
erUpdate — запись изменена;
erUndoUpdate — произошел откат изменений записи;
erUndoAddNew — произошел откат вставки записи;
erUndoDelete — произошел откат удаления записи;
erRequery — к НД был применен метод Requere;
erResynch — к НД был применен метод Resync;
erClose — НД был закрыт;
erMove — курсор сместился к другой записи;
erFirstChange — произошло первое изменение НД;
erMoveFirst — курсор сместился к первой записи;
erMoveNext — курсор сместился к следующей записи;
erMovePrevious — курсор сместился к предыдущей записи;
erMoveLast — курсор сместился к последней записи.
Особенностью события OnEndOfRecordset является то, что оно предшествует событиям BeforeScroll и AfterScroll. В обработчике события нельзя проверять конец НД с помощью функции EOF, так как сам НД может быть частично не наполнен, если наполнение его записями идет в асинхронном режиме.
Обработчик события OnFetchProgressEvent обычно используется при длительном обращении к БД в асинхронном режиме для индикации процесса. Например:
proedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: integer;
var EventStatus: TEventStatus);
begin
Caption := 'Процент выполнения: ' +
IntToStr(Trunc(Progress / MaxProgress * 100)) + '%' ;
Application.ProcessMessages;
end;