|
Вернуться к содержанию
Глава 25
Приложения ADO
В Delphi 5 разработчик приложении БД имеет
возможность выбирать не только способы реализации бизнес-логики и интерфейса
программы, не только архитектуру взаимодействия с БД (локальная, клиент-сервер,
многоуровневая), но и механизм доступа к данным.
Наряду с традиционными инструментами Borland Database
Engine и ODBC в приложениях Delphi 5 можно применять специальный набор компонентов
InterBase Express для работы с данными на сервере InterBase, а также технологию
Microsoft ActiveX Data Objects (ADO), которая основана на возможностях СОМ,
а именно интерфейсов OLE DB.
Приложения БД, обращающиеся к данным через ADO,
независимы от процессора БД Borland Database Engine.
Технология ADO завоевала широкую популярность
у разработчиков благодаря универсальности — базовый набор интерфейсов OLE DB
имеется в каждой операционной системе Microsoft. Поэтому для обеспечения доступа
приложения к данным достаточно лишь правильно указать провайдер соединения ADO
и затем переносить программу на любой компьютер, где имеется требуемая база
данных, и, конечно, установленная ADO.
В Палитре компонентов Delphi 5 имеется страница
ADO, содержащая набор компонентов, позволяющих создавать полноценные приложения
БД, обращающиеся к данным через ADO.
В этой главе рассматриваются следующие вопросы.
- Краткий обзор технологии ADO, доступных провайдеров
ADO, а также работающих в ней объектов и интерфейсов.
- Как создать соединение с базой данных через
ADO в приложении Delphi.
- Применение объекта набора записей ADO в приложении.
- Как использовать таблицы, запросы SQL и хранимые
процедуры.
- Что такое команды и объекты команды ADO.
Основы ADO
Технология Microsoft ActiveX Data Objects обеспечивает
универсальный доступ к источникам данных из приложений БД. Такую возможность
предоставляют функции набора интерфейсов, созданного на основе общей модели
объектов СОМ и описанного в спецификации OLE DB.
Технология ADO и интерфейсы OLE DB обеспечивают
для приложений единый способ доступа к источникам данных различных типов. Например,
приложение, использующее ADO, может применять одинаково сложные операции и к
данным, хранящимся на корпоративном сервере SQL, и к электронным таблицам и
локальным СУБД. Запрос SQL, направленный любому источнику данных через ADO,
будет выполнен. Возникает вопрос: каким образом источники данных смогут выполнить
этот запрос?
За серверы БД беспокоиться не стоит: обработка
запросов SQL — это их основная обязанность. Но как быть с файловыми последовательностями,
электронными таблицами, файлами электронной почты и т. д.? Здесь на помощь приходят
механизмы ADO и интерфейсы OLE DB.
OLE DB представляет собой набор специализированных
объектов СОМ, инкапсулирующих стандартные функции обработки данных и специализированные
функции конкретных источников данных, и интерфейсов, обеспечивающих передачу
данных между объектами. Минимальный набор компонентов может включать объект
соединения, объект набора данных и объект процессора запросов.
Объекты OLE DB создаются и функционируют так
же, как и другие объекты СОМ. Каждому объекту соответствует идентификатор класса
clsid, хранящийся в системном реестре. Для создания объекта используется CoCreatelnstance
и соответствующая фабрика класса. Объекту соответствует набор интерфейсов, к
методам которых можно обращаться после создания объекта. Подробнее о работе
с объектами СОМ см. часть V "Приложения СОМ".
В результате приложение обращается не непосредственно
к источнику данных, а к объекту OLE DB, который "умеет" представить данные (например,
из файла электронной почты) в виде таблицы БД или результата выполнения запроса
SQL.
Технология ADO в целом включает в себя не только
сами объекты OLE DB, но и механизмы, обеспечивающие взаимодействие объектов
с данными и приложениями. На этом уровне важнейшую роль играют провайдеры ADO,
координирующие работу приложений с источниками данных различных типов.
Такая архитектура позволяет сделать набор объектов
и интерфейсов открытым и расширяемым. Набор объектов и соответствующий провайдер
может быть создан для любого хранилища данных без внесения изменений в исходную
структуру ADO. При этом существенно расширяется само понятие данных — ведь можно
разработать набор объектов и интерфейсов и для нетрадиционных табличных данных.
Например, это могут быть графические данные
геоинформационных систем, древовидные структуры из системных реестров, данные
CASE-инструментов и т. д.
Так как технология ADO основана на стандартных
интерфейсах СОМ, которые являются системным механизмом Windows, это сокращает
общий объем работающего программного кода и позволяет распространять приложения
БД без вспомогательных программ и библиотек (процессор БД BDE).
Нижеследующее описание спецификации OLE DB
представлено в соответствии с официальной терминологией Microsoft для данной
предметной области.
Спецификация OLE DB различает следующие типы объектов,
которые будут рассмотрены ниже.
- Перечислитель (Enumerator) выполняет
поиск источников данных. Используется для обеспечения функционирования провайдеров
ADO.
- Объект-источник данных
(Data Source Object) обеспечивает соединение с хранилищем данных.
- Сессия (Session) объединяет совокупность
объектов, обращающихся к одному хранилищу данных.
- Транзакция (Transaction) инкапсулирует
механизм выполнения транзакции.
- Команда (Command) содержит текст команды
и обеспечивает ее выполнение. Командой может быть запрос SQL, обращение к
таблице БД и т. д.
- Набор рядов (Rowset) представляет собой
совокупность строк данных, являющихся результатом выполнения команды ADO.
- Объект-ошибка (Error) содержит информацию
об исключительной ситуации.
Рассмотрим функциональные возможности основных
объектов и интерфейсов OLE DB.
Перечислители
Объекты-перечислители обеспечивают поиск любых
объектов ADO, которые обеспечивают доступ к источникам данных. При этом другие
перечислители также видны в данном перечислителе.
Первичный поиск источников данных осуществляется
в провайдере ADO. Перечислители могут отбирать только источники данных конкретных
типов, поэтому провайдер обеспечивает доступ к конкретному типу хранилища данных.
В составе ADO имеется системный корневой перечислитель,
который выполняет начальный поиск других перечислителей и источников данных.
Его можно использовать, зная его идентификатор класса clsid_oledb_enumerator.
Функции перечислителя содержатся в интерфейсе
isourcesRowset. Метод GetSourcesRowset возвращает ссылку на объект набора рядов
(см. выше), содержащий сведения о найденных источниках данных или перечислителях.
Признаком того, что в текущем ряде содержится
информация о перечислителе, является значение variant_true в столбце sources_isparent.
Объекты соединения с источниками данных
Внутренний механизм ADO, обеспечивающий соединение
с хранилищем данных, использует два типа объектов. Это объекты-источники данных
и объекты-сессии.
Объект-источник данных обеспечивает представление
информации о требуемом реальном источнике данных и подключение к нему.
Для ввода сведений о хранилище данных используется
интерфейс IDBProperties. Для успешного подключения необходимо задать обязательные
сведения. Вероятно, для любого хранилища данных будет актуальной информация
об его имени, пользователе и пароле. Однако каждый тип хранилища имеет собственные
уникальные настройки. Для получения списка всех обязательных параметров соединения
с данным хранилищем можно воспользоваться методом IDBProperties. Getpropertyinf
о, который возвращает заполненную структуру dbpropinfo. Для каждого обязательного
параметра в элементе dwFiags устанавливается значение dbpropflags_required.
Для инициализации соединения необходимо использовать
метод initialize интерфейса iDBinitialize объекта-источника данных.
Из объекта-источника данных можно создавать объекты-сессии.
Для этого используется метод IDBCreateSession.createSession. Сессия предназначена
для обеспечения работы транзакций и наборов рядов.
Транзакции
Управление транзакциями в OLE DB реализовано на
двух уровнях.
Во-первых, всеми необходимыми методами обладает
объект сессии. Он имеет интерфейсы ITransaction, ITransactionJoin, ITransactionLocal,
ITransactionObject.
Внутри сессии транзакция управляется интерфейсами
ITransactionLocal,
ITransaction и их методами StartTransaction,
Commit,Rollback.
Во-вторых, с помощью объекта сессии можно создать
объект транзакции при помощи метода GetTransactionObject интерфейса ITransactionObject,
который возвращает ссылку на интерфейс объекта-транзакции.
Наборы рядов
Объект-набор рядов является основным объектом
ADO, обеспечивающим работу с данными. Он инкапсулирует совокупность рядов из
источника данных и механизмы навигации по рядам и поддержания рядов в актуальном
состоянии.
Объект сессии имеет обязательный интерфейс IOpenRowset
с методом openRowset, который открывает необходимый набор рядов.
В зависимости от возможностей источника данных,
набор рядов может поддерживать различные интерфейсы. Но пять из них являются
обязательными:
- iRowset обеспечивает навигацию по рядам;
- IAccessor обеспечивает представление информации
о формате рядов, содержащихся в буфере набора рядов;
- iRowsetinfo позволяет получить информацию о
наборах рядов (например, число рядов или число обновленных рядов);
- IColumnsinfo позволяет получить информацию
о колонках рядов (наименование, тип данных, возможность обновления и т. д.);
- IConvertType содержит единственный метод
CanConvert, позволяющий определить возможность преобразования типов данных
в наборе рядов.
В отличие от привычной практики разработки
интерфейсов в рамках модели СОМ, интерфейсы OLE DB часто имеют всего один-два
метода. В результате большая группа интерфейсов реализует несколько вполне стандартных
функций.
Дополнительные возможности по управлению набором
рядов предоставляют следующие интерфейсы:
- iRowsetChange выполняет изменения в наборе
рядов (вносит изменения, добавляет новые ряды, удаляет ряды и т. д.);
- iRowsetidentity позволяет сравнивать ряды разных
рядов;
- iRowsetindex обеспечивает использование индексов;
- iRowsetLocate выполняет поиск в наборе
рядов;
- iRowsetUpdate реализует механизм кэширования
изменений.
Команды
Программные средства ADO были бы неполными, если
бы не имели возможности использовать для работы с данными язык SQL. Операторы
DML и DDL, ряд специальных операторов ADO носят общее название текстовых команд.
Объект-команда инкапсулирует саму текстовую команду
и механизм обработки и передачи команды. Объект команды выполняет:
- Разбор текста команды.
- Связывание команды с источником данных.
- Оптимизация команды.
- Передача команды источнику данных.
Главный интерфейс объекта команды icommand имеет
три метода:
- Cancel — отменяет выполнение команды;
- Execute — исполняет команду;
- GetDBSession — возвращает ссылку на интерфейс
сессии, вызвавший данную команду.
Помимо основного, объект команды обеспечивает
доступ к дополнительным интерфейсам:
- ICommandPrepare содержит два метода
(Prepare И Unprepare) для подготовки команды;
- Icommandproperties задает для команды свойства,
которые должны поддерживаться возвращаемым командой набором данных;
- IcommandText управляет текстом команды (этот
интерфейс обязателен для объекта команды);
- Icommandwithparameters обеспечивает работу
с параметрами команды.
Провайдеры ADO
Провайдеры ADO обеспечивают соединение приложения,
использующего данные через ADO, с источником данных (сервером SQL, локальной
СУБД, файловой системой и т. д.). Для каждого типа хранилища данных должен существовать
провайдер ADO.
Провайдер "знает" о местоположении хранилища данных
и его содержании, умеет обращаться к данным с запросами и интерпретировать возвращаемую
служебную информацию и результаты запросов с целью их передачи приложению.
Список установленных в данной операционной системе
провайдеров доступен для выбора при установке соединения через компонент TADOConnection.
При инсталляции ActiveX Data Objects 2.1 в операционной
системе устанавливаются следующие стандартные провайдеры.
Microsoft Jet OLE DB Provider обеспечивает
соединение с данными СУБД Access при посредстве технологии DAO.
Microsoft OLE DB Provider for ODBC drivers
обеспечивает доступ к данным, которые уже "прописаны" при помощи драйверов ODBC.
Однако реальное использование столь экзотичных вариантов соединений представляется
проблематичным. Драйверы ODBC и так славятся своей медлительностью, поэтому
дополнительный слой сервисов здесь ни к чему.
Microsoft OLE DB Provider for Oracle
обеспечивает соединение с сервером Oracle.
Microsoft OLE DB Provider for SQL Server
обеспечивает соединение с сервером MS SQL Server.
Реализация ADO в Delphi
Механизм доступа к данным через ADO и многочисленные
объекты и интерфейсы реализованы в VCL Delphi в виде набора компонентов, расположенных
на странице ADO.
Компонент TADOConnection вобрал возможности перечислителя,
источника данных и сессии с возможностями обслуживания транзакций.
Текстовые команды ADO реализованы в компоненте
TADocommand.
Наборы рядов (нотация Microsoft) можно получить
при помощи компонентов TADOTable, TADOQuery, TADOStoredproc. Каждый из них реализует
способ доступа к конкретному типу представления данных в хранилище. Далее по
тексту применительно к компонентам Delphi совокупность возвращаемых из хранилища
данных строк будем называть набором записей, что соответствует документации
Inprise (см. Ошибка! Закладка не определена, или Ошибка! Закладка
не определена.) и стилю изложения предыдущих глав.
Набор свойств и методов компонентов ADO обеспечивает
реализацию всех необходимых приложению БД функций. Способы использования компонентов
ADO немногим отличаются от стандартных компонентов VCL доступа к данным.
Однако при необходимости разработчик может использовать
все возможности интерфейсов ADO, обращаясь к ним через совокупность объектов
ADO. Ссылки на объекты имеются в компонентах (см. ниже).
Механизм соединения с хранилищем данных
ADO
Компоненты доступа к данным ADO могут использовать
два варианта подключения к хранилищу данных. Это стандартный метод ADO и стандартный
метод Delphi.
В первом случае компоненты используют свойство
connectionString для прямого обращения к хранилищу данных. Во втором случае
используется специальный компонент TADOconnection, который обеспечивает расширенное
управление соединением и позволяет обращаться к данным нескольким компонентам
одновременно.
Свойство Connectionstring предназначено для хранения
информации о соединении с объектом ADO. В нем через точку с запятой перечисляются
все необходимые параметры. Как минимум это должны быть имена провайдера соединения
или удаленного сервера:
Connectionstring:='Remote Server=ServerName;Provider=ProviderName'
;
При необходимости указываются путь к удаленному
провайдеру:
Connectionstring:='Remote Provider=ProviderName'
;
и параметры, необходимые провайдеру:
'User Name=UserName;Password=Password'
Каждый компонент, обращающийся к хранилищу данных
ADO самостоятельно, задавая параметры соединения в свойстве Connectionstring,
открывает собственное соединение. Чем больше приложение содержит компонентов
ADO, тем больше соединений может быть открыто
одновременно.
Поэтому целесообразно реализовать механизм соединения
ADO через специальный компонент — TADOconnection. Этот компонент открывает соединение,
также заданное свойством Connectionstring (см. выше) и предоставляет разработчику
дополнительные средства управления соединением.
Компонент TADOConnection
Компонент TADOconnection предназначен для управления
соединением с объектами хранилища данных ADO. Он обеспечивает доступ к хранилищу
данных компонентам ADO, инкапсулирующим набор данных (см. ниже).
Применение этого компонента дает разработчику
ряд преимуществ.
- Все компоненты доступа к данным ADO обращаются
к хранилищу данных через одно соединение
- Возможность напрямую задать объект провайдера
соединения
- Доступ к объекту соединения ADO
- Возможность выполнять команды ADO
- Выполнение транзакций
- Расширенное управление соединением при помощи
методов-обработчиков событий
Соединение с хранилищем данных ADO устанавливается
при помощи свойства Connectionstring (см. выше) И свойства Connection или методов
Open И close по аналогии со стандартным компонентом TDatabase. При необходимости
провайдер соединения ADO определяется напрямую свойством provider. Если соединение
по какой-либо причине не удается установить, в свойстве DefaultDatabase задается
имя еще одного объекта соединения ADO.
При открытии соединения необходимо вводить имя
пользователя и его пароль. Появление стандартного диалогового окна для этого
управляется свойством Loginprompt (рис. 25.1). Без этого диалога для ввода параметров
можно использовать свойство connectionstring (см. выше) или метод-обработчик
onLogin.

Рис. 25.1.
форма настройки соединения ADO
Для выбора провайдера ADO и хранилища данных можно
воспользоваться формой, которая вызывается двойным щелчком на компоненте, перенесенном
на форму, или щелкнув на кнопке в поле редактирования свойства connectionstring
в Инспекторе объектов.
Здесь можно настроить соединение через свойство
Connectionstring (переключатель Use Connection String) или
загрузить параметры соединения из файла с расширением udl (переключатель
Use Data Link File).
Файл udl (листинг 25.1) представляет собой обычный
текстовый файл, в котором указывается название параметра и через знак равенства
его значение. Параметры разделяются точкой с запятой.
[oledb] ; Everything after this line is an OLE
DB initstring
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program
Files VCoinmon Files\Borland Shared\Data\DBDEMOS.mdb
При нажатии кнопки Build
появляется диалоговое окно, в котором можно настроить параметры соединения вручную.
Первая страница позволяет выбрать провайдер для
конкретного типа источника данных из числа провайдеров, установленных в системе
(рис. 25.2).

Рис. 25.2.
Диалоговое окно настройки параметров соединения на странице выбора провайдера

Рис. 25.3.
Диалоговое окно настройки параметров соединения на странице выбора источника
данных
Состав элементов управления следующих страниц
зависит от типа источника данных. Рассмотрим процесс настройки на примере демонстрационной
БД MS Access.
Страница Connection
позволяет задать полный путь к файлу базы данных (расширение MDB) и имя и пароль
пользователя (рис. 25.3).

Рис. 25.4.
Диалоговое окно настройки параметров соединения на странице дополнительных параметров
Страница Advanced
задает дополнительные параметры соединения. В зависимости от типа хранилища
данных, некоторые элементы этой страницы могут быть недоступны (рис. 25.4).
Список Impersonation level
определяет возможности клиентов при подключении в соответствии с полномочиями
их ролей. В списке могут'быть выбраны следующие значения:
- Anonymous — роль клиента недоступна
серверу;
- Identify — роль клиента опознается сервером,
но доступ к системным объектам заблокирован;
- Impersonate — процесс сервера может
быть представлен защищенным контекстом клиента;
- Delegate — процесс сервера может быть
представлен защищенным контекстом клиента, при этом сервер может осуществлять
другие подключения.
Список Protection level
позволяет задать уровень защиты данных. В списке могут быть выбраны следующие
значения:
- None — подтверждение не требуется;
- Connect — подтверждение необходимо только
при подключении;
- Call - подтверждение источника данных
при каждом запросе;
- Pkt — подтверждение получения от клиента
всех данных;
- Pkt Integrity - подтверждение получения
от клиента всех данных с соблюдением целостности;
- Pkt Privacy - подтверждение получения
от клиента всех данных с соблюдением целостности и защита шифрованием.
В поле Connect timeout
можно задать время ожидания соединения в секундах. 11о истечении этого времени
процесс прерывается.

Рис. 25.5.
Диалоговое окно настройки параметров соединения на странице просмотра настроек
Список Access permissions
задает права доступа к отдельным видам выполняемых операций. В списке можно
выбрать следующие значения:
- ReadWrite — чтение и запись;
- Share Deny None — полный доступ всем
на чтение и запись;
- Share Deny Read — чтение запрещено всем;
- Share Deny Write — запись запрещена
всем;
- Share Exclusive — чтение и запись запрещена
всем;
Страница All
позволяет просмотреть и при необходимости изменить все сделанные настройки для
выбранного провайдера (рис. 25.5). После подтверждения сделанных в диалоговом
окне настроек из них формируется значение свойства ConnectionString.
Соединение может быть синхронным и асинхронным.
Этот параметр определяется cвойством ConnectOptions.
Свойство
type TConnectMode = (cmUnknown, cmRead,
cmWrite, cmReadWrite, cmShareDenyRead, cmShareDenyWrite, cmShareExclusive,
cmShareDenyNone);
property Mode: TConnectMode;
задает доступные для соединения операции:
- cmUnknown — разрешение неизвестно или не может
быть установлено;
- cmRead — разрешение на чтение;
- cmwrite — разрешение на запись;
- cmReadWrite — разрешение на чтение и запись;
- cmShareDenyRead — разрешение на чтение для
других соединений запрещено;
- cmShareDenyWrite — разрешение на запись для
других соединений запрещено;
- cmShareExclusive — разрешение на открытие для
других соединений запрещено;
- cmShareDenyNone — открытие других соединений
с разрешениями запрещено.
Компоненты, работающие с хранилищем данных ADO
через данное соединение, подключаются к компоненту TADOconnection при помощи
свойства
property Connection: TADOConnection;
которое имеет каждый компонент, инкапсулирующий
набор данных ADO. Доступ к объекту соединения ADO после успешного открытия соединения
доступно через свойство ConnectionObject.
Компонент TADOConnection обеспечивает доступ ко
всем компонентам, которые используют его для доступа к хранилищу данных ADO.
Все открытые таким образом наборы данных доступны через индексированное свойство
Datasets. Каждый элемент этого списка содержит дескриптор компонента доступа
к данным ADO (тип TCustomADODataSet).
Для этих компонентов можно централизованно установить
тип используемого курсора при помощи свойства
type TCursorLocation = (clUseServer, clUseClient);
property CursorLocation: TCursorLocation;
Значение clUseClient задает локальный курсор на
стороне клиента, что позволяет выполнять любые операции с данными, в том числе
не поддерживаемые сервером.
Значение clUseServer задает курсор на сервере,
который реализует только возможности сервера, но обеспечивает быструю обработку
больших массивов данных.
Метод closeDataSets позволяет закрыть все открытые
через данное соединение наборы данных без закрытия самого соединения. Если параметр
метода имеет значение True, закрываются все компоненты с наборами данных. При
значении False закрываются все наборы данных, кроме работающих в режиме локального
курсора.
Компонент TADOConnection обеспечивает выполнение
команд ADO. Команду ADO инкапсулирует специальный компонент TADOCommand, который
рассматривается ниже. Все команды ADO, работающие с хранилищем данных через
данное соединение, доступны для управления через индексированное свойство commands.
Каждый элемент этого списка представляет собой экземпляр класса TADOCommand.
Выполнение команды с известным именем осуществляется
процедурой Execute (если команда не возвращает набор записей) или одноименной
функцией Execute (если команда возвращает набор записей). После выполнения транзакции
вызывается метод-обработчик onExecuteCompiete.
Все ошибки времени выполнения, возникающие при
открытом соединении, сохраняются в специальном объекте ADO, инкапсулирующем
коллекцию сообщений об ошибках. Доступ к объекту возможен через свойство Errors.
Компонент TADOConnection позволяет выполнять транзакции.
Методы BeginTrans, CommitTrans, RollbackTrans обеспечивают
начало, фиксацию и откат транзакции соответственно (табл. 25.1). Методы-обработчики
OnBeginTransComplete, OnCommitTransComplete вызываются после начала И фиксации
транзакции. Свойство
type TIsolationLevel = (ilUnspecified, ilChaos,
UReadUncommitted, ilBrowse, ilCursorStability, ilReadCommitted, ilRepeatableRead,
ilSerializable, illsolated);
property IsolationLevel: TIsolationLevel;
позволяет задать уровень изоляции транзакции:
- ilunspecified — уровень изоляции не задается;
- ilchaos — изменения более защищенных транзакций
не перезаписываются данной;
- ilReaduncommitted — незафиксированные изменения
других транзакции видимы;
- ilBrowse — незафиксированные изменения других
транзакций видимы;
- ilcursorstability — изменения других транзакций
видимы только после фиксации;
- ilReadCornmitted — изменения других транзакций
видимы только после фиксации;
- ilRepeatableRead — изменения других транзакций
не видимы, но доступны при обновлении данных;
- ilseriaiizable — транзакция выполняется изолированно
от других транзакций;
- ilIsoiated — транзакция выполняется изолированно
от других транзакций.
- Свойство
TXactAttribute = (xaCommitRetaining, xaAbortRetaining);
property Attributes: TXactAttributes;
Задает способ управления транзакциями при их фиксации
и откате:
- xaCommitRetaining — после фиксации очередной
транзакции автоматически начинается выполнение новой;
- xaAbortRetaining — после отката очередной транзакции
автоматически начинается выполнение новой.
Таблица 25.1. Свойства и методы
компонента TADOConnection
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
property Attributes: TXactAttributes;
|
Pb
|
Определяет поведение транзакции (см. выше).
|
|
property ConanandCount: Integer
|
Ro
|
Возвращает количество объектов команд ADO,
работающих через данное соединение
|
|
property Commands [Index: Integer]: • TADOCoitimand
|
Ro
|
Индексированный список компонентов команд
ADO, работающих через данное соединение
|
|
property CommandTimeout: Integer;
|
Pb
|
Определяет время ожидания выполнения команды
в секундах
|
|
property Connected: Boolean;
|
Pb
|
Управляет соединением. Значение True открывает
соединение
|
|
property ConnectionObject: Connection;
|
Ro
|
Ссылка на объект соединения ADO
|
|
property ConnectionString: WideString;
|
Pb
|
Содержит параметры соединения
|
|
property ConnectionTimeout: Integer;
|
Pb
|
Определяет время ожидания открытия или закрытия
соединения
|
|
TConnectOption = (coConnectUnspecified, coAsyncConnect) ;
property ConnectOptions: TConnectOption;
|
Pb
|
Определяет вид соединения.
CoConnectUnspecified — синхронное соединение
coAsyncConnect — асинхронное соединение
|
|
type TCursorLocation = (clUseServer, clUseClient) ;
property CursorLocation: TCursorLocation;
|
Pb
|
Определяет используемый механизм курсора.
clUseServer — используется механизм курсоров
на стороне сервера
clUseClient — используется механизм курсоров
на стороне клиента
|
|
property DataSetCount: Integer;
|
Ro
|
Возвращает число компонентов ADO с открытыми
наборами данных
|
|
property DataSets [Index: Integer]: TCustomADODataSet
|
Ro
|
Индексированный список компонентов ADO с
наборами данных
|
|
property DefaultDatabase: WideString;
|
Pb
|
Определяет объект соединения ADO, к которому
подключается данный компонент в случае неудачного соединения с параметрами,
заданными свойством ConnectionString
|
|
property Errors: Errors;
|
Ro
|
Ссылка на объект ADO коллекции ошибок
|
|
property InTransaction: Boolean
|
Ro
|
Позволяет определить, выполняется ли транзакция
|
|
property IsolationLevel: TIsolationLevel;
|
Pb
|
Задает уровень изоляции транзакции
|
|
property LoginPrompt: Boolean;
|
Pb
|
Управляет вызовом диалога регистрации пользователя
при открытии соединения
|
|
property Mode: TConnectMode;
|
Pb
|
Определяет разрешения на выполнение операций
через данное соединение
|
|
property Properties: Properties;
|
Ro
|
Ссылка на объект ADO коллекции свойств
|
|
property Provider: WideString;
|
Pb
|
Определяет имя провайдера ADO для данного
соединения
|
|
property State: TObjectStates;
|
Ro
|
Возвращает текущее состояние соединения
|
|
property Version: WideString;
|
Ro
|
Возвращает версию ADO
|
|
Методы
|
|
function BeginTrans: Integer;
|
Pu
|
Начинает новую транзакцию
|
|
procedure Cancels-
|
Pu
|
Отменяет соединение в процессе его открытия
|
|
procedure CloseDataSets (All: Boolean = True);
|
Pu
|
Закрывает все наборы данных, подключенных
через данный компонент без их отсоединения. Параметр All управляет закрытием
наборов записей на стороне клиента. Значение False оставляет такие наборы
открытыми
|
|
procedure ConimitTrans;
|
Pu
|
Фиксирует транзакцию
|
|
function Execute (const CommandText: WideString; ExecuteOptions : TExecuteOptions
= []): Recordset; overload; procedure Execute (const CoiroiandText: WideString;
var RecordsAffected: Integer; ExecuteOptions: TExecuteOptions = [eoExecuteNoRecords])
; overloads-
|
Pu
|
Выполняет команду, заданную параметром CommandText
с характеристиками, переданными параметром ExecuteOptions.
Функция выполняется, если команда возвращает
набор данных. Процедура выполняется, если команда не возвращает набор
данных
|
|
procedure GetProcedureNames (List: TStrings);
|
Pu
|
Возвращает в параметре List список хранимых
процедур базы данных
|
Доступ к удаленным хранилищам данных
ADO обеспечивает доступ не только к локальным
данным, но и к удаленным, расположенным в других процессах, на удаленных компьютерах.
Для этого применяется хорошо известный механизм маршаллинга DCOM и удаленного
вызова процедур.
В VCL Delphi эти возможности инкапсулирует компонент
TRDSConnection. Он обеспечивает удаленный доступ к данным через ADO, используя
возможности объекта DataSpace ADO. Компоненты ADO, работающие с наборами записей,
могут использовать компонент TRDSConnection для соединения с ADO вместо компонента
TADOConnection.
Компонент TRDSConnection может напрямую взаимодействовать
с удаленными данными или использовать функции некоторого бизнес-объекта, входящего
в состав удаленного сервера DCOM (Application Server).
В первом случае для создания экземпляра объекта
используется специальная фабрика класса, называемая RDS DataFactory и принадлежащая
серверу RDS:
const
DataFactoryProgID = 'RDSServer.DataFactory';
constructor TRDSConnection.Create(AOwner: TComponent)
;
begin
inherited;
SetServerName(DataFactoryProgID) ;
end;
При создании экземпляра класса TRDSConnection
задается имя сервера по умолчанию (табл. 25.2). Разработчик может задать нужный
ему сервер через свойство serverName. Каждый такой сервер имеет фабрику класса.
Во втором случае для задания бизнес-объекта используется
свойство CommandText связанного компонента, содержащего набор записей. Это свойство
должно содержать имя процедуры бизнес-объекта, возвращающей нужный набор записей.
Таблица 25.2. Свойства и методы
компонента TRDSConnection
|
Объявление
|
Тип
|
Описание
|
|
property AppServer: OleVariant;
property ComputerName: WideString;
|
Pu Pb
|
Интерфейс бизнес-объекта Имя удаленного
компьютера
|
|
property Connected: Boolean-
|
Pu
|
Открывает или закрывает соединение
|
|
property DataSetCount: Integer-
|
Ro
|
Возвращает количество подключенных через
данное соединение наборов данных
|
|
property DataSets [Index: Integer]: TDataSet;
|
Ro
|
Индексированный список компонентов наборов
данных, подключенных через данное соединение
|
|
DataSpaceObj ect: DataSpace;
|
Pu
|
Ссылка на объект DataSpace ADO
|
|
property InternetTimeout: Integer;
|
Pb
|
Время ожидания открытия соединения
|
|
property LoginPrompt: Boolean;
|
Pu
|
При значении True при открытии соединения
появляется диалог авторизации пользователя
|
|
property ServerName: WideString
|
Pb
|
Определяет имя удаленного сервера
|
|
Методы
|
|
procedure Close;
|
Pu
|
Закрывает соединение
|
|
function GetRecordset (const ComitiandText: WideString; ConnectionString:
WideString = ' '): Recordset;
|
Pu
|
Возвращает ссылку на набор записей, возвращаемый
бизнес-объектом
|
|
procedure Open;
|
Pu
|
Открывает соединение
|
Так как прямым предком компонента TRDSconnection
является класс TCustomConnection, компонент имеет несколько методов-обработчиков
событий, описание которых можно увидеть в табл. 25.1 (это методы AfterDisconnect,
BeforeConnect, BeforeDisconnect, OnLogin).
Наборы данных ADO
Delphi содержит стандартные компоненты, инкапсулирующие
набор данных и адаптированные для работы с хранилищем данных ADO. В целом эти
компоненты обладают обычным набором свойств и методов, а необходимый для доступа
к данным через ADO механизм наследуют от своего общего
Предка — класса TCustomADODataSet.
Класс TCustomADODataSet
Класс TCusbomADODataSet инкапсулирует механизм
доступа к хранилищу данных через ADO. По своему назначению этот класс аналогичен
классу TBDEDataSet, наполняя абстрактные методы общего предка TDataSet функциями
конкретного механизма доступа к данным (см. табл. 25.3).
Поэтому здесь мы рассмотрим только уникальные
свойства и методы класса TCustomADODataSet, обеспечивающие работу с ADO. Описание
стандартных функций (фильтры, индексы, поиск и т. д.) представлено в главе 18
"Отображение и управление данными".
Соединение набора данных с хранилищем данных ADO
осуществляется через компонент TADOConnect.ion (свойство connection) или путем
задания параметров соединения через свойство connectionString (см. выше).
Набор данных открывается методом Open и закрывается
методом close. Текущее состояние набора данных можно определить свойством
RecordSetState.
Набор данных в компонентах ADO основан на использовании
объекта набора записей ADO, прямой доступ к этому объекту возможен при помощи
свойства RecordSet.
Объект набора записей ADO позволяет управлять
курсором. Как уже говорилось выше, свойство CursorLocation задает местоположение
курсора, а свойство CursorType задает тип курсора:
TCursorType = (ctUnspecified, CtOpenForwardOnly,
ctKeyset, ctDynamic, ctStatic);
property CursorType: TCursorType;
- ctUnspecified — курсор не задан;
- ctOpenForwardOnly — однонаправленный
курсор;
- ctKeyset — локальный курсор, независимый от
изменений, вносимых в базу данных другими пользователями;
- ctDynamic — стандартный двунаправленный курсор;
- ctStatic — курсор, не поддерживающий изменения.
Навигация по записям набора данных осуществляется
стандартными методами, унаследованными от класса TDataSet и перекрытыми. Объект
набора записей ADO обладает дополнительными возможностями, которые позволяют
отслеживать состояние каждой записи. Поэтому во многих методах класса используется
тип TAffectRecords, который позволяет задать тип записей, к которым применяется
метод.
TAffectRecords = (arCurrent, arFiltered, arAll,
arAllChapters);
- arCurrent — операция выполняется только для
текущей записи;
- arFiitered — операция выполняется для записей
из работающего фильтра;
- arAll — операция выполняется для всех записей;
- arftlichapters — операция выполняется для всего
набора данных ADO. А для текущей записи состояние возвращает свойство
TRecordStatus = (rsOK, rsNew, rsModified, rsDeleted,
rsUnmodified, rslnvalid, rsMultipleChanges, rsPendingChanges, rsCanceied,
rsCantRelease, rsConcurrencyViolation, rsIntegrityViolation, rsMaxChangesExceeded,
rsObjectOpen, rsOutOfMemory, rsPermissionDenied, rsSchemaViolation, rsDBDeleted);
property RecordStatus: TRecordStatusSet;
- rsOK — запись успешно сохранена;
- rsNew — запись добавлена;
- rsModified — запись была изменена;
- rsDeleted — запись удалена;
- rsUnmodified — запись без изменений;
- rslnvalid — запись не может быть сохранена
из-за неверной закладки;
- rsMuitipleChanges — запись не может быть сохранена
из-за множественных изменений;
- rsPendingChanges — запись не может быть сохранена
из-за ссылки на не сохраненные изменения;
- rsCanceied — операция с записью была отменена;
- rsCantRelease — запись заблокирована;
- rsConcurrencyViolation - запись не может быть
сохранена из-за типа блокировки;
- rsIntegrityViolation — нарушена ссылочная целостность;
- rsMaxChangesExceeded — слишком много
изменений;
- rsObjectOpen — конфликт с объектом базы данных;
- rsOutOfMemory — недостаток памяти;
- rsPermissionDenied — нет доступа;
- rsSchemaViolation — нарушение структуры данных;
- rsDBDeleted — запись удалена из БД.
В наборе данных ADO можно использовать некоторые
дополнения к стандартным механизмам обработки данных.
Метод
procedure FilterOnBookmarks(Bookmarks: array of
const) ;
позволяет включить фильтрацию по существующим
закладкам.
Быстрый и гибкий поиск по полям текущего индекса
обеспечивает метод
SeekOption = (soFir3tEQ, soLastEQ, soAfterEQ,
soAfter, soBeforeEQ, soDcforc),
function Seekfconst KeyValues: Variant; SeekOption:
TSeekOption = soFirstEQ): Boolean;
В параметре KeyValues должны быть перечислены
необходимые значения полей индекса. Параметр SeekOption управляет процессом
поиска:
- soFirstEQ — курсор устанавливается на первую
найденную запись;
- soLastEQ — курсор устанавливается на последнюю
найденную запись;
- soAfterEQ — курсор устанавливается на найденную
запись или, если запись не найдена, сразу после того места, где она могла
находиться;
- soAfter — курсор устанавливается сразу после
найденной записи;
- soBeforeEQ — курсор устанавливается на найденную
запись или, если запись не найдена, перед тем местом, где она могла находиться;
- soBefore — курсор устанавливается перед найденной
записью.
Свойство
property Sort: WideString;
предоставляет простой способ сортировки по произвольному
сочетанию полей. Оно должно включать
через запятую имена нужных полей и признак прямого или обратного порядка сортировки:
'FirstField ASC, FirstField DESC';
Если порядок сортировки не указан, по умолчанию
задается прямой порядок.
Таблица 25.3. Свойства и методы
компонента TCus tomADODataSet
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
property CacheSize: Integer;
|
Pb
|
Определяет число записей в локальном кэше
набора данных
|
|
property Connection: TADOConnect ion ;
|
Pb
|
Определяет компонент соединения с хранилищем
данных ADO
|
|
property ConnectionString: WideString;
|
Pb
|
Содержит параметры, необходимые компоненту
для открытия соединения (см. выше)
|
|
property• CursorLocation: TCursorLocation;
|
Pb
|
Определяет используемый механизм курсора.
clUseServer — используется механизм курсоров
на стороне сервера
clUseClient — используется механизм курсоров
на стороне клиента
|
|
TCursorType = (ctUnspecified, ctOpenForwardOnly, ctKeyset, ctDynamic,
ctStatic) ; property CursorType: TCursorType;
|
|
Определяет тип курсора для набора записей
ADO
|
|
TExecuteOption = (eoAsyncExecute, e oAs ync Fe t ch, eoAsyncFetchNonBlocking,
eoExecuteNoRecords) ;
|
|
Задает параметры открытия набора данных
или выполнения команды.
eoAsyncExecute — асинхронное выполнение
|
|
TExecuteOptions = set of TExecuteOption;
property ExecuteOptions: TExecuteOptions;
|
|
eoAsyncFetch — асинхронное выполнение после
количества измененных записей, заданного свойством Cache eoAsyncFetchNonBlocking
— асинхронное выполнение без блокирования
eoExecuteNoRecords — не выполняется
|
|
TFilterGroup = (fgUnassigned, fgNone, fgPendingRecords, fgAffectedRecords,
fgFetchedRecords, fgPredicate, fgConflictingRecords); property FilterGroup:
TFilterGroup;
|
|
Позволяет фильтровать записи в наборе ADO
на основе информации о состоянии изменения записей (см. выше). Доступны
оказываются те записи, тип изменений которых перечислен в свойстве
|
|
type TADOLockType = (ItUnspecified, ItReadOnly, ItPessimistic, ItOptimistic,
ItBatchOptimistic) ;
property LockType: TADOLockType;
|
|
Определяет режим защиты записей.
ItUnspecified — не определен ItReadOnly
— только чтение ItPessimistic — защита устанавливается при начале редактирования
ItOptimistic — защита устанавливается только при сохранении изменений
ItBatchOptimistic — защита устанавливается при переносе данных
|
|
TMarshalOption = (moMarshalAll, moMarahalModifiedOnly);
|
|
Задает тип записей, которые передаются на
сервер при использовании локального курсора (см. свойство CursorLocation).
|
|
Property MarshalOptions: TMarshalOption;
|
|
moMarshalAll — все записи moMarshalModifiedOnly
— только измененные записи
|
|
property MaxRecords:
Integer;
|
|
Задает максимальное число записей в на
боре данных. Значение по умолчанию — 0,
не ограничивает набор данных
|
|
property ParamCheck: Boolean;
|
|
При значении True объект параметров генерирует
значения параметров для каждого встречающегося в команде параметра с нотацией
“:Paraml”
|
|
property Parameters: TParameters;
|
|
Набор параметров для выражения SQL
|
|
property Prepared: Boolean;
|
|
Позволяет определить готовность компонента
к открытию набора данных или выполнению команды
|
|
property Properties:
Properties;
|
|
Ссылка на объект ADO, содержащий ин
формацию о свойствах набора записей
|
|
property RecordSet: RecordSet;
|
|
Ссылка на объект, инкапсулирующий набор
записей DAO, связанный с данным компонентом
|
|
TObjectState =
(stClosed, stOpen, stConnecting, stExecuting, stFetching) ; TObjectStates
= set of TobjectState; property RecordSetState :TObjectStates;
|
|
Позволяет определить состояние набора
данных.
stClosed—закрыт
stOpen — открыт
stConnecting — подключается к базе данных
stExecuting — выполняется запрос или
команда
stFetching — получение данных от сервера
|
|
TRecordStatus = (rsOK,
rsNew, rsModified,
rsDeleted, rsUnmodified, rslnvalid, rsMultipleChanges,
rsPendingChanges, rsCanceled, rsCantRelease, rsConcurrencyViolation,
|
|
Определяет состояние текущей записи
|
|
rsIntegrityViolation, rsMaxChangesExceeded, rsObjectOpen, rsOutOfMemory,
rsPermissionDenied, rsSchemaViolation, rsDBDeleted) ;
property RecordStatus: TRecordStatusSet
|
|
|
|
property Sort: WideString;
|
|
Задает сортировку по полям набора данных
|
|
Методы
|
|
TAffectRecords == (arCurrent, arFiltered, arAll, arAllChapters) ;
procedure Cancel-Batch (AffectRecords: TAffectRecords = arAll);
|
|
Отменяет изменения, сделанные в наборе данных
(описание типа TAffectRecords см. выше)
|
|
procedure Clone (Source: TCustomADODataSet; LockType: TLockType = ItUnspecified)
;
|
|
Копирует набор записей ADO из компонента
Source в текущий компонент
|
|
TAffectRecords = (arCurrent, arFiltered, arAll, arAllChapters);
procedure DeleteRecords (AffectRecords: TAffectRecords = arAll) ;
|
|
Удаляет записи из набора данных в зависимости
от значения параметра (описание типа TAffectRecords см. выше)
|
|
procedure FilterOnBookmarks (Bookmarks: array of const) ;
|
|
Включает фильтр для записей, на которых
установлена закладка. В параметре метода перечисляются необходимые закладки
|
|
function GetFieldData (Field: TField; Buffer: Pointer): Boolean; override;
|
|
Помещает в буфер Buffer текущее значение
поля Field
|
|
function NextRecordset (var Record5Affected: Integer): Recordset;
|
|
Возвращает вторичный набор записей
|
|
Методы
|
|
procedure Requery (Options:
|
Pu
|
Обновляет набор записей
|
|
TExecuteOptions = []);
|
|
|
|
SeekOption = (soFirstEQ, soLastEQ, soAfterEQ, soAfter, soBeforeEQ,
soBefore) ;
function Seek (const
KeyValues: Variant; SeekOption: TSeekOption
= soFirstEQ): Boolean;
|
Pu
|
Осуществляет поиск по набору данных ADO,
используя текущий индекс (подробнее см. выше)
|
|
function Supports (CursorOptions: TCursorOptions): Boolean;
|
Pu
|
Возвращает True, если набор данных поддерживает
тип курсора, указанный в параметре
|
|
TAffectRecords = (arCurrent, arFiltered, arAll, arAllChapters);
procedure UpdateBatch
(AffectRecords: TAffectRecords = arAll) ;
|
Pu
|
Сохраняет изменения набора данных в хранилище
данных ADO (описание типа TAffectRecords см. выше)
|
|
Методы-обработчики событий
|
|
TEndOfRecordsetEvent = procedure (DataSet: TCustomADODataSet; var MoreData:
WordBool; var EventStatus: TEventStatus) of object;
property OnEndOfRecordset: TEndOfRecordsetEvent ;
TRecordsetEvent = procedure (DataSet: TCustomADODataSet; const
Error: Error; var EventStatus: TEventStatus) of object-property OnFetchComplete:
TRecordsetEvent;
|
Pb Pb
|
Вызывается при достижении последней записи
набора данных.
DataSet — компонент набора данных
MoreData — определяет наличие не сохраненных
записей до вызова обработчика
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
Вызывается после передачи данных в набор
записей.
DataSet — компонент набора данных Error
— ссылка на объект ADO ошибки
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TFetchProgressEvent = procedure (DataSet: TCustomADODataSet ; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus) of object;
property
OnFetchProgress:
TFetchProgressEvent;
|
Pu
|
Вызывается в процессе передачи данных в
набор записей в асинхронном режиме.
DataSet — компонент набора данных
Progress — число обработанных записей
EventStatus — содержит результат выпол
нения операции, вызвавшей обработчик
|
|
TFieldChangeCompleteEvent = procedure (DataSet:
TCustomADODataSet; const
FieldCount.: Integer;
const Fields: OleVariant; const Error: Error; var EventStatus:
TEventStatus) of object; property OnFieldChangeComplete:
TFieldChangeCoinpleteEvent ;
|
Pu
|
Вызывается после изменения текущего значения
поля набора записей.
DataSet — компонент набора данных
FieldCount — число полей в наборе записей
Fields — массив объектов ADO полей
Error — ссылка на объект ADO ошибки
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TRecordsetErrorEvent = Pb
procedure (DataSet: TCustomADODataSet; const
Reason: TEventReason;
const Error: Error; var
EventStatus:
TEventStatus) of object;
property OnMoveComplete: TRecordsetErrorEvent ;
|
Pu
|
Вызывается после перемещения курсора на
следующую запись. DataSet — компонент набора данных
Reason — причина перемещения
Error — ссылка на объект ADO ошибки
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TRecordChangeCompleteEve nt = procedure (DataSet:
TCustomADODataSet; const
Reason: TEventReason; const RecordCount: Integer; const Error: Error;
var EventStatus:
TEventStatus) of object;
property OnRecordChangeComplete:
TRecordChangeCompleteEvent
|
Pu
|
Вызывается после изменения записей из набора
данных.
DataSet — компонент набора данных
Reason — причина изменения
Error — ссылка на объект ADO ошибки
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
Методы-обработчики событий
|
|
TRecordsetErrorEvent = procedure (DataSet:TCustomADODataSet; const Reason:
TEventReason; const Error: Error; var EventStatus: TEventStatus) of Objects;
property OnRecordsetChangeComplete: TRecordsetErrorEvent
|
Pu
|
Вызывается после изменения набора данных.
DataSet — компонент набора данных
Reason — причина изменения
Error — ссылка на объект ADO ошибки
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TWillChangeFieldEvent = Pb
procedure (DataSet:
TCustoroADODataSet; const
FieldCount: Integer;
const Fields:
OleVariant; var
EventStatus:
TEventStatus) of objects-
property OnWillChangeField: TWillChangeFieldEvent;
|
Pu
|
Выполняется перед изменением значений
полей набора данных.
DataSet — компонент набора данных
FieldCount — число полей в наборе записей
Fields — массив объектов ADO полей
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TWillChangeRecordEvent Pb
= procedure (DataSet: TCustomADODataSet; const Reason: TEventReason;
const RecordCount: Integer;
var EventStatus: TEventStatus) of
Objects; property OnWillChangeRecord:
TWillChangeRecordEvent
|
Pu
|
Вызывается перед изменением записи.
DataSet — компонент набора данных
Reason — причина изменения
RecordCount — число измененных записей
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TRecordsetReasonEvent = procedure (DataSet:
TCustomADODataSet; const
Reason: TEventReason; var EventStatus: TEventStatus) of objects;
Property OnWillChangeRecordset: TRecordsetReasonEvent;
|
Pu
|
Вызывается перед изменением набора данных
DataSet — компонент набора данных
Reason — причина изменения
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
|
TRecordsetReasonEvent = procedure (DataSet: TCustomADODataSet; const
Reason: TEventReason; var EventStatus: TEventStatus) of object;
property OnWillMove: TRecordsetReasonEvent;
|
Pu
|
Вызывается перед перемещением курсора по
набору данных.
DataSet — компонент набора данных Reason
— причина изменения
EventStatus — содержит результат выполнения
операции, вызвавшей обработчик
|
Параметры
Многие компоненты ADO, инкапсулирующие набор записей,
должны обеспечивать применение параметров запросов. Для этого в них используется
специальный Класс TParameters.
Для каждого параметра из коллекции класса TParameters
(табл. 25.4) создается отдельный класс TParameter (табл. 25.5).
Этот класс является наследником класса коллекции
TCoilection и инкапсулирует индексированный список отдельных параметров (см.
ниже). Напомним, что для работы с параметрами обычных запросов в компонентах
TQuery и TStoredProc используется класс TParams (гл. 20), также происходящий
от класса коллекции.
Методы этих двух классов совпадают, а свойства
имеют некоторые отличия. Для представления параметров команд в ADO имеется специальный
объект параметров, который активно используется в процессе работы компонентов
ADO, инкапсулирующих набор данных.
Поэтому для компонентов ADO в VCL был создан собственный
класс параметров.
Класс TParameters
Индексированный список параметров представлен
свойством items.
Текущие значения параметров можно получить из
индексированного свойства paramvalues, доступ к конкретному значению осуществляется
по имени параметра.
Список параметров можно обновлять при помощи методов
Addparameter и Createparameter. Первый метод просто создает новый объект параметра
и добавляет его к списку. Метод Createparameter создает новый параметр и определяет
его свойства:
function CreateParameter(const Name: WideString; DataType:
TDataType;
Direction: TParameterDirection; Size: Integer; Value:
OleVariant):
TParameter;
- DataType — тип данных параметра, соответствующий
типу поля таблицы БД (ТИП TFieldType);
- Direction — тип параметра, в дополнение к стандартным
типам dUnknown, pdlnput, pdOutput, pdInputOutput, тип TParameterDirection
имеет дополнительный тип pdReturnvalue, определяющий любое возвращаемое значение;
- size — максимальный размер значения параметра;
- value — значение параметра.
Таблица 25.4. Свойства и методы
класса TParameters
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
property Command: TADOCommand;
|
Ro
|
Ссылка на компонент TADOCommand, содержащий
данные параметры
|
|
property Items [Index: Integer]: TParameter;
|
Pu
|
Индексированный список параметров
|
|
property ParameterCollection:
Parameters;
|
Ro
|
Ссылка на объект параметров ADO
|
|
property ParamInfoAvailable: Boolean;
|
Ro
|
Определяет, поддерживает ли провайдер ADO
функцию
CheckParamInfoAvailability
|
|
property ParamValues [const ParamName: String]: Variant;
|
Pu
|
Содержит значения параметров
|
|
Методы
|
|
function AddParameter: TParameter;
|
Pu
|
Добавляет к списку параметров новый объект
параметра
|
|
procedure AssignValues (Value: TParams);
|
Pu
|
Присваивает значения параметров из списка
параметров Value в данный экземпляр класса
|
|
function CreateParameter (const Name: WideString; DataType: TDataType;
Direction:
TParameterDirection;
Size: Integer; Value: OleVariant): TParameter;
|
Pu
|
Добавляет к списку параметров новый объект
параметра, задавая одновременно его свойства (см. выше)
|
|
Свойства
|
|
function FindParam (const Value: String): TParam;
|
Pu
|
Выполняет поиск параметра по его имени
|
|
procedure GetParamList (List: TList; const ParamNames: String);
|
Pu
|
Возвращает в параметре List список имен
параметров
|
|
function IsEqual (Value: TParams) : Boolean;
|
Pu
|
Определяет идентичность двух объектов параметров
|
|
function ParamByName (const Value: WideString): TParameter;
|
Pu
|
Возвращает параметр по его имени
|
|
function ParseSQL (SQL: String; DoCreate: Boolean): String;
|
Pu
|
Осуществляет анализ запроса SQL для выявления
содержащихся в нем параметров и для каждого нового параметра создает новый
элемент в списке класса. Параметр DoCreate определяет, удалять ли перед
анализом существующие параметры
|
|
procedure Refresh;
|
Pu
|
Обновляет список параметров
|
Класс TParameter
Инкапсулирует отдельный параметр.
Таблица 25.5. Свойства и методы
класса TParameter
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
TParameterAttribute = (paSigned, paNullable, paLong) ;
TParameterAttributes =
set of
TParameterAttribute ; property Attributes: TParameterAttributes;
|
Pb
|
Определяет тип значений параметра (соответствует
типам ADO)
|
|
TDataType = TFieldType;
property DataType: TDataType;
|
Pb
|
Задает тип данных параметра в соответствии
с типами данных Delphi
|
|
TParameterDirection = (pdUnknown, pdlnput, pdOutput, pdInputOutput,
pdReturnValue) ;
property Direction: TParameterDirection;
|
Pb
|
Задает тип параметра. pdUnknown — неизвестный
pdlnput — входной pdOutput — выходной pdInputOutput — входной и выходной
pdReturnValue — содержит значение
|
|
property DisplayName: String;
|
Pu
|
Имя параметра, доступное в классе
TParameters
|
|
property NumericScale: Byte;
|
Pb
|
Задает максимальное число цифр после запятой
|
|
property ParameterObj ect: Parameter;
|
Ro
|
Ссылка на объект параметра ADO
|
|
property Parameters: TParameters;
|
Ro
|
Ссылка на объект — коллекцию данного параметра
|
|
property Precision: Byte;
|
Pb
|
Задает максимальное число цифр в числовом
значении параметра
|
|
property Properties: Properties;
|
Ro
|
Ссылка на объект свойств ADO для объекта
параметра
|
|
property Size: Integer;
|
Pb
|
Определяет размер строкового значения параметра
|
|
property Value: OleVariant;
|
Pb
|
Содержит значение параметра
|
|
Методы
|
|
procedure AppendChunk (Val: OleVariant);
|
Pu
|
Вносит значение параметра
|
|
procedure Assign (Source: TPersistent) ; override;
|
Pu
|
Переносит параметр из Source в данный объект
параметра
|
|
procedure LoadFromFile (const FileName: String; DataType: TDataType);
|
Pu
|
Загружает значение параметра из файла FileName.
Тип данных определяет
DataType
|
|
procedure LoadFromStream (Stream: TStream; DataType: TDataType);
|
Pu
|
Загружает значение параметра из потока Stream.
Тип данных определяет DataType
|
Компонент
TADODataSet
Компонент TADODataSet предназначен для пред ста
н 1ения набора данных из хранилища данных ADO (табл. 25.6). Он прост в применении,
имея только несколько собственных свойств и методов, и использует функции своего
предка — класса TCustomADODataSet.
Для получения набора данных служит унаследованное
свойство CommandText, в котором определяется имя таблицы БД или текст запроса
SQL. При этом можно применять только язык DML (использовать только select).
Соединение с базой данных задается свойствами
connectionstring или Connection (см.
выше).
Набор данных открывается и закрывается свойством
Active или методами Open И Close.
В приложениях компонент можно применять как все
обычные компоненты доступа к данным, связывая инкапсулированный в нем набор
данных с визуальными компонентами отображения данных через компонент TDataSource.
Дополнительное свойство RDSConnection позволяет
получать данные от удаленных БД на других компьютерах (см. выше).
Таблица 25.6. Свойства и методы
компонента глосса taSet
|
Объявление
|
Тип
|
Описание
|
|
Свойства
property RDSConnection: TRDSConnection
|
Pb
|
Ссылается на связанный компонент
TRDSConnection
|
|
Методы
procedure GetIndexNames (List: TStrings);
|
Pu
|
Возвращает через параметр List список индексов
набора данных
|
Компонент TADOTable
Компонент TADOTable обеспечивает использование
в приложениях Delphi таблиц БД, подключенных через ADO. По своим функциональным
возможностям и применению он подобен стандартному компоненту TTabie (гл. 16).
Имя таблицы БД задается свойством TableName (табл.
25.7). Другие свойства и методы компонента обеспечивают применение индексов
(этой возможности лишен любой компонент запроса).
Так как не все провайдеры ADO обеспечивают прямое
использование таблиц БД, то дня доступа к ним может понадобиться запрос SQL.
Если свойство
DirectTable имеет значение True, осуществляется
прямой доступ к таблице. В противном случае компонент генерирует соответствующий
запрос.
Таблица 25.7. Свойства и методы
компонента TADOTable
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
property IndexFieldNames: Strings-
|
Pb
|
Список полей таблицы, используемых в текущем
индексе
|
|
property MasterFields: String;
|
Pb
|
Список полей, используемых для создания
отношения "один ко многим"
|
|
property MasterSource: TDataSource;
|
Pb
|
Задает компонент TDataSource для организации
отношения "один ко многим"
|
|
property Readonly: Boolean;
|
Pb
|
Включает или отключает режим "только для
чтения"
|
|
property TableDirect: Boolean;
|
Pb
|
Управляет способом доступа к таблице. При
значении True выполняется прямой доступ, при значении False генерируется
соответствующий запрос
|
|
property TableName: WideString;
|
Pb
|
Задает имя таблицы
|
|
Методы
|
|
procedure GetIndexNames (List: TStrings);
|
Pu
|
Возвращает в параметре List список индексов
таблицы
|
Компонент TADOQuery
Компонент TADOQuery обеспечивает применение запросов
SQL при работе с данными через ADO. Подобен стандартному компоненту TQuery.
Текст запроса задается свойством sql (табл. 25.8).
Запрос выполняется методами open, ExecSQL или свойством Active. Если запрос
возвращает набор данных, используется метод open. В противном случае (запросы
alter DELETE, INSERT и др.) неодходимо
применять метод ExecSQL.
Механизм передачи параметров, в дополнение к обычному,
имеет особенности. При наличии параметров запроса в свойстве Datasource необходимо
указать компонент TDataSource, обеспечивающий связь с компонентом набора данных,
записи которого содержат нужные значения. При этом имена полей должны совпадать
с именами параметров и сам набор данных должен быть открыт.
При перемещении курсора по вспомогательному набору
данных основной запрос переоткрывается автоматически, если он содержит команду
select. Иначе каждый раз необходимо выполнять основной запрос вручную.
Таблица 25.8. Свойства и методы
компонента TADOQuery
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
property DataSource: TDataSource;
|
Pb
|
Определяет набор данных, содержащий значения
параметров запроса
|
|
property RowsAffected: Integer;
|
Pu
|
Возвращает число обработанных запросом записей
|
|
property SQL: TStrings;
|
Pb
|
Содержит текст запроса
|
|
Методы
|
|
function ExecSQL: Integer;
|
Pu
|
Выполняет запрос без открытия набора данных
|
Компонент TADOStoredProc
Компонент TADOStoredProc позволяет использовать
в приложениях Delphi, обращающихся к данным через ADO, хранимые процедуры. Подобен
стандартному компоненту TStoredProc.
Имя хранимой процедуры определяется свойством
property ProcedureName: WideString;
Для определения входных и выходных параметров
выполнения процедуры используются стандартные свойства и методы. Обычным образом
используется и возвращаемый процедурой набор данных. Подробнее об этом смотри
главу 22 "Разработка клиентских приложений".
Команды ADO
Для выполнения операций, результатом которых не
является набор записей, в ADO предназначен специальный объект команды. В VCL
Delphi ему соответствует компонент TADOCommand. Методы этого компонента во многом
совпадают с методами объекта ADO (табл. 25.9).
Так же, как и команды в ADO, компонент TADOCommand
предназначен для выполнения запросов SQL, не возвращающих набор данных. К ним
относятся запросы delete, insert, update и команды Data Definition Language
(гл. 20).
Так как компоненту нет необходимости обеспечивать
работу набора записей, его непосредственным предком является клайс TComporieri-fc.
К. его функциональности просто добавлен
механизм соединения с БД через ADO и средства представления команды.
Команда передается в хранилище данных ADO через
собственное соединение или через компонент TADOconnection, аналогично другим
компонентам ADO (см. выше).
Текстовое представление выполняемой команды должно
содержаться в свойстве commandText, однако команду можно задать и другим способом.
Прямая ссылка на нужный объект команды ADO может быть задана свойством CommnadObject.
Тип команды определяется свойством
type TCommandType - (cmdUnknown, cmdText, cmdTable,
cmdStoredProc, cmdFile, cmdTableDirect);
property CommandType: TCommandType;
Так как тип TCommandType
также используется в классе TCustomADODataSet, где
необходимо представлять все возможные виды команд, по отношению к компоненту
TADOCommand этот тип обладает избыточностью. Здесь нельзя установить значения
cmdTable, cmdFile, cmdTableDirect, а тип cmdStoredProc должен
обозначать только те хранимые процедуры, которые не возвращают набор данных.
Если команда должна содержать текст запроса
SQL, свойство CommandType должно иметь значение
cmdText. Для вызова хранимой процедуры необходимо задать тип cmdStoredProc,
а в свойстве CommandText ввести имя процедуры.
Если для выполнения команды необходимо задать
параметры, используется cвойство Parameters.
Выполнение команды осуществляется методом Execute:
function Execute: RecordSet; overload;
function Execute(const Parameters: OleVariant):
_Recordset;
overload;
function Execute(var RecordsAffected: Integer;
var Parameters:
OleVariant; ExecuteOptions: TExecuteOptions =
[]): _RecordSet;
overload;
Разработчик может использовать любую из представленных
нотаций метода.
- Параметр RecordsAffected возвращает число обработанных
записей.
- Параметр parameters задает параметры команды.
- Параметр ExecuteOptions определяет условия
выполнения команды:
TExecuteOption = (eoAsyncExecute, eoAsyncFetch,
eoAsyncFetchNonBlock-ing, eoExecuteNoRecords);
TExecuteOptions = set of TExecuteOption;
- eoAsyncExecute — асинхронное выполнение команды;
- eoAsyncFetch — асинхронная передача данных;
- eoAsyncFetchNonBiocking — асинхронная передача
данных без блоки рования потока;
- eoExecuteNoRecords — если команда возвращает
набор записей, то они не передаются в компонент.
При работе с компонентом TADOConnection желательно
использовать параметр eoExecuteNoRecords.
Текущее состояние команды можно определить свойством
type
TObjectState = (stClosed, stOpen, stConnecting,
stExecuting, stFetching);
T0bject3tate5 = set of TObjectState;
property States: TObjectStates;
Таблица 25.9.
Свойства и методы компонента TAOOCommand
|
Объявление
|
Тип
|
Описание
|
|
Свойства
|
|
property CommandObject: Command;
|
Ro
|
Ссылка на объект команды ADO
|
|
property CoromandText: WideString;
|
Pb
|
Содержит текст команды. Это может быть запрос
SQL
|
|
property CommandTimeout: Integer;
|
Pb
|
Задает время ожидания выполнения команды
|
|
property CommandType: TCommandType;
|
Pb
|
Определяет тип команды (см. выше)
|
|
property Connection: TADOConnection;
|
Pb
|
Задает компонент соединения ADO
|
|
property ConnectionString: WideString;
|
Pb
|
Определяет параметры соединения ADO
|
|
property ParamCheck: Boolean;
|
Pb
|
При значении True объект параметров генерирует
значения параметров для каждого встречающегося в команде параметра с нотацией
":Paraml"
|
|
property Parameters: TParameters;
|
Pb
|
Объект параметров команды
|
|
property Prepared: WordBool;
|
Pb
|
Позволяет определить, подготовлена ли команда
к выполнению
|
|
property Properties: Properties;
|
Ro
|
Ссылка на объект параметров ADO
|
|
property States: TObjectStates;
|
Ro
|
Возвращает текущее состояние команды
|
|
Методы
|
|
procedure Assign (Source: TPersistent); override;
|
Pu
|
Передает в данный компонент параметры компонента,
заданного параметром Source
|
|
procedure Cancel;
|
Pu
|
Прерывает выполнение команды
|
|
function Execute: RecordSet; overload;
|
|
Выполняет команду (см. выше)
|
|
function Execute (const Parameters: OleVariant): Recordset; overload;
function Execute (var RecordsAffected: Integer; var Parameters: OleVariant;
ExecuteOptions: TExecuteOptions = []): RecordSet; overload;
|
|
|
Резюме
Технология ADO обеспечивает простой и универсальный
способ доступа к гетерогенным источникам данных. Благодаря тому, что функции
ADO реализованы на основе интерфейсов OLE DB и СОМ, приложению для доступа к
данным не требуется дополнительных библиотек, кроме инсталлированного ADO 2.1.
Компоненты TADOConnection и TRDSConnection обеспечивают
простое и удаленное соединение с источниками данных через провайдеры ADO. Компоненты
TADODataSet, TADOTable, TADOQuery, TADOStoredProc обеспечивают использование
наборов записей в приложении. Свойства и методы компонентов позволяют создавать
полнофункциональные приложения.
Компонент TADOCommand инкапсулирует текстовую
команду ADO.
В дополнение к стандартным возможностям работы
с данными, из компонентов можно напрямую обращаться к необходимым' объектам
и интерфейсам ADO.
Вернуться к содержанию
|