Полное название ADOX — Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security. Другими словами, ADOX — это COM-библиотека, являющаяся дополнением к библиотеке ADO и предназначенная для управления структурой и безопасностью базы.
ADOX позволяет как получить информацию об объектах, так и управлять ими — создавать, изменять и удалять. Объекты, доступные ADOX — это таблицы (Tables), их поля (Columns), ключи (Keys) и индексы (Indexes), процедуры (Procedures) и вьюшки (Views), а также пользователи (Users) и группы (Groups). ADOX не доступны такие объекты MS Access как: формы, отчеты, страницы, макросы и модули.
Данная статья ориентирована на использование ADOX для баз формата MDB. Вообще говоря, ADOX предназначен для работы не только с базами MS Access, но наиболее полно поддержка ADOX реализована в OLE DB Provider for MS Jet. Подробнее см. Provider Support for ADOX.
Соединение с базой устанавливается либо в результате создания базы вызовом Catalog.Create (см. ниже), либо «вручную» — для существующей базы. В обоих случаях используется одна и та же строка соединения (connection string).
Здесь и далее предполагается, что в проекте уже установлены ссылки на ADO и ADOX: в Solution Explorer правой кнопкой на References, пункт Add Reference, вкладка COM, выбрать строку Microsoft ADO Ext. 2.7 for DDL and Security, нажать Select, выбрать строку Microsoft ActiveX Data Objects 2.8 Library, нажать Select, затем OK. Таким образом, c объектами ADO и ADOX мы будем использовать через раннее связывание. Раннее связывание выбрано с целью сделать код примеров более нагладным. Работа через позднее связывание, конечно, также возможна.
Обратите внимание на закрытие соединения. Если вы пишите на C++ или VB6, то Close можно не вызывать, поскольку освобождение COM-объекта Catalog приведет к закрытию соединения. Но под .NET между присваиванием adoxCatalog = null и освобождением объекта может пройти значительное время, в течение которого .MDB-файл будет занят...
При создании пустой базы через ADOX: размер файла .MDB — 64Кб, база содержит 4 системных таблицы (MSysACEs, MSysObjects, MSysQueries, MSysRelationships). При создании пустой базы из MS Access 2003: размер базы — 92Кб, база содержит 4 системных таблицы плюс одну таблицу Access (MSysAccessObjects).
A table from a row-returning, nonparameterized query
Лирическое отступление… Существует еще по крайней мере два способа получения списка таблиц (но уже без использования ADOX). Первый — с использованием системной таблицы MSysObjects:
Второй способ — через ADO.NET:
Свойства таблицы
Объект ADOX.Table содержит коллекцию Properties со следующими свойствами:
Свойство
Тип
Описание
Temporary Table
adBoolean
Показывает, является ли таблица временной. Для MS Jet этот параметр всегда равен False
Jet OLEDB:Create Link
adBoolean
Jet OLEDB:Cache Link Name/Password
adBoolean
Показывает, нужно ли кешировать информацию по аутентификации к источнику данных ODBC — при создании линкованной таблицы
Jet OLEDB:Remote Table Name
adBSTR
Имя таблицы в линкуемой базе — при создании линкованной таблицы
Jet OLEDB:Link Provider String
adBSTR
Jet OLEDB:Link Datasource
adBSTR
Jet OLEDB:Exclusive Link
adBoolean
При создании линкованной таблицы — показывает, должен ли источник данных открываться в монопольном режиме
Jet OLEDB:Table Validation Text
adBSTR
Jet OLEDB:Table Validation Rule
adBSTR
Jet OLEDB:Table Hidden In Access
adBoolean
Свойства поля
Для объекта Column в коллекции Properties доступны следующие свойства:
Свойство
Тип
Описание
Autoincrement
adBoolean
Показывает, увеличивается ли значение поля автоматически при добавлении новой записи
Default
adVariant
Значение поля по умолчанию
Description
adBSTR
Описание поля
Nullable
adBoolean
Показывает, может ли поле содержать значение NULL
Fixed Length
adBoolean
Показывает, является ли длина поля фиксированной или переменной
Seed
adInteger
Increment
adInteger
Для счетчика — величина, на которую увеличивается значение счетчика при создании новой записи
Jet OLEDB:Column Validation Text
adBSTR
Jet OLEDB:Column Validation Rule
adBSTR
Выражение, которое должно быть вычислено для проверки значения перед присваиванием
Jet OLEDB:IISAM Not Last Column
adBoolean
Jet OLEDB:AutoGenerate
adBoolean
Jet OLEDB:One BLOB per Page
adBoolean
Jet OLEDB:Compressed UNICODE Strings
adBoolean
Используется ли сжатие Unicode при хранении строк
Jet OLEDB:Allow Zero Length
adBoolean
Для строковых полей: показывает, допустимы ли значения-строки нулевой длины
Jet OLEDB:Hyperlink
adBoolean
Для Memo-поля: показывает, является ли поле гиперссылкой
Показывает, поддерживается ли индекс автоматически при изменениях в таблице. Для MS Jet — всегда True
Clustered
adBoolean
Показывает, является ли индекс кластеризованным. Для MS Jet — всегда False
Fill Factor
adInteger
Initial Size
adInteger
Объем структуры на момент создания. Для MS Jet — всегда 4096 байт на страницу
NULL Collation
adInteger
NULL Keys
adInteger
Primary Key
adBoolean
Показывает, представляет ли данный индекс первичный ключ таблицы
Sort Bookmarks
adBoolean
Index Type
adInteger
Тип индекса. Для MS Jet это всегда 1, что означает — B+-дерево
Unique
adBoolean
Показывает, должны ли ключи индекса быть уникальными
Temporary Index
adBoolean
Показывает, является ли индекс временным. Для MS Jet этот параметр всегда равен False
Запросы
Под запросами подразумеваются объекты типа PROCEDURE и VIEW. Microsoft Jet engine не делает различий между этими двумя типами, но Microsoft Jet OLE DB 4.0 provider проводит это разграничение. Как правило, все НЕ-параметризированные SELECT-запросы относятся к VIEW, все остальные запросы рассматриваются как PROCEDURE. Но бывают и ошибки — см. PRB: Non-Parameterized SELECT Query Appears in ADO Procedures Collection.
В БД Access при операциях удаления соответствующие строки, таблицы и другие объекты на самом деле НЕ удаляются, а лишь помечаются как удаленные. В результате объем файла БД монотонно растет.
При наличии открытого ADODB-соединения всегда можно сказать — нужно ли сжимать базу. Свойство «Jet OLEDB:Compact Reclaimed Space Amount» соединения дает количество байт, высвобождаемых при сжатии.
Собственно сжатие
Из ADOX функция сжатия/восстановления недоступна, но эту операцию можно выполнить с помощью библиотеки Jet and Replication Objects (JRO). Перед выполнением сжатия все соединения с базой должны быть закрыты.
Никита Зимин, ведущий разработчик компании «Деловые программы»