В РАЗРАБОТКЕ!
Alibek Bolatov
alibek@mail.ru
В данной статье рассматриваются такие методы доступа к данным, как DAO и ADO, проводится их сравнительный анализ, приводится справочная информация и примеры использования, а так же некоторые рекомендации.
1. Предисловие
2. DAO < объектная модель | использование | советы | RDO >
3. ADO < объектная модель | Connection | Recordset | Command | другие объекты | использование | советы >
4. Сравнение
5. Отличия
Основу статьи представляют собой материалы MSDN, использовался MSDN за январь 2001 г., перевод осуществлял я.
DAO (Data Access Objects) является первым объектно-ориентированным интерфейсом, который работал с Microsoft Jet (используемым Microsoft Access) и позволял программисту подключаться напрямую к таблицам Access (или к остальным БД через ODBC). DAO считается наиболее удобным средством для однопользовательских систем и небольших разработок.
Последней поддерживаемой версия DAO является версия 3.6, в которой добавлена (по сравнению с версией 3.5x) поддержка Unicode и поддержка провайдера Jet версии 4 (и, соответственно, поддержка формата Access XP).
DAO поддерживает два различных окружения БД (или рабочих пространства, workspaces); Microsoft Jet и ODBCDirect.
Рабочее пространство Microsoft Jet позволяет вам получить доступ к базам данных Microsoft Jet (используемым Microsoft Access), к источникам данных ODBC, которые позволяют подключаться через Microsoft Jet, а также к установленным источникам данных ISAM всех остальных форматов, например Paradox или Lotus 1-2-3. Ядро Microsoft Jet позволяет использовать базы данных MDB или прочие настольные БД ISAM и предоставляет такие возможности, как объединение данных из различных форматов БД.
Рабочее пространство ODBCDirect позволяет вам получить доступ к СУБД через ODBC без загрузки и использования ядра Microsoft Jet. ODBCDirect предоставляет возможность выполнять запросы или хранимые процедуры на сервере, а так же использовать специфические возможности ODBC, такие как пакетное обновление и асинхронное исполнение запросов.
Объектная модель DAO
Объектная модель DAO зависит от используемого рабочего пространства; различия касаются в основном возможности управлять пользователями и метаинформации (структуры БД) в Jet. Обе схемы изображены на рисунках ниже; голубым цветом отмечены объекты, желтым показаны коллекции. В данной главе будут рассмотрены лишь наиболее часто используемые объекты.
Объектная модель DAO (Microsoft Jet)
Объектная модель DAO (ODBCDirect)
Корневым объектом в DAO является ядро DAO DBEngine. В нем содержится две коллекции; Errors (коллекция ошибок) и Workspaces (рабочие пространства).
Любые операции, связанные с объектами DAO, могут вызвать одну или несколько ошибок. В случае возникновения ошибок они помещаются в коллекцию Errors. Ошибки поступают по мере возникновения, т.е. самая последняя ошибка является последним элементом коллекции; она же соответствует объекту Err в VBA. Коллекция Errors не содержит методов Append и Delete, поэтому ошибки не могут быть добавлены в коллекцию иным способом.
Каждый элемент Error коллекции Errors описывает одну ошибку. К примеру, если при открытии набора данных (Recordset) через ODBC произошла ошибка, в коллекции Errors может находится несколько ошибок, сгенерированных различными слоями ODBC; первая ошибка будет соответствовать самой нижнеуровневой ошибке ODBC.
Коллекция Workspaces содержит активные и нескрытые объекты Workspace -- рабочее пространство DAO. Объект Workspace позволяет вам управлять сессией текущего соединения (управлять группами, пользователями, базами данных и подключениями).
Когда вы впервые используете объект Workspace, вы автоматически создаете "окружение по умолчанию" (default workspace), которое является DBEngine.Workspaces(0). Это рабочее пространство имеет параметры Name и UserName равными "#Default Workspace#" и "Admin" соответственно.
Объект Workspace определяет именованную сессию пользователя. Он содержит открытые базы данных, предоставляет механизмы для проведения транзакций, а также методы для управления базами данных, пользователями и группами.
Чаще всего разрабатывается приложение, работающее только с одной БД в один момент времени. И как следствие, чаще всего используют объект Database коллекции Databases (входящей в текущий Workspace). Для работы с базой данных у объекта есть методы CreateDatabase и OpenDatabase (соответственно, создание БД и открытие БД). Синтаксис этих операторов:
Set database = workspace.CreateDatabase (dbname, locale, options) Set database = workspace.OpenDatabase (dbname, options, read-only, connect)
Здесь database -- объектная переменная, представляющая объект Database, workspace -- объектная переменная, представляющая существующий Workspace, в котором размещается БД, если workspace не указан, то функция создаст рабочее пространство по умолчанию.
Синтаксис остальных операторов различается в зависимости от типа БД и от используемого рабочего пространства. В случае Jet и БД Access (mdb) это путь и имя БД, в других случаях строка, зависящая от источника данных. Остальные аргументы определяют параметры открываемой/создаваемой БД и указывают флаги, с которыми открывается БД. Аргумент connect передает различную информацию, необходимую при подключении, например, пароль БД.
Кроме того, у объекта Workspace есть такие важные методы, как BeginTrans, CommitTrans, и Rollback, позволяющие начать транзакцию, завершить транзакцию и откатить транзакцию соответственно.
Объект Database является основным, с которым работает разработчик. Он содержит ряд объектов (коллекций), методов и свойств. Коллекции, из которых состоит Database, это: TableDefs, Containers, QueryDefs, Recordsets и Relations. Коллекция Relations определяет отношения между объектами БД (внешние ключи и связи таблиц), TableDefs является коллекцией описаний таблиц, хранящихся в БД или связанных с ней, а QueryDefs -- коллекцией описаний сохраненных запросов, хранящихся в БД (для Jet) либо временных запросов (ODBCDirect). Коллекция Recordsets возвращает все открытые наборы данных в Database (Jet) или Connection (ODBCDirect). Эта коллекция состоит из объектов Recordset, которые автоматически добавляются в коллекцию, когда вы создаете набор данных каким-либо способом, и удаляются, когда вы закрываете набор данных. Коллекция Containers содержит контейнеры, в которых может храниться сохраненная база данных, таблица или запрос.
Наиболее используемыми методами объекта Database являются следующие: Execute для выполнения запросов; Connect для установления соединения с источником данных ODBC; QueryTimeout для установки величины таймаута при выполнении запросов; RecordsAffected для получения количества записей, к которым был применен запрос; OpenRecordset для выполнения запроса с целью возвратить набор данных; Version, позволяющий узнать версию ядра БД. Кроме того, при использовании Jet есть методы, позволяющие создать новую таблицу, новое свойство, новый запрос, новую связь. Также имеются методы, позволяющие создавать и синхронизировать реплики БД.
Если БД содержит связи с внешними источниками данных, то при открытии БД связь с внешним источником данных не устанавливается автоматически. Для этого надо сослаться на объект TableDef или открыть набор данных.
Объект TableDef является объектом, который содержит описание таблицы или внешней связанной таблицы (только в рабочем пространстве Jet). Этот объект позволяет манипулировать структурой таблицы - изменять поля (коллекция Fields) и индексы (коллекция Indexes). Кроме того, объект содержит метод OpenRecordset, позволяющий открыть указанную таблицу как источник данных.
Объект QueryDef похож на TableDef, но он представляет собой описание сохраненного (в Jet) или временного (в ODBCDirect) запроса и содержит не поля и индексы, а выводимые поля (коллекция Fields) и параметры, передаваемые запросу (коллекция Parameters).
Коллекция Recordsets позволяет использовать любые открытые наборы данных, но обычно наборы данных используются не таким образом, а открываются методом OpenRecordset.
Объекты TableDef, QueryDef, Recordset содержат коллекцию Fields, которая состоит из полей, в которых хранятся данные. Объект Field имеет ряд свойств, определяющих характер информации, которая хранится в поле, а также характер и тип самого поля. Набор данных (Recordset) состоит из набора строк с перечисленными полями.
Основные свойства объекта Field. OrdinalPosition -- возвращает или устанавливает порядок отображения объектов Field в коллекции Fields (порядковый номер поля); в рабочем пространстве ODBCDirect это свойство не модифицируется. Свойство Value возвращает хранимые в поле данные (в случае, когда поле является частью коллекции Fields набора данных). Методы AppengChunk и GetChunk в сочетании со свойством FieldSize позволяют работать с такими типами данных, как OLEObject и Memo. Свойства Type, Size и Attributes определяют тип данных, которые хранятся в поле.
В объекте QueryDef есть так же коллекция Parameters, которая используется при выполнении параметрических запросов (запросов, имеющих параметры).
Также следует отдельно отменить коллекцию Indexes и ее элементы Index. Индексы позволяют значительно (на порядок, а то и на несколько порядков) повысить эффективность поиска и сортировки данных в БД. Индекс может иметь свойство Primary (основной), Unique (уникальный) и Required (обязательный). Primary означает, что индекс является основным; обычно это индекс для ключевого поля. Основной индекс обязательно должен быть уникальным. В таблице может быть только один основной индекс. Уникальный индекс означает, что все его записи (значения полей, из которых состоит индекс) уникальны и не повторяются. Обязательность (Required) индекса означает, что среди записей индекса не может быть пустых (null) полей.
Использование DAO
Будет рассмотрен пример простого приложения, работающего с базой данных Access (mdb-файл). Сама база данных (файл sample.mdb) лежит здесь (или здесь, в виде архива). Используется формат Access 2000.
БД имеет следующую структуру:
Схема данных БД
Суффикс ID соответствует ключевым полям, FK указывает на внешний ключ. БД имеет четыре таблицы, Customers (покупатели), Addresses (адреса), Goods (товары) и Orders (заказы). Программа должна уметь вести справочник товаров, управлять покупателями и формировать заказы.
Программа будет иметь три формы; одна будет предназначена для работы со справочником товаров, другая позволяет управлять покупателями (редактировать данные покупателя и его адрес), а третья управляет формированием заказов. Кроме того, в проекте будет модуль, в который будут вынесены константы и переменные, а так же некоторые методы и функции.
В глобальном модуле имеет смысл создать объектную переменную db As DAO.Database и создать пару подпрограмм, OpenDB и CloseDB, которые будут соответственно открывать и закрывать подключение к БД. В формах будут определены объектные переменные для набора данных (например, rsGoods As DAO.Recordset), а в событиях Form_Load и Form_Unload будет происходить создание и закрытие набора данных.
В ряде случаев бывают очень удобны параметрические запросы, т.е. запросы, в которые передается один или несколько параметров. Например, необходимо предоставить пользователю возможность видеть не всю таблицу GOODS, а только те товары, которые имеют тип "Предметы роскоши". Строка запроса будет выглядеть так:
SELECT * FROM GOODS WHERE [TYPE] = 'Предметы роскоши';
Этот код отобразит только те товары, которые являются предметами роскоши. Но если потребуется отобразить товары с типом "Холодное оружие", то придется писать новый запрос. Чтобы этого не делать, можно использовать параметрический запрос, где тип товара определяется параметром, например так:
PARAMETERS [Тип товара] Text ( 40 ); SELECT * FROM GOODS WHERE [Type]=[Тип товара];
Для того, чтобы передать в запрос параметры, нужно использовать объект DAO.QueryDef. Пример использования параметрического запроса:
'db - база данных 'rsGoods - набор данных из таблицы GOODS 'strType - тип товара, который нужно вернуть в набор данных Dim qdfGoods As DAO.QueryDef Set qdfGoods = db.QueryDefs("GoodsType") qdfGoods.Parameters("Тип товара") = strType Set rsGoods = qdfGoods.OpenRecordset ... Set qdf = Nothing
Объект Recordset является ключевым в БД. В DAO используется пять типов Recordset.
Table-type Recordset -- набор данных отображает базовую таблицу в БД, в которой вы можете добавлять, изменять, удалять данные. Применим только в рабочем пространстве Jet. К плюсам этого типа следует отнести невысокую ресурсоемкость, большую функциональность и возможность бинарного поиска в индексированных полях (свойство .Index для выбора текущего индекса и метод .Seek для поиска). Данные отображаются в порядке ввода (если таблица не имеет индекса или индекс не выбран) и отсортированными по индексу (если индекс выбран). Точного аналога в ODBC не имеет.
Dynaset-type Recordset -- наиболее функциональный набор данных. Является результатом запроса и содержит обновляемые записи. Возвращается динамический набор данных, в котором можно удалять, изменять и добавлять записи из таблицы или таблиц. Этот тип набора данных может содержать данные из одной или нескольких таблиц, он соответствует типу курсора ODBC keyset cursor.
Snapshot-type Recordset -- статическая копия набора данных, которая обычно используется для поиска или формирования отчетов. Может содержать данные из нескольких таблиц, но не допускает обновления. Этот тип набора данных соответствует типу курсора ODBC static cursor.
Forward-only-type Recordset -- соответствует типу Snapshot, но не имеет курсора. Позволяет только листать записи вперед (т.е. нет возможности применять методы .Move*). Позволяет увеличить производительность, т.к. это наименее ресурсоемкий тип набора данных. Этот тип набора данных соответствует типу курсора ODBC forward-only cursor.
Dynamic-type Recordset -- этот набор данных возвращает результат выполнения запроса и позволяет удалять, изменять и добавлять данные в результат запроса (а не в исходные таблицы, в отличии от Dynaset). Этот тип набора данных соответствует типу курсора ODBC dynamic cursor. Этот тип набора данных применим только в рабочем пространстве ODBCDirect.
Типы наборов данных Dynaset-, snapshot-, и forward-only–type сохраняются в локальной памяти клиента; если памяти недостаточно, то данные сохраняются на диске. Если места на диске недостаточно, то будет сгенерирована ошибка.
Если вы создаете набор данных в рабочем пространстве Jet и не указываете его тип, то ядро DAO пытается создать наиболее функциональный набор данных, начиная с Table-type. Если это не удается, то проводится попытка создать dynaset, snapshot и наконец, forward-only. В рабочем пространстве ODBCDirect идет ориентация не на функциональность, а на скорость, поэтому тут порядок выбора типа набора данных таков: forward-only, snapshot, dynaset, dynamic. Когда создается набор данных, он позиционируется на первую запись (если есть данные), в противном случае RecordCount=0 и устанавливаются свойства BOF и EOF. Для поиска используется метод Seek (для table-type) и Find (для snapshot и dynaset).
Обычно для работы с БД достаточно определить объектную переменную db As DAO.Database. Но если вы хотите использовать транзакции, то в этом случае не обойтись без объявления Workspace (рабочего пространства). Вот небольшой пример декларации и подключения к БД:
Dim objWorkspace As DAO.Workspace Dim objDatabase As DAO.Database Dim objRecordset As DAO.Recordset ... Set objWorkspace = DBEngine.Workspaces(0) Set objDatabase = objWorkspace.OpenDatabase(...) Set objRecordset = objDatabase.OpenRecordset(...) ... objWorkspace.BeginTrans With objRecordset Do Until .EOF .Edit .Fields("field1") = "test" .Update .MoveNext Loop End With objWorkspace.CommitTrans
Не рекомендуется использовать транзакции без необходимости, т.к. они требуют значительных ресурсов. Кроме того, в многопользовательской системе необходимо в этом случае учитывать влияние транзакций, выполняемых другими пользователями.
Полезные советы
Набор данных (Recordset) содержит ряд свойств, методов и коллекций. Коллекцией по умолчанию является коллекция Fields, которая содержит поля набора данных. Эта коллекция содержит набор именованных объектов Field, который имеет свойством по умолчанию Value. Благодаря этому, вместо конструкции:
numClientID = Recordset.Fields("ID").Value strClientName = Recordset.Fields("Client Name").Value
можно использовать конструкцию:
numClientID = Recordset!ID strClientName = Recordset![Client Name]
что читается намного проще (квадратные скобки нужны в тех случаях, когда идентификатор содержит в своем имени пробелы и специальные символы).
Если вам нужен точный поиск, то следует использовать метод Seek. Он применим только в рабочем пространстве Jet и только к набору данных типа Table, кроме того поиск осуществляется только по индексированным полям, но зато при выполнении этих условий поиск осуществляется очень быстро. Если говорить о той БД, которая рассматривается в этой главе, то можно показать использование этого метода на примере таблицы ADDRESSES. Эта таблица состоит из четырех полей, AddressID, City, Street и Address, и содержит четыре индекса (ключевой индекс PrimaryKey для ключевого поля AddressID, индекс City для поля City, индекс Street для поля Street и составной индекс Address для полей City, Street, Address).
'db - база данных Dim rsAddress As Recordset Set rsAddress = db.OpenRecordset("ADDRESS", dbOpenTable) rsAddress.Index = "Address" rsAddress.Seek "=", "г. Москва", "ул. Ленина", "д. 1" If rsAddress.NoMatch Then MsgBox "Не найден!" Else MsgBox "Найден!" End If rsAddress.Close Set rsAddress = Nothing
Другой пользой от использования индексов может служить то, что при выборе индекса данные в Recordset сортируются по полям, входящим в индекс. Т.е. в приведенном примере после строки rsAddress.Index = "Address" записи будут отсортированы по полному адресу.
К сожалению, есть один баг (уж не знаю, он локальный только у меня, или это баг DAO), связанный с составными индексами. Для составного индекса, если в нем имеются текстовые поля, не всегда выполняются правила сортировки.
RDO - краткий обзор
RDO также, как DAO или ADO, является технологией доступа к данным. RDO расшифровывается как Remote Data Object. Технология была внедрена в VB4 для разработчиков клиент-серверных приложений доступа к данным, в основном для баз данных SQL Server и Oracle. RDO является COM-надстройкой над ODBC, упрощающей работу с низкоуровневым интерфейсом ODBC API. RDO является промежуточным слоем между ODBC API и конечной программой.
В настоящее время RDO практически не используется, т.к. ADO обеспечивает более эффективный и удобный доступ к данным. В статье будут рассмотрены лишь отличия между RDO и другими технологиями для того, чтобы упростить перенос программы с RDO на другую технологию.
Корневым объектов в RDO является rdoEngine. Он содержит коллекцию rdoEnvironments и rdoErrors. Последняя является коллекцией ошибок, а первая содержит коллекцию подключений (rdoConnections), каждый элемент которой содержит коллекции таблиц (rdoTables), запросов (rdoQueries) и наборов данных (rdoRecordsets).
RDO является переходным между DAO и ADO, поэтому часть концепций наследуется от DAO, а часть концепций перешла впоследствии в ADO. Функционально, RDO ближе к DAO (если не учитывать синтаксических отличий), но объекта Database в RDO нет принципиально, вместо него есть объект Connection, в котором можно создавать новые наборы данных и запросы.
В настоящее время для доступа к данным обычно используется ADO или ADO.NET. В этой статье будет рассмотрена первая.
ADO (ActiveX Data Objects) -- объектно-ориентированная технология доступа к данным. ADO позволяет клиентским приложениям работать с сервером баз данных через единый интерфейс, предоставляемый провайдером. ADO состоит из трех основных элементов: ADO, ADO MD и ADOX.
Непосредственно ADO (в которое входит RDS, Remote Data Service, служба работы с удаленными данными) предоставляет основные функции для работы с данными. В ADO входит все необходимое для создания приложений типа клиент-сервер и web-приложений. RDS, которая входит в состав ADO, позволяет перемещать данные с сервера на клиентское приложение, обрабатывать их и возвращать результат на сервер.
ActiveX Data Objects Multidimensional (ADO MD) предоставляет легкий и удобный доступ для многомерного представления данных в языках высокого уровня. ADO MD расширяет функциональность ADO, включая в него объекты многомерных данных, такие как объекты CubeDef и Cellset. Подобно ADO, в ADO MD используется предоставляемый провайдером доступ к данных, причем провайдер должен являться провайдером многомерных данных (MDP) в отличии от обычных провайдеров (TDP), предоставляющих информацию в табличном виде.
Расширение ADO Extensions for Data Defination Language and Security (ADOX) расширяет возможности ADO до манипулированию схемой данных и управлением безопасностью данных. ADOX позволяет работать с такими элементами, как таблицы и процедуры, управлять группами и пользователями, а также доступом пользователей к объектам.
Есть три основных компонента для доступа к данным. OLE DB является низкоуровневым и высокопроизводительным интерфейсом к различным источникам данных. ADO является высокоуровневой объектной оболочкой к OLE DB. И наконец, ODBC является альтернативным низкоуровневым и высокопроизводительным интерфейсом для работы с реляционными источниками данных.
ADO является посредником между клиентским приложением и низкоуровневым интерфейсом OLE DB и позволяет разработчику абстрагироваться от специфики источника данных и провайдера.
Объектная модель DAO
В ADO используется другая объектная модель по сравнению с DAO. Модель не имеет ярко выраженного корневого элемента и содержит три основных семейства: Connection, Command, Recordset. Кроме того, существует объект Record, который представляет собой запись из набора данных Recordset, и объект Stream, представляющий собой поток данных (бинарных или текстовых).
Объектная модель ADO, версия 2.6
Краткое описание объектов ADO.
Connection -- объект, представляющий уникальную сессию с источником данных. Для приложений типа "клиент-сервер" может быть эквивалентен актуальному соединению с сервером. В зависимости от функциональности провайдера некоторые методы, свойства и коллекции могут быть недоступны.
Command -- используется для определения и выполнения указанных команд (например, SQL-запросов), выполняемых с источником данных.
Recordset -- объект, представляющий набор данных (записей) из таблицы с данными или результата выполнения команды. Все объекты Recordset содержат записи (строки) и поля (столбцы).
Record -- объект похож на Recordset, но содержит только одну запись. Запись может быть записью набора данных или другим типом объекта (файлом, папкой), в зависимости от провайдера.
Stream -- специальный объект, представляющий поток тектовых или бинарных данных. Например, XML-документ может загружаться в поток из командной строки или возвращаться, как результат запроса. Или с помощью этого объекта можно возвращать изображения, хранящиеся в базе данных (для web-приложений). Объект Stream может использоваться для управления полями или записями, содержащими потоки данных.
Parameter -- объект, представляющий собой параметр или аргумент, ассоциированный с объектом Command, основанном на параметрическом запросе или хранимой процедуре.
Field -- объект, представляющий столбец данных. Каждый объект Field соответствует столбцу в наборе данных Recordset.
Property -- характеристика объекта (свойство) ADO, определенная провайдером. Объекты ADO имеют два типа свойств -- внутренние и динамические. Внутренние свойства встроены в ADO и доступны для любого объекта. Объект Property является контейнером для динамических свойств, определяемых провайдером.
Error -- объект содержит детальную информацию об ошибках доступа к данным при выполнении операций с источником данных.
Коллекция Fields -- содержит набор объектов Field внутри объекта Recordset или Record.
Коллекция Properties -- содержит набор объектов Property для указанного объекта.
Коллекция Parameters -- содержит набор объектов Parameter (аргументы, параметры) объекта Command.
Коллекция Errors -- содержит набор объектов Error, соответствующий ошибкам доступа к источнику данных.
В ADO широко применяется понятие "провайдер" (или поставщик). Есть два вида провайдеров, Data Provider (провайдер данных) и Service Provider (провайдер услуг). Провайдер данных позволяет разработчику использовать различные источники данных не вникая в то, как и в каком виде эти данные хранятся; для работы с данными разработчик использует интерфейс ADO, его объекты, методы и свойства. Провайдер услуг позволяет разработчику расширить функциональность приложений. Обычно провайдер услуг не предоставляет данных, как правило,он проводит обслуживание данных, возвращаемых провайдером данных.
Connection
Этот объект представляет собой сессию, установленную с источником данных. Используя методы и свойства этого объекта, вы можете сделать следующее:
Вы можете использовать объект Connection независимо от любых прочих объявленных объектов. Чаще всего используются свойство ConnectionString и метод Execute. ConnectionString можно задать несколькими способами. Можно установить свойство ConnectionString, а можно указать строку подключения непосредственно при открытии подключения, в виде аргумента метода Open.
В ConnectionString указывается информация, используемая при установлении соединения с источником данных. В общем случае в ConnectionString указаны параметры в виде <имя_параметра>=<значение_параметра>, разделенных точкой с запятой. ADO поддерживает пять параметров для ConnectionString, все остальные параметры передаются провайдеру без обработки в ADO. Аргументы, поддерживаемые ADO, следующие:
После того, как вы установите ConnectionString и откроете подключение, провайдер может изменить значение параметров, например, определенные в ADO параметры будут переназначены в их эквиваленты для провайдера. Свойство ConnectionString автоматически наследует значения соответствующего аргумента метода Open, если он был указан. Вы не можете указывать аргументы Provider и File Name одновременно, т.к. указание File Name означает, что ADO автоматически загрузит соответствующего провайдера. Значение ConnectionString не может менятся, когда соединение открыто. Если в ConnectionString один параметр указан несколько раз, то будет использовано последнее указанное значение.
Список основных провайдеров приводится ниже, более полную информацию смотрите в MSDN и на сайте ConnectionStrings.
Microsoft OLE DB Provider for ODBC
Провайдер: "MSDASQL"
Строка подключения: "Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
Microsoft OLE DB Provider for Microsoft Jet
Провайдер: "Microsoft.Jet.OLEDB.4.0"
Строка подключения: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"
Microsoft OLE DB Provider for SQL Server
Провайдер: "SQLOLEDB"
Строка подключения: "Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName; User ID=userName;Password=userPassword;"
Microsoft OLE DB Provider for Oracle
Провайдер: "MSDAORA"
Строка подключения: "Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;"
Microsoft OLE DB Provider for Microsoft Active Directory Service
Провайдер: "ADSDSOObject"
Строка подключения: "Provider=ADSDSOObject;User ID=userName;Password=userPassword;"
Параметры для провайдера можно задавать не только в строке подключения, но и используя коллекцию Properties, например cnn.Properties("Data Source") = databaseName.
Метод Execute позволяет выполнять указанный запрос, SQL-оператор, хранимую процедуру или текст, обрабатываемый провайдером. Общий синтаксис этого метода следующий:
Set recordset = connection.Execute (CommandText, RecordsAffected, Options)
Здесь recordset -- это объектная переменная, ссылающаяся на набор данных, который будет присвоен результату выполнения команды; CommandText -- это текст команды (имя таблицы с данными, текст SQL-запроса, имя хранимой процедуры, URL или текст, обрабатываемый провайдером), а в RecordsAffected возвращается количество записей, над которыми была проведена указанная команда. В Options указывается набор флагов, определяющих тип команды (таблица, запрос, хранимая процедура и т.п.) и параметры выполнения команды (асинхронное выполнение или нет, возвращать набор данных или нет и т.п.). Наиболее интересными флагами являются adAsyncExecute (позволяет исполнять команду асинхронно, т.е. не ожидая завершения команды), adExecuteNoRecords (указывает, что команда не возвращает записей, что позволяет увеличить скорость выполнения команды) и adAsyncFetch (который при правильном использовании значительно повышает удобство пользования программой).
Материалы данной статьи не допускается размещать без указания на данную страницу.
Дата: 14 марта 2006 г.
e-mail
Эту статью читали раз(а)