-
Наряду с традиционными инструментами доступа к данным Borland Database Engine и ODBC в приложениях Delphi можно применять технологию Microsoft ActiveX Data Objects (ADO), которая основана на возможностях СОМ, а именно интерфейсов OLE DB.
-
Объекты-перечислители обеспечивают поиск любых объектов ADO, которые имеют доступ к источникам данных. При этом другие перечислители также видны в данном перечислителе. | Первичный поиск источников данных осуществляется в провайдере ADO.
-
Из объекта-источника данных можно создавать объекты-сессии. Для этого используется метод: | function CreateSession | (const punkOuter: lUnknown; const riid: TGUID; out ppDBSession: lUnknown): | HResult; stdcall; | …интерфейса iDBCreateSession.
-
Программные средства ADO были бы неполными, если бы не имели возможности использовать для работы с данными язык SQL. Операторы DML и DDL, ряд специальных операторов ADO носят общее название текстовых команд.
-
Провайдеры ADO обеспечивают соединение приложения, использующего данные через ADO, с источником данных (сервером SQL, локальной СУБД, файловой системой и т. д.). Для каждого типа хранилища данных должен существовать провайдер ADO.
-
Механизм доступа к данным через ADO и многочисленные объекты и интерфейсы реализованы в VCL Delphi в виде набора компонентов, расположенных на странице ADO. Все необходимые интерфейсы, обеспечивающие работу компонентов, объявлены и описаны в файлах OleDB.pas и ADODB.pas в папке \Delphi7\Source\Vcl.
-
Компонент TADOConnection предназначен для управления соединением с объектами хранилища данных ADO. Он обеспечивает доступ к хранилищу данных компонентам ADO, инкапсулирующим набор данных (см. ниже). | Применение этого компонента дает разработчику ряд преимуществ:
-
Соединение с хранилищем данных ADO открывается и закрывается при помощи свойства: | property Connected: Boolean; | …или методов: | procedure Open; overload; | procedure Openfconst UserlD: WideString; const Password: WideString); overload; | …и: | procedure Close;
-
Компонент TADOconnection обеспечивает доступ ко всем компонентам, которые используют его для доступа к хранилищу данных ADO. Все открытые таким образом наборы данных доступны через индексированное свойство: | property DataSets[Index: Integer]: TCustomADODataSet;
-
Все ошибки времени выполнения, возникающие при открытом соединении, сохраняются в специальном объекте ADO, инкапсулирующем коллекцию сообщений об ошибках. | Доступ к объекту возможен через свойство: | property Errors: Errors; | Подробнее об объекте ошибок ADO см. ниже.
-
На странице ADO Палитры компонентов Delphi, кроме компонентов соединения есть стандартные компоненты, инкапсулирующие набор данных и адаптированные для работы с хранилищем данных ADO (рис. 19.7). Это компоненты: | TADODataSet – универсальный набор данных; | TАоотаblе – таблица БД;
-
Класс TCustomADODataSet инкапсулирует механизм доступа к хранилищу данных через ADO. Этот класс наполняет абстрактные методы общего предка TDataSet функциями конкретного механизма доступа к данным. | Поэтому здесь мы рассмотрим только уникальные свойства и методы класса TCustomADODataSet, обеспечивающие работу с ADO.
-
Для набора данных ADO в зависимости от его назначения можно выбрать тип и местоположение используемого курсора. Местоположение курсора задается свойством: | type TCursorLocation = (clUseServer, clUseClient); property CursorLocation: TCursorLocation;
-
После передачи клиенту записи набора данных размещаются в локальном буфере, размер которого определяется свойством: | property CacheSize: Integer; | Значение свойства есть число записей, помещаемых в локальный буфер, и оно не может быть меньше 1.
-
Класс TCustomADODataSet обладает дополнительными возможностями, которые позволяют отслеживать состояние каждой записи. | Для текущей записи набора данных можно определить ее состояние.
-
Помимо обычной фильтрации, основанной на свойствах Filter, Filtered и методе-обработчике onFilterRecord, класс TCustomADODataSet предоставляет разработчику дополнительные возможности. | Свойство: | TFilterGroup = (fgUnassigned, fgNone, fgPendingRecords, fgAffectedRecords, | fgFetchedRecords, fgPredicate, fgConflictingRecords); | property FilterGroup: TFilterGroup;
-
Быстрый и гибкий поиск по полям текущего индекса набора данных обеспечивает метод: | SeekOption = (soFirstEQ, soLastEQ, soAfterEQ, soAfter, soBeforeEQ, soBefore); | function Seek(const KeyValues: Variant; SeekOption: TSeekOption = soFirstEQ): Boolean;
-
Для выполнения запросов к источнику данных любой компонент ADO инкапсулирует специальный объект команды ADO. | При использовании компонентов-потомков класса TCustomADODataSet обычно нет необходимости применять объект команды напрямую.
-
Как уже рассказывалось выше, наборы данных ADO используют на клиентской стороне локальный кэш для хранения данных и сделанных изменений. Благодаря наличию этого кэша и появилась возможность реализовать групповые операции.
-
Многие компоненты ADO, инкапсулирующие набор записей, должны обеспечивать применение параметров запросов. Для этого в них используется специальный класс TParameters. | Для каждого параметра из коллекции класса TParameters создается отдельный класс TParameter.
-
Класс TParameter инкапсулирует отдельный параметр. Имя параметра определяется свойством: | property Name: WideString; | Тип данных, которому должно соответствовать его значение, задается свойством: | TDataType = TFieldType; property DataType: TDataType;
-
Компонент TADODataSet предназначен для представления набора данных из хранилища данных ADO. Он прост в использовании, имея только несколько собственных свойств и методов, и применяет функции своего предка – класса TCustomADODataSet.
-
Компонент ТАDOTаblе обеспечивает использование в приложениях Delphi таблиц БД, подключенных через провайдеры OLE DB. По своим функциональным возможностям и применению он подобен стандартному табличному компоненту (см. гл. 11).
-
Команде ADO, которой мы уделяли так много внимания в этой главе в VCL Delphi, соответствует компонент TADOCormand. Методы этого компонента во многом совпадают с методами класса TCustomADODataSet, хотя этот класс не является предком компонента (рис. 19.8).
-
При рассказе о компонентах ADO в данной главе мы довольно часто упоминали об объектах ошибок ADO. Эти объекты содержат информацию об ошибке, возникшей при выполнении операции каким-либо объектом ADO. | В Delphi для объекта ошибки не предусмотрен специальный тип, но разработчик может использовать его методы интерфейса Error, предоставляемого многими методами других объектов ADO.
-
Теперь попробуем применить на практике представленную в этой главе информацию о реализации ADO в Delphi. В качестве примера создадим простое приложение ADO Demo, которое "умеет" отображать пару таблиц БД, сохранять изменения при помощи групповых операций, сортировать записи и устанавливать фильтры на выбранные записи (рис. 19.9). | Рис. 19.9.
-
Для связывания приложения с источником данных используем компонент TADOConnection и настроим соединения, щелкнув на кнопке свойства connectionstring в Инспекторе объектов. | Перейдя в редактор Data Link Properties, выберем провайдер Microsoft OLE DB Provider for OLE DB Drivers (см. рис. 19.3).
-
Компонент tbiindustry предназначен для выполнения групповых операций. Поэтому его свойство LociType имеет значение itBatchOptimistic. Для свойства CursorLocation установлено значение ciuseclient, чтобы обеспечить использование набора данных на клиенте.