Лекция #12. Доступ к БД через Microsoft ActiveX Data Objects (ADO). Автор: Пучкова Д.М. План лекции. Соотношения между компонентами BDE и ADO. 2. Задание соединения компонентов ADO с БД. 1. Соединение с помощью компонента ADOConnection, управление транзакциями. 4. Компоненты набора данных: ADOTable, ADOQuery, ADOStoredProc и ADODataSet. 5. Выполнение команд компонентов ADOcommand и ADOСonnection. 3. Соотношения между компонентами BDE и ADO. ADO – это пользовательский интерфейс к произвольным типам данных, включая реляционные и нереляционные БД, электронную почту, системные, текстовые и графические файлы. Связь с данными посредством технологии OLE DB. Использование ADO является альтернативой обеспечивая более эффективную работу с данными. Borland DataBase, Для работы с ADO предусмотрены компоненты, расположенные внутри библиотеки – ADO. Они инкапсулируют такие объекты ADO, как Command и RecordSet. Это обеспечивается, соответственно, новыми компонентами Delphi: ADOConnection, ADCommand и ADODataSet. Связь с БД в технологии ADO осуществляется через набор данных (компонент DataSource), компоненты визуализации данных (DBGrid, DBEdit и т.д.). Отличие заключается в том, что вместо компонентов, располагающихся на странице Data Access используются компоненты, расположенные на странице ADO. Соотношения между компонентами BDE и ADO. Большинство компонентов, предназначенных для работы с ADO, аналогичны прежним компонентам, работающим с BDE. Компонент ADO ADOTable ADOQuery ADOStoredProc ADOConnection ADODataSet ADOCommand RDSConnection Компонент BDE Table Query StoredProc DataBase Table, Query, StoredProc — — Соотношения между компонентами BDE и ADO. Характеристика основных компонентов. Компонент Описание ADOConnection Используется для связи с набором данных ADO, позволяющим работать с несколькими компонентами набора данных и обеспечивает выполнение их команд. ADODataSet Универсальный компонент связи с набором данных, который может работать в различных режимах. Связывается с БД непосредственно или через ADOConnection. ADOTable Используется для работы с одной таблицей. С таблицей можно связываться непосредственно или через ADOConnection. ADOQuery Используется для работы с набором данных с написанием запросов SQL, включая такие запросы языка DDL (Data Definition Language), как CREATE TABLE. Может связываться с набором данных непосредственно или через ADOConnection. Соотношения между компонентами BDE и ADO. Характеристика основных компонентов. Компонент Описание ADOStoredProc Используется для выполнения процедур, хранимых на сервере. Может связываться с набором данных непосредственно или через ADOConnection. ADOCommand Используется, в основном, для выполнения команд SQL, не возвращающих множество результатов. Может также использоваться для работы с таблицей. Может связываться с набором данных непосредственно или через ADOConnection. Необходимо отметить, что хотя, в основном, компоненты ADO являются более мощными, чем компоненты-аналоги BDE, ряд возможностей BDE в них не реализован. Например, источник данных Paradox ADO не работает с графикой. Необходимо серьезно пересмотреть все «за» и «против», прежде чем переходить от BDE к ADO. Соединение компонента ADO с БД. В отличие от компонентов BDE (Table, Query и т.д.), в компонентах ADO не существует свойства DataBaseName, указывающего БД. Доступ к БД осуществляется или с помощью строки соединения – свойства ConnectionString, с помощью отдельного компонента ADOConnection, имя которого задается в свойстве Connection других компонентов. Рассмотрим соединение с БД при помощи свойства ConnectionString на примере компонента ADOTable. Свойство ConnectionString представляет собой строку, содержащую параметры соединения. Отдельные параметры отделяются друг от друга «;». ADO поддерживает четыре параметра: Provider – имя провайдера, использующееся для соединения; File Name – имя файла, содержащее информацию о соединении; Remote Provider – имя провайдера, использующееся со стороны клиента; Remote Server – путь и имя сервера. Помимо этих параметров, строка соединения может включать в себя и другие параметры, специфичные для использования системы, например, идентификации пользователя. Вручную составлять такую строку сложно, ее можно создавать при помощи специального диалогового окна. Соединение компонента ADO с БД. Перенесем на форму компонент ADOTable и в Object Inspector нажать кнопку с многоточием около его свойства ConnectionString. Откроется диалоговое окно. Верхняя радиокнопка «Use Data Link File» позволяет указать файл связи .udl. Нижняя кнопка «Use Connection String» позволяетв режиме диалога сформировать строку соединения. Включим эту радиокнопку и нажмем «Build». Откроется многостраничное окно создания соединения. На его странице «Provider» указать провайдер OLE DB, который собираемся использовать для соединения с БД. Во многих случаях устроит Microsoft OLE DB Provider for ODBC Drivers. Но для работы с Microsoft SQL Server необходимо использовать другие разделы списка. Выбрав провайдер, перейти на страницу «Connection». Здесь необходимо указать, как будем соединяться с ODBC. Выберем кнопку: «Use datasource name», и можно задать строку соединения самостоятельно, не прибегая к зарегистрированному DSN. Сначала рассмотрим этот путь. Соединение компонента ADO с БД. Выберем «Use connection string», нажмем «Build». В открывшемся окне можно выбрать один из зарегистрированных в ODBC файлов источников данных. Если нужного файла источника данных не существует, его можно выбрать, используя кнопку «New». Например, первоначально может не быть источника данных Interbase и Paradox. Тогда, чтобы создать новый файл источника, нажать «New». Откроется окно создания нового файла источника данных. В его списке можно выбрать требуемый драйвер (например, Paradox или InterBase). Выбрав драйвер, нажать «Далее» и откроется другое окно. В этом окне можно задать произвольное имя нового источника данных. Нажав «Далее», попадем в следующее окно, в котором можно посмотреть и проверить введенные данные. Нажав кнопку «Готово», попадем в следующее окно. В нем возможно уточнить версию драйвера и необходимо указать каталог БД (кнопка «Select Directory»). Для иных источников данных, отличных от Paradox, вместо этого окна показываются другие диалоговые окна, но смысл их всегда один – указание БД. После этих действий вернемся в основное окно задания свойств соединения на страницу «Connection», на которой в окне «Connection string» будет занесена строка соединения со всеми необходимыми параметрами. Соединение компонента ADO с БД. В окне «Data Link Properties», на странице «Connection» можно также занести дополнительную информацию: имя пользователя и пароль, ввести начальный каталог («Enter the initial catalog to use»). Тогда эти данные также занесутся в строку. Кнопка «Test Connection» в том же окне «Connection» позволяет проверить правильность всей информации. При нажатии на эту кнопку происходит соединение с БД. В случае успеха выводится «Test communication succeeded», иначе будет выдано сообщение об ошибках. После завершения форматирования строки соединения, можно перейти на страницу «Advanced» окна «Data Link Properties». Верхние окна (Network setting) позволяют задать режим работы с сетью. Окно «Connection timeout» устанавливает время ожидания завершения соединения в секундах. Список «Access permissions» позволяет установить варианты доступа к БД, намечая в индикаторах те операции, которые будут допустимы. Страница «All» сообщает итоговую информацию о соединении и позволяет ее отредактировать. После выбора всех опций, нажать в окне «Data Link Properties» «OK», и сформировавшаяся строка появится в свойстве «ConnectionString» компонента. Соединение с помощью компонента ADOConnection. Управление транзакциями. Соединение компонента с БД можно осуществить не только через свойство ConnectionString, но и через свойство Connection, связывающее данный компонент с компонентом ADOConnection. В этом компоненте ADOConnection, осуществляющим диспетчеризацию работы с набором данных, соединение задается свойством ConnectionString. Во всех других компонентах набора данных достаточно установить в свойстве «Connection» имя компонента «ADOConnection». Соединение с БД компонентов набора данных, связанных с ADOConnection, происходит, даже если в самом ADOConnection не предпринимается никаких действий для открытия БД. Достаточно в компоненте набора данных установить ActiveTRUE, и он свяжется с набором данных. При этом свойство «Connection» компонента ADOConnection автоматически установится в true. Соединение с помощью компонента ADOConnection. Управление транзакциями. Компонент ADOConnection инкапсулирует объект соединения с ADO. Он позволяет управлять атрибутами и условиями соединения подключаемых к нему компонентов набора данных. Свойства компонентов позволяют задавать схему блокировки записей, тип курсора, уровень и многое другое. Методы ADOConnection обеспечивают управление транзакциями. Именно из-за этих особенностей и используется ADOConnection. Во время выполнения приложения осуществляется методом Open: соединение ADOConnection с БД procedure Open(const UserID: WideString; const Password: WideString); Параметры UserID – идентификатор пользователя и Password – пароль – необязательны. Они могут быть заданы в строке соединения – свойстве ConnectionString. Эту информацию приложение может получить также из диалогового окна, предъявляемого пользователю при соединении с БД. Это окно отображается, если установить свойство LoginPrompt компонента ADOConnection в true. Если использовать это значение LoginPrompt, то имя пользователя и пароль можно не задавать ни в строке соединения, ни в вызове Open. Соединение с помощью компонента ADOConnection. Управление транзакциями. В компоненте ADOConnection может быть задано свойство DefaultDataBase – БД по умолчанию. Эта БД используется, если с основной БД не удалось установить соединение. БД по умолчанию может быть задана и в свойстве ConnectionString. Тогда значение этой БД по умолчанию заменяет значение, установленное в DefaultDataBase. Соединение с БД закрывает метод Close. Свойство KeepConnection определяет, сохраняется ли соединение с БД, даже если БД не открыта. Установка KeepConnectiontrue сокращает нагрузку на сеть при соединении с БД, но увеличивает нагрузку на сам компьютер. Существует также метод CloseDataSets, закрывающий соединение любого компонента наборов данных, соединенных с данным компонентом ADOConnection, но не закрывающим самого ADOConnection. Другим способом установления и разрыва соединения с БД является установка в true или false свойства Connected. Это свойство также можно использовать для проверки успешного соединения. Если Connected=TRUE, то соединение активно, если Connected=false и KeepConnection=FALSE, то соединение неактивно. Соединение с помощью компонента ADOConnection. Управление транзакциями. Свойство Connected компонента ADOConnection связано со свойствами Active компонентов наборов данных, подключенных к данному ADOConnection. Если Connected=false, а в одном из подключенных компонентов набора данных свойство ActiveTRUE, то ConnectedTRUE. Если ADOConnection разрывает соединение методом Close или установкой ConnectedTRUE, то свойства Active всех подключенных компонентов устанавливаются в false. Если после разрыва соединения компонент ADOConnection вновь устанавливает соединение методом Open или заданием Connected:=TRUE, то свойства Active подсоединенных компонентовFALSE, следовательно, эти компоненты не подключаются к БД. В этом случае необходимы специальные меры для их подключения. Для этого можно воспользоваться свойством DataSets компонента ADOConnection, которое является массивом всех компонентов наборов данных, подсоединенных к данному компоненту ADOConnection. Количество таких объектов определяется свойством DataSetCount. Эти свойства можно использовать, чтобы управлять всеми подсоединенными компонентами наборов данных. Соединение с помощью компонента ADOConnection. Управление транзакциями. Следующий код: var i: integer; begin for i:=0 to (ADOConnection1.DataSetCout-1) do ADOConnection1.DataSets[i].Active:=true; end; Обеспечивает активизацию соединения с БД всех компонентов наборов данных. Свойство ConnectOptions компонента ADOConnection позволяет выбрать синхронный (при coConnectUnspecified) или асинхронный (при coAsyncConnect) режим соединения. Обычно используется синхронный режим. Асинхронный можно использовать для серверов с малым быстродействием. Свойство CursorLocation определяет, какую библиотеку использует курсор при соединении с БД: клиентскую или серверную. Значение clUserClient (по умолчанию) обеспечивает максимальную гибкость. Все данные располагаются на компьютере-клиенте и тут же обрабатываются. При этом возможны операции сортировки и другие, которые могут не поддерживаться сервером. Запросы SQL в этом случае обрабатываются на сервере и на компьютер клиента передаются уже обработанные данные, соответствующие условию WHERE запроса SQL. Соединение с помощью компонента ADOConnection. Управление транзакциями. Значение свойства CursorLocation, равное clUseServer, желательно использовать в командах, возвращающих большой набор данных. В подобных случаях использование клиентского курсора может потребовать недопустимых затрат дискового пространства клиента. Свойство ConnectionTimeout устанавливает время, отводимое для установления соединения (в секундах, по умолчанию 15 секунд). Свойство Mode определяет режимы, доступные после соединения: cmUnknown (режим ещё не установлен); cmRead (режим «только для чтения»); cmWrite (режим «только для записи»); cmReadWrite (режим чтения и записи); cmShareDenyRead (другие приложения не могут открывать соединение для чтения); cmShareDenyWrite (другие соединения не могут открывать соединение для записи); cmShareExclusive (другие приложения не могут открывать соединение); cmShareDenyNone (другие приложения могут открывать соединение в любом режиме). Соединение с помощью компонента ADOConnection. Управление транзакциями. Свойство только для чтения State позволяет узнать текущее состояние соединения: stClosed (объект соединения не активен и не соединен с БД); stOpen (объект соединения не активен, но соединен с БД); stConnecting (объект соединения в процессе установления соединения с БД); stExecuting (объект соединения выполняет работу с БД); stFetching (объект соединения извлекает данные из БД). Рассмотрим управление транзакциями. Транзакция начинается методом BeginTrans, который возвращает целое число, показывающего уровень вложенности данной транзакции. Успешное выполнение BeginTrans приводит к генерации события OnBeginTransComplete и установки InTransactionTRUE. По значению этого свойства можно определить, находится ли компонент в состоянии формирования транзакции. А обработчик события OnBeginTransComplete можно использовать для выполнения некоторых действий перед началом транзакции. Метод CommitTrans завершает транзакцию и сохраняет ее результаты в базе данных. При успешном выполнении CommitTrans генерируется событие OnCommitTransComplete и свойство InTransactionTRUE. Соединение с помощью компонента ADOConnection. Управление транзакциями. Свойство Attributes описывает, как при соединении обрабатываются транзакции, оставшиеся незавершенными. Свойство является множеством, которое может быть пустым или содержать одно или два значения: xaCommitRetaining и xaAbortRetaining. Значение xaCommitRetaining приводит к тому, что при соединении незавершенные транзакции закрываются (срабатывает метод CommitTrans). Завершение транзакции автоматически означает начало новой транзакции. Значение xaAbortRetaining приводит к тому, что при соединении незавершенные транзакции отменяются (метод RollbackTrans). Отмена транзакции автоматически вызывает начало новой транзакции. Соединение с помощью компонента ADOConnection. Управление транзакциями. Свойство IsolationLevel устанавливает уровень изоляции транзакции. Основные уровни: ilUncommitted, ilBrowse (видимы незафиксированные изменения, сделанные другими транзакциями); ilCommitted, ilCursorStability (видимы только зафиксированные изменения, сделанные другими транзакциями); ilRepeatableRead (изменения, сделанные другими транзакциями, не видны, но повторный запрос может выдать новые данные); ilSizable, ilIsolated (полная изоляция от других транзакций). Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Рассмотрим ADOTable. Этот компонент может использоваться в приложении вместо компонента Table, выполняющего аналогичные функции. Он вступает в контакт с указанной таблицей БД. БД задается свойствами ConnectionString и Connection, как описано в п.2. Для управления таблицей в приложение вводятся помимо компонента ADOTable. Далее к этому источнику данных DataSource подключаются любые компоненты отображения данных. Имя таблицы задается свойством TableName. Все провайдеры поддерживают непосредственный доступ к таблице по ее имени. Какой вариант доступа: прямой или через оператор SELECT будет использоваться – определяется свойством TableDirect. По умолчанию TableDirect=FALSE, что означает автоматическое создание компонентом ADOTable соответствующего оператора SELECT. Соединение с БД осуществляется так же, как и в компонентах BDE методом Open или установкой ActiveTRUE. Но при этом, если связь с БД осуществляется через ADOConnection, необходимо учитывать взаимосвязь свойства Active компонента ADOTable и свойства Connected компонента ADOConnection. Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. В компоненте ADOTable имеются два свойства, характеризующие курсор, используемый при навигации по таблице: CursorLocation и CursorType. CursorType может принимать следующие значения: ctUnspecified (тип курсора неопределен); ctOpenForwardOnly (курсор может перемещаться по таблице только вперед; этот тип курсора повышает производительность приложения); ctKeySet (записи, добавляемые другими пользователями невидимы, а записи, добавленные другими пользователями, недоступны); ctDynamic (обеспечивается видимость всех изменений, сделанных другими пользователями: модификаций, удалений, вставок; курсор может перемещаться по таблице вперед и назад); ctStatic (обеспечение конкретных записей; изменение данных, сделанные другими пользователями, невидимы). Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Свойство MarshalOptions определяет, какие именно записи возвращаются на сервер, если при работе используется клиентский курсор. При MarshalOptions=moMarshalAll (по умолчанию) на сервер возвращаются все записи, считанные в локальный набор записей клиента. При MarshalOptions=moMarshalModifiedOnly на сервер возвращаются только измененные записи. Свойство CacheSize указывает, сколько записей заносится в локальный буфер оперативной памяти. По умолчанию CacheSize=1. Если CacheSize=10, то при открытии БД в буфер загрузятся первые десять записей. Пока работа идет с этими записями, все операции будут проводиться в оперативной памяти, без обращения к БД. Если указатель таблицы вышел за пределы 10, то в память загрузятся следующие десять записей и т.д. Буферизация записей повышает эффективность работы. Основные способы работы с ADOTable те же самые, что и способы работы с Table. Двойной щелчок на компоненте вызывает Редактор Полей. Но в ADO не возможно работать со словарями, так что в каждом компоненте свойства полей необходимо задавать вручную. Кроме того, не все драйверы ADO могут работать с произвольными типами полей. Например, драйвер Paradox ADO не работает с полями изображений. Так что в таблице T1 не будет доступно поле F8 (фотография). Для драйвера InterBase такого ограничения нет. Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Из Редактора Полей можно мышью перетаскивать поля на форму. Причем на форме автоматически будут создаваться соответствующие компоненты отображения данных. Программный доступ к полям осуществляется так же, как и в компоненте Table: по индексу через свойство Fields[i: integer], по имени поля при помощи метода FieldByName(`<имя>`), по имени объекта поля. Ограничения на вводимые значения в ADOTable можно обеспечить на уровне полей. Свойства, аналогичного Constraints (в компоненте Table), в ADOTable не существует. Связь друг с другом компонента ADOTable, работающих с главной и вспомогательной таблицей осуществляется так же, как в Table (с помощью свойств MasterSource и MasterFields). Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Упорядочивание отображаемых записей производится установкой свойства IndexFieldNames. В этом свойстве можно задавать любое сочетание имен полей, по которым необходимо упорядочить отображение, разделяя их «;». Например, строка «F2» упорядочит записи в таблице T1 по значению поля F2. А строка «F2;F3;F4;F5» упорядочит записи по значению поля F2 – отделам, а внутри каждого отдела – по фамилии, имени и отчеству сотрудников. В отличие от свойства IndexFieldNames компонентов BDE, в компонентах ADO можно задавать любое сочетание полей, независимо от того, была ли индексирована таблица при ее создании по этим полям. В этом проявляется дополнительная гибкость компонентов ADO. Но в этих компонентах не работает свойство IndexName, позволяющее использовать индексы, сформированные при создании таблицы. Свойство только для чтения IndexFieldCount позволяет определить число полей, использованное при индексации. Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Фильтрация отображаемых данных может осуществляться так же, как и в компоненте BDE (с помощью свойства Filter). В компонентах ADO (в отличие от компонентов BDE) в строке Filter имена полей обязательно должны отделяться пробелами от операций отношения. Также пробелами должны окружаться логические операции «and» и «or». Например: в BDE: (F6<=1960) and (F6>=1940), в ADO: (F6 <= 1960) and (F6 >= 1940). Свойство Filter работает, если свойство Filtered=TRUE. Для фильтрации можно также использовать обработчик событий OnFilterRecord. Эти события наступают каждый раз при смене активной записи, если свойство Filtered=TRUE. В обработчике этих событий возможно анализировать любые поля записи и возвращать значение Accept=TRUE, если поля записи удовлетворяют сформулированным Вами условиям, и Accept=FALSE в противном случае. При использовании OnFilterRecord необходимо следить, чтобы строка свойства Filter не противоречила условиям в OnFilterRecord. Нельзя также изменить индексацию (IndexFieldNames) пока Filtered=TRUE, т.к. это может привести к зацикливанию программы. Перед сменой индексации FilteredFALSE, затем изменить IndexFieldNames и FilteredTRUE. Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Дополнительные возможности фильтрации обеспечиваются свойством FilterGroup. Этот параметр позволяет фильтровать записи, которые были изменены, или должны быть изменены или удалены. Это свойство может принимать следующие значения: fgUnassigned (не оказывать влияние на фильтрацию: по умолчанию); fgNone (отменяет текущую фильтрацию и делает видимыми все записи); fgPendingRecords (отфильтровываются записи, которые были изменены, но ещё не занесены в таблицу методом UpDateBatch или прерваны методом CancelBatch); fgAffectedRecords (отфильтровываются последние измененные записи); fgFetchedRecords (отфильтровываются записи, измененные при последней очистке кэша); fgPredicate (отфильтровываются только что удаленные записи); fgConflictingRecords (отфильтровываются записи, которые должны быть изменены, но это не получилось из-за ошибок). Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Методы, используемые при программировании работы с БД в ADOTable в основном те же, что и в Table. Навигация по таблице осуществляется методами First, Next, Last и Prior. При редактировании данных используются методы, рассмотренные ранее для Table (Insert, Edit, Post и др.). Из методов поиска в ADO реализуются только методы Locate или Lookup. В BDE нет метода сохранения набора данных в файле и чтения его из файла. В ADO сохранение в файле осуществляется методом SaveToFile: procedure SaveToFile(const FileName: String = ‘’; Format: TPersistFormat = pfADTG); Параметр FileName – имя файла; Format (необязательный) – формат файла (может принимать два значения: pfADTG – формат ADTG – Advanced Data Tablegram или pfXML – формат XML для ADO 2.1 и выше). Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. По умолчанию значение Format = pfADTG. Сохранение набора данных в файле может быть осуществлено следующим оператором: ADOTable1.SaveToFile(‘Test.adt’); Чтение данных из файла осуществляется процедурой LoadFromFile: procedure LoadFromFile(const FileName: WideString); FileName – имя файла. Загружать файл в набор данных можно также при закрытом соединении с БД. В момент загрузки соединение автоматически откроется. Методы SaveToFile и LoadToFile удобно использовать для получения типовой картины в определенный момент времени. Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Рассмотрим компонент ADOQuery, являющийся аналогом компонента Query (BDE). Этот компонент используется для составления произвольных запросов SQL. Его основное свойство SQL содержит запрос и методы выполнения запроса. Соединение с БД, свойства и методы фильтрации и поиска аналогичны ADOTable. Отличие от компонента Query заключается в методике работы с параметрами при динамических запросах. Если в запросе SQL указаны параметры, то в компоненте Query объекты, соответствующие этим параметрам, расположены в свойстве Params типа TParams. Это массив параметров, доступ к значениям отдельных параметров во время выполнения может осуществляться или по индексу, или по имени при помощи метода ParamByName. В компоненте ADOQuery объекты, соответствующие параметрам, указанным в свойстве SQL, расположены в свойстве Parameters типа TParameters. Это тоже массив параметров, но его свойства и методы отличаются от свойств и методов TParams. Доступ к отдельным параметрам во время выполнения может осуществляться по имени при помощи метода ParamByName, который является методом свойства Parameters компонента ADOQuery. Значение параметра определяется методом Value. Доступ к параметрам может осуществляться методами FindParam, GetParamList и ParamValues свойства Parameters, которые являются аналогами методов свойства Params в Query. Пример: ADOQuery1.Parameters[0].Value:=Edit1.Text; ADOQuery1.Parameters.ParamByName(‘EF2’).Value:=Edit1.Text; ADOQuery1.Parameters.ParamValues[‘EF2’]:=Edit1.Text; Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. В компоненте ADOQuery предусмотрена возможность вводить параметры во время проектирования. Для этого необходимо нажать кнопку с многоточием около свойства Parameters в окне Object Inspector, затем в появившемся окне редактирования параметров щелкнуть правой кнопкой мыши и выбрать в контекстном меню раздел `Add`. Компонент ADOStoredProc является аналогом компонента StoredProc, используемого при работе с BDE. Этот компонент используется для выполнения хранимых на сервере процедур. В целом он работает как его аналог StoredProc. Свойство, в котором задается имя выполняемой процедуры – ProcedureName (StoredProcName в StoredProc). После задания имени процедуры, в свойстве Parameters появятся входные параметры процедуры. Выходные параметры представлены объектами полей компонента ADOStoredProc. Их можно увидеть и изменить их свойства, если сделать двойной щелчок на компоненте ADOStoredProc, в появившемся Редакторе Полей сделать щелчок правой кнопкой мыши и выбрать раздел «Add all fields». В окне появятся поля, соответствующие всем выходным параметрам процедуры. Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. При работе с хранимыми процедурами сначала необходимо задать значения входных параметров, а затем выполнить вызов процедуры оператором вида: ADOStoredProc1.ExecProc; а к возвращенным параметрам обращаться как объектам полей компонента ADOStoredProc. Компонент ADODataSet может выполнять функции компонентов ADOTable, ADOQuery, ADOStoredProc. Режим работы ADODataSet определяется параметрами: CommandType и CommandText. Параметр CommandType может принимать следующие значения: cmdUnknown (неизвестный тип команды в свойстве CommandText); cmdText (в свойстве CommandText указан текст команды SQL или вызов хранимой процедуры); cmdTable (в свойстве CommandText указано имя таблицы); cmdStoredProc (в свойстве CommandText указано имя хранимой процедуры); cmdFile (в CommandText указано имя файла, в котором сохраняем набор данных); cmdTableDirect (в CommandText указано имя таблицы; возвращаются все поля таблицы). Компоненты наборов данных: ADOTable, ADOQuery, ADOStoredProc, ADODataSet. Таким образом, при значениях cmdTable или cmdTableDirect компонент работает как ADOTable, при значении cmdText – как ADOQuery (при запросе SELECT), при значении cmdStoredProc – как ADOStoredProc. При значении cmdFile компонент работает как ADOTable, беря значения данных из файла, в котором они ранее были сохранены методом SaveToFile. Значение cmdUnknown может быть использовано только как временное. При соединении с БД оно должно быть изменено. После установки значения свойства CommandType в свойстве CommandText автоматически устанавливается выпадающий список, соответствующий значению CommandType. Например, при значениях cmdTable или cmdTableDirect в свойстве CommandText появится список хранимых процедур. При значении cmdText в свойстве CommandText появится кнопка с многоточием. Ее нажатие вызовет диалог открытия файла. В режиме cmdText компонент может выполнять только оператор SELECT. Для других операторов необходимо использовать компонент ADOQuery или ADOCommand. Выполнение команд компонентов ADOConnection и ADOCommand. ADOCommand инкапсулирует командный объект ADO. Он предназначен для выполнения любых команд, в основном для создания и реорганизации наборов данных. Основными свойствами ADOCommand являются свойства CommandType и CommandText. В основном используется CommandType = cmdText, а в свойстве CommandText имеется выполненная команда. Выполнение команды осуществляется методом Execute. Например: ADODataSet1.RecordSet:=ADOCommand1.Execute; Выполнение команд компонентов ADOConnection и ADOCommand. Свойство ExecuteOptions является множеством опций, определяющим характеристики выполненной команды: eoAsyncExecute (асинхронное выполнение команды); eoAsyncFetch (асинхронный выбор строк, оставшихся после числа строк, указанного в свойстве Cache); eoAsyncFetchNonBlocking (выполнение происходит без блокировки); eoExecuteNoRecords (команда или выполняемая процедура, выполняющиеся без возвращения результата). Компонент ADOCommand часто соединяется с данными через компонент ADOConnection, имя которого задается в свойстве Connection. В этом случае в ADOConnection можно получать доступ к объектам ADOCommand через свойство Commands. Это – массив командных объектов. Их количество определяется свойством CommandCount. Пример: var i: integer; begin for i:=0 to (ADOConnection1.CommandCount-1) do ADOConnection1.Commands[i].Execute; end;