Информационный портал MSEVM
 Поиск

Главная > Программирование в Delphi 5 > Глава 25


Глава 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 носят общее название текстовых команд.

Объект-команда инкапсулирует саму текстовую команду и механизм обработки и передачи команды. Объект команды выполняет:

  1. Разбор текста команды.
  2. Связывание команды с источником данных.
  3. Оптимизация команды.
  4. Передача команды источнику данных.

Главный интерфейс объекта команды 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 задает права доступа к отдельным видам выполняемых операций. В списке можно выбрать следующие значения:

  • Read - только чтение;
  • ReadWrite - чтение и запись;
  • Share Deny None - полный доступ всем на чтение и запись;
  • Share Deny Read - чтение запрещено всем;
  • Share Deny Write - запись запрещена всем;
  • Share Exclusive - чтение и запись запрещена всем;
  • Write - только запись.

Страница 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;

  • Name - имя параметра;
  • 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.



e-mail рассылки
Радиолюбитель
Подписаться письмом
Найти DataSheet!





Rambler's Top100