Глава 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
Технология 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 различает следующие типы объектов, которые будут рассмотрены ниже.
Рассмотрим функциональные возможности основных объектов и интерфейсов 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, который открывает необходимый набор рядов.
В зависимости от возможностей источника данных, набор рядов может поддерживать различные интерфейсы. Но пять из них являются обязательными:
В отличие от привычной практики разработки интерфейсов в рамках модели СОМ, интерфейсы OLE DB часто имеют всего один-два метода. В результате большая группа интерфейсов реализует несколько вполне стандартных функций.
Дополнительные возможности по управлению набором рядов предоставляют следующие интерфейсы:
Команды
Программные средства ADO были бы неполными, если бы не имели возможности использовать для работы с данными язык SQL. Операторы DML и DDL, ряд специальных операторов ADO носят общее название текстовых команд.
Объект-команда инкапсулирует саму текстовую команду и механизм обработки и передачи команды. Объект команды выполняет:
Главный интерфейс объекта команды icommand имеет три метода:
Помимо основного, объект команды обеспечивает доступ к дополнительным интерфейсам:
Провайдеры 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 устанавливается при помощи свойства 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 определяет возможности клиентов при подключении в соответствии с полномочиями их ролей. В списке могут'быть выбраны следующие значения:
Список Protection level позволяет задать уровень защиты данных. В списке могут быть выбраны следующие значения:
В поле Connect timeout можно задать время ожидания соединения в секундах. 11о истечении этого времени процесс прерывается.
Рис. 25.5. Диалоговое окно настройки параметров соединения на странице просмотра настроек
Список Access permissions задает права доступа к отдельным видам выполняемых операций. В списке можно выбрать следующие значения:
Страница All позволяет просмотреть и при необходимости изменить все сделанные настройки для выбранного провайдера (рис. 25.5). После подтверждения сделанных в диалоговом окне настроек из них формируется значение свойства ConnectionString.
Соединение может быть синхронным и асинхронным. Этот параметр определяется cвойством ConnectOptions.
Свойство
type TConnectMode = (cmUnknown, cmRead, cmWrite, cmReadWrite, cmShareDenyRead, cmShareDenyWrite, cmShareExclusive, cmShareDenyNone);
property Mode: TConnectMode;
задает доступные для соединения операции:
Компоненты, работающие с хранилищем данных 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;
позволяет задать уровень изоляции транзакции:
TXactAttribute = (xaCommitRetaining, xaAbortRetaining);
property Attributes: TXactAttributes;
Задает способ управления транзакциями при их фиксации и откате:
Таблица 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;
Навигация по записям набора данных осуществляется стандартными методами, унаследованными от класса TDataSet и перекрытыми. Объект набора записей ADO обладает дополнительными возможностями, которые позволяют отслеживать состояние каждой записи. Поэтому во многих методах класса используется тип TAffectRecords, который позволяет задать тип записей, к которым применяется метод.
TAffectRecords = (arCurrent, arFiltered, arAll, arAllChapters);
TRecordStatus = (rsOK, rsNew, rsModified, rsDeleted, rsUnmodified, rslnvalid, rsMultipleChanges, rsPendingChanges, rsCanceied, rsCantRelease, rsConcurrencyViolation, rsIntegrityViolation, rsMaxChangesExceeded, rsObjectOpen, rsOutOfMemory, rsPermissionDenied, rsSchemaViolation, rsDBDeleted);
property RecordStatus: TRecordStatusSet;
В наборе данных ADO можно использовать некоторые дополнения к стандартным механизмам обработки данных.
Метод
procedure FilterOnBookmarks(Bookmarks: array of const) ;
позволяет включить фильтрацию по существующим закладкам.
Быстрый и гибкий поиск по полям текущего индекса обеспечивает метод
SeekOption = (soFir3tEQ, soLastEQ, soAfterEQ, soAfter, soBeforeEQ, soDcforc),
function Seekfconst KeyValues: Variant; SeekOption: TSeekOption = soFirstEQ): Boolean;
В параметре KeyValues должны быть перечислены необходимые значения полей индекса. Параметр SeekOption управляет процессом поиска:
Свойство
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;
Таблица 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;
Разработчик может использовать любую из представленных нотаций метода.
TExecuteOption = (eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlock-ing, eoExecuteNoRecords);
TExecuteOptions = set of TExecuteOption;
При работе с компонентом 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.