- •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. Бд "поставщик книг"
- •Рекомендованная литература
Специфические свойства
ADO-наборы имеют непосредственного родителя TCustomADODataSet, от которого они унаследовали многие специфические свойства. Здесь дается общий обзор особенностей ADO-наборов, а также описываются наиболее важные свойства, методы и события класса TCustomADODataSet.
Прежде всего, это свойства Connection и ConnectionString, с помощью которых ADO-набор может самостоятельно связаться с источником данных.
С помощью свойства BlockReadSize программист может создать такой режим работы, когда навигация по данным не приводит к изменениям в связанных с набором визуализирующих компонентах. Для этого в свойстве BlockReadSize следует поместить любое ненулевое значение. В этом случае свойство State автоматически примет значение dsBlockRead и навигация по НД будет проходить значительно быстрее. Чтобы отменить этот режим, достаточно поместить в свойство BlockReadSize значение 0.
В отличие от BDE наборы ADO могут создавать курсоры двух типов — на стороне клиента и на стороне сервера (свойство CursorConnection). В сочетании со свойством CursorType это дает программисту гибкий инструмент влияния на скоростные качества передачи данных и разграничение доступа к данным. С помощью свойства EnabledBCD программист может заменить вещественные данные форматом двоично-десятичных данных (BCD). Этот формат позволяет избежать ошибок округления вещественных чисел.
Новым по сравнению с BDE-компонентами является также свойство LockType, позволяющее повысить скорость работы в многопользовательской среде за счет учета специфики БД.
С помощью свойства MarshalOptions можно несколько снизить нагрузку на сеть при создании курсора на клиентской машине.
Важным отличием является то, что ADO-компоненты имеют свойство Recordset, содержащее ссылку на одноименный базовый объект. Если программист хорошо знаком с технологией ADO, он может напрямую обратиться к этому свойству для более гибкого доступа к данным.
ADO-компоненты способны работать с кэшированными данными, но делают это по-своему. Во-первых, в терминологии ADO вместо термина кэширование данных используется понятие пакетная обработка данных, после завершения которой все сделанные в пакете изменения либо подтверждаются, либо отвергаются. Для работы в пакетном режиме ADO-набор должен:
в свойстве CursorType содержать значение ctKeySet, заданное по умолчанию, или значение ctStatic;
в свойстве LockType содержать значение ltBatchOptimistic. Кроме того, сами данные должны быть получены с помощью SQL-запроса SELECT. Вот как, например, готовится компонент ADODataSet к работе в пакетном режиме:
with ADODataSet1 do begin
CursorLocation := clUseServer;
CursorType := ctKeyset;
LockType. := ltBatchOptimistic;
CommandType : = cmdText;
CommandText := 'SELECT * FROM BOOKS';
Open;
end;
Следует заметить, что поскольку компонент TADOTable не имеет свойств CommandType и CommandText, его перевод в режим пакетной обработки данных имеет свою специфику:
ADOTable1.LockType := ltBatchOptimistik;
ADOTable1.Open;
В пакетном режиме можно по этой же схеме выполнять кэшированные изменения в хранимых процедурах, которые возвращают набор записей:
ADOStoredProc1.ProcedureName : = 'MyBatchQuery';
ADOStoredProc1.LockType := ltBatchOptimistic;
ADOStoredProc1.Open;
После получения пакетного набора записей с помощью свойства RecordStatus можно проверить статус конкретной записи, а с помощью свойства FilterGroup -отфильтровать записи. Подтвердить изменения можно с помощью метода UpdateBatch; прекратить режим пакетной обработки и отказаться от сделанных изменений - с помощью метода CancelBatch. При этом с помощью передаваемых этим методам параметров можно отменить или подтвердить изменения для всех или только для отфильтрованных записей.
Есть определенная специфика в механизме сортировки записей ADO-набора. Для сортировки в свойство Sort помещают список полей сортировки, разделенных запятыми. Каждое поле может дополнительно снабжаться признаками ASCENDING (ASC) или DESCENDING (DESC) для указания соответственно восходящего или нисходящего порядка сортировки (если ни одно из этих слов не указано, реализуется восходящая сортировка), например:
ADOQuery1.Sort := 'LastName ASC, DateDue DESC';
Если в свойство Sort помещена пустая строка, записи не сортируются и предъявляются в том виде, в котором они получены из БД. Если для НД создан клиентский курсор и нет соответствующих индексов для сортировки, на клиентской машине создается временный индекс, который уничтожается при изменении свойства Sort.