В первой статье данного цикла были рассмотрены общие
вопросы программного создание баз данных с помошью библиотек ADOX.
От читателей приходили письма с вопросами и уточнениями, за что им отдельное
спасибо. По наиболее важным, для разработчиков темам, Я решил написать вторую
часть статьи, которая коснется двух особо важных моментов работы с базой данных
Access c помошью этой библиотеки и ее расширений.
1. Создание полей типа «счетчик»
Для этого нам понадобятся два
объекта:
Dim cat As New ADOX.Catalog 'Каталог иными словами
'наша база данных
Dim col As New ADOX.Column 'Колонка, то есть поле типа
'«счетчик», которое мы
'добавим к таблице
Создадим подключение к БД. Напомню, что
работа с базой данных Access через провайдера
Microsoft.Jet работает в 1.5 – 2 раза быстрее, чем
через ODBC.
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=.\NorthWind.mdb;"
Теперь зададим для нового поля свойства,
которые заставят его быть счетчиком.
With col
.Name = "ContactId"
.Type = adInteger
Set .ParentCatalog = cat
.Properties("AutoIncrement") = True
.Properties("Seed") = CLng(1)
.Properties("Increment") = CLng(1)
End With
Вот теперь это поле можно добавить в таблицу
cat.Tables("MyTale").Columns.Append col
Закрываем соединение с базой данных
Set cat = Nothing
Ниже приведена таблица с
описанием других свойств (Properties) объекта
Column
Название
|
Тип
|
Default
|
Доступ
|
Описание
|
AutoIncrement
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Задает тип поля «Счетчик» с автоматическим увеличением
значения при добавлении записи
|
Default
|
adEmpty1
|
Empty
|
adPropRead
adPropWrite
adPropRequired
|
Значение поля по умолчанию
|
Description
|
adBStr
|
""
|
adPropRead
adPropWrite
adPropRequired
|
Описанеие поля
|
Fixed Length
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет ,будет поле фиксированой длины или переменой
|
Increment
|
adInteger
|
1
|
adPropRead
adPropWrite
adPropRequired
|
Значение, на которое будет увеличиваться поле типа
«счетчик»
|
Nullable
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет, может ли поле не содержать никакого значения,
иными словами должно ли это поле быть обязательным для заполнения
|
Seed
|
adInteger
|
1
|
adPropRead
adPropWrite
adPropRequired
|
Значение, с которого начнется отсчет в первой записи для
поля типа «счетчик»
|
Jet OLEDB:Allow Zero Length
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет, могут ли текстовые поля содержать строки
нулевой длины. Игнорируется для несимвольных полей
|
Jet OLEDB:AutoGenerate
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет, будет ли автоматически генерироваться новое
значение GUID для полей типа adGUID
|
Jet OLEDB:Column Validation Rule
|
adBStr
|
""
|
adPropRead
adPropWrite
adPropRequired
|
Выражение, определяющее правильность записываемого в поле
значения, должно быть написано в формате SQL WHERE но
без ключевого слова WHERE
|
Jet OLEDB:Column Validation Text
|
adBStr
|
""
|
adPropRead
adPropWrite
adPropRequired
|
Текст, который будет показан, в случае несоответствия
заносимого в поле значения, определенному для этого поля правилу (Rule).
|
Jet OLEDB:Compressed UNICODE Strings
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет, будет ли Microsoft Jet сжимать
UNICODE строкипри записи на
диск. Игнорируется, если база данных не в формате Microsoft Jet version 4.0
|
Jet OLEDB:Hyperlink
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет, что данные в поле являются гиперссылкой.
Игнорируется для полей с типом отличным от adLongVarWChar.
|
Jet OLEDB:IISAM Not Last Column
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Это свойство я не берусь переводить, поскольку с ISAM драйверами не работаю.
For Installable-ISAMs, this property informs
the I-ISAM that there are more columns that are going to be added to the
table after this one. If you are using ITableDefinition::AddColumn or ITableDefintion::CreateTable,
it is required that you set this property for every column except the last
column.
|
Jet OLEDB:One BLOB per Page
|
adBoolean
|
False
|
adPropRead
adPropWrite
adPropRequired
|
Определяет, должны ли данные хранится в раздельных
страницах (True) или могут использовать общие
страницы базы данных, для экономии места на диске. Работает только с полями
типа adLongVarBinary.
|
2. Программное сжатие базы данных
Программное сжатие, которое
раньше выполнялось командой CompactDatabase библиотеки DAO не
представлено не в ADO не в ADOX. Эти операции вместе с программным управлением
репликацией вынесены в отдельную библиотеку
Microsoft Jet and Replication Objects X.X library Где
X.X соответствует версии ADO с которой вы
работаете, но не ниже 2.5.
Так что поставьте ссылку в Project/References на эту библиотеку и
переходим к процессу программирования.
Библиотека довольно скудна по количеству функций. Я попробую
привести описание ее объектной модели.
Объекта всего два: JetEngine и Replica
JetEngine содержит
только два метода CompacDatabase, его мы рассмотрим
ниже и RefreshCache, который как ясно из названия обновляет кэшированную
область базы данных.
Объект Replica управляет репликацией, здесь я его рассматривать не буду,
возможно, сделаю это в отдельной статье.
Итак для сжатия базы данных нам необходим следующий код.
Set jro = Nothing
Вот такая незатейливая операция. Заботу об удалении старой
базы данных и переименовании сжатой базы в текущую, вам придется взять на себя.
о использовать встроенные в VB команды:
Kill “FileName”
Name “OldFileName” As “NewFileName”
P.S. Данная
статья доступна для свободного распространения, в любых средствах массовой
информации, при условии сохранения ссылки на автора.