Общий обзор объектов доступа к данным

Объекты доступа к данным (DAO) позволяют создавать программы, обеспечивающие доступ и обработку данных в локальных и удаленных база данных, осуществлять управление базами данных и их объектами, а также изменять структуру базы данных.

Модели объектов

Механизм объектов доступа к данным (DAO) поддерживает две среды работы с базами данных, называемые также "рабочими областями".

•	Рабочая область Microsoft Jet обеспечивает доступ к данным в базах данных Microsoft Jet, базах данных ODBC, подключенных к ядру Microsoft Jet, а также источникам данных устанавливаемых драйверов ISAM других форматов, таких как Paradox или Lotus 1-2-3.

•	Рабочая область ODBCDirect обеспечивает доступ к серверам баз данных по протоколу ODBC без необходимости загрузки ядра базы данных Microsoft Jet.

Рабочую область Microsoft Jet используют при открытии базы данных Microsoft Jet (файла .mdb) или других баз данных ISAM, выполняющихся на настольных системах, а также в ситуациях, когда требуются уникальные характеристики Microsoft Jet, такие как возможность объединения данных из база данных разных форматов.

Рабочая область ODBCDirect обеспечивает альтернативные возможности работы в ситуациях, когда требуется выполнять запросы или сохраненные процедуры на сервере, таком как Microsoft SQL Server, или если приложению-клиенту требуются конкретные средства ODBC, например, пакетное обновление или выполнение асинхронных запросов.

Объекты доступа к данным

Существует 17 типов объектов доступа к данным.  Для объектов доступа к данным любых типов можно описать объектные переменные.

Например, в следующей программе Visual Basic для приложений (VBA) создаются объектные переменные для объекта Database, объекта Recordset типа динамического набора записей и объекта Field:

Dim dbsExample As Database

Dim rstExample As Recordset

Dim fldExample As Field

Set dbsExample = OpenDatabase("Biblio.mdb")

Set rstExample = dbsExample.OpenRecordset("Authors", _ 	dbOpenDynaset)

Set fldExample = rstExample.Fields("Au_ID")

Семейства DAO

Каждый объект доступа к данным, кроме объекта DBEngine, имеет соответствующее ему семейство.  Семейство содержит все существующие объекты этого типа.  Например, семейств Recordsets содержит все открытые объекты Recordset.  Каждое семейство содержится в другом объекте более высокого уровня в иерархии.  Объект Database содержит семейство Recordsets.  Каждый объект доступа к данным, кроме объектов Connection и Error, содержит семейство Properties.

Большинство объектов доступа к данным имеют используемые по умолчанию семейства и свойства.  Например, для объектов Recordset по умолчанию используется семейство Fields, а для объектов Field по умолчанию используется свойство Value.  Используемые по умолчанию семейства и свойства позволяют упростить текст программ.  Например, следующая инструкция задает значение поля "КодТовара" в текущей записи:

rstExample!КодТовара=9999

Объекты DBEngine и Workspace

Все объекты доступа к данным являются производными от объекта DBEngine.  Значение свойства DefaultType объекта DBEngine позволяет определить тип рабочей области (Microsoft Jet или ODBCDirect), открываемой при последующих вызовах метода CreateWorkspace.  Эта настройка может быть преодолена при вызове CreateWorkspace с помощью аргумента тип.  При создании рабочей области в приложении в память загружается соответствующая библиотека — ядра базы данных Microsoft Jet или ODBC.

При необходимости, пользователь имеет возможность открывать дополнительные объекты Workspace.  Каждый объект Workspace имеет указанный код пользователя и пароль.

Использование рабочей области Microsoft Jet

Открытие базы данных

Чтобы открыть базу данных следует открыть существующий объект Database или создать новый.  Этот объект представляет базу данных Microsoft Jet (файл .mdb), базу данных ISAM (например, Paradox) или базу данных ODBC, подключенную через ядро Microsoft Jet (используется также термин "источник данных ODBC, подключенный к ядру Microsoft Jet").

Язык определения данных

Дли изменения структуры базы данных можно использовать объектные переменные и другие средства языка определения данных (DDL).  Например, следующая программа позволяет добавить новый объект Field в существующую таблицу:

Dim dbs As Database, tdf As TableDef, fld As Field

' Открывает базу данных.

Set dbs = OpenDatabase("Борей.mdb")

' Открывает объект TableDef.

Set tdf = dbs.TableDefs("Клиенты")

' Создает новое поле.

Set fld = tdf.CreateField("Заметки", dbText, 200)

' Добавляет поле в семейство Fields объекта TableDef.

tdf.Fields.Append fld

Эта программа сначала создает новую объектную переменную для объекта Field, а затем добавляет поле в объект TableDef с помощью метода Append.  Поскольку объект TableDef содержит описание таблицы, в таблице появляется новое поле "Заметки", в которое можно вводить данные.  Аналогично создаются новые таблицы и новые индексы.

Обработка данных

Объекты доступа к данным обеспечивают широкий набор средств обработки данных.  Создание объекта Recordset позволяет выполнять запросы к базе данных и обрабатывать результирующие наборы записей.  Метод OpenRecordset принимает в качестве аргумента, указывающего источник данных, строку SQL или имя объекта QueryDef (сохраненный запрос).  Объект Recordset можно также открыть из объекта QueryDef или TableDef, который в этом случае является источником данных.  Результирующий объект Recordset обладает богатым набором свойств и методов, обеспечивающих поиск и изменение данных.

В рабочей области Microsoft Jet поддерживаются объекты Recordset четырех типов — таблица, динамический набор записей, статический набор записей и статический набор записей с последовательным доступом.

Транзакции

Все объекты Database, открытые в объекте Workspace, имеют общую область определения транзакций.  Это означает, что вызов метода BeginTrans для объекта Workspace затрагивает все открытые базы данных в этом объекте Workspace.  Аналогично этому, при вызове метода CommitTrans в объекте Workspace затрагиваются все открытые базы данных в этом объекте Workspace.

Репликация

Репликация базы данных используется для создания и управления репликами основной базы данных Microsoft Jet, периодического обновления всех или некоторых реплик с помощью метода Synchronize, а также копирования новых данных из одной реплики в другую.  Имеется возможность отбора ограниченного количества обновляемых записей с помощью свойства ReplicaFilter с последующей синхронизацией этих записей с помощью метода PopulatePartial.

Защита

Существует возможность ограничить доступ к одной или нескольким базам данных .mdb или к их таблицам с помощью средств защиты, поддерживаемых ядром базы данных Microsoft Jet.  Разработчик программ должен определить объекты Group (группа) и User (пользователь), с помощью которых определяется область определения и уровень разрешений, предоставляемых отдельным пользователям на конкретные объекты.  Например, может возникнуть необходимость предоставить конкретному пользователю доступ только для чтения к одной таблице и полные права на другую.

Использование модели объектов ODBCDirect

Подключение к базе данных

Объект Connection аналогичен объекту Database.  Фактически, объект Connection и объект Database представляют разные ссылки на один объект, а свойства каждого из этих объектов позволяют получить ссылку на второй объект.  Это облегчает задачу преобразования приложения-клиента ODBC, использующего ядро Microsoft Jet, для использования механизма ODBCDirect.  Метод OpenConnection позволяет установить подключение к источнику данных ODBC.  Созданные при этом объект Connection содержит сведения о подключении, такие как имя сервера, имя источника данных и т.д.

Запросы

Хотя механизм DAO не поддерживает сохраненные запросы в рабочей области ODBCDirect, можно создать объект QueryDef на основе откомпилированного запроса и использовать его для выполнения запросов на изменение, а также для запуска сохраненных процедур на сервере.  Свойство Prepare позволяет перед фактическим выполнением запроса решить, следует ли создавать на сервере личную сохраненную процедуру на основе объекта QueryDef.

Запросы с параметрами также могут передаваться на сервер с помощью объекта Parameter, созданного для объекта QueryDef.  Свойство Direction позволяет определить, что параметр является входным, выходным, и тем, и другим, или предназначенным для возвращения значения из сохраненной процедуры.

Обработка данных

Создание объекта Recordset позволяет выполнять запросы к базе данных и обрабатывать результирующие наборы записей.  Метод OpenRecordset принимает в качестве аргумента, указывающего источник данных, строку SQL или имя объекта QueryDef (сохраненный запрос).  Результирующий объект Recordset обладает богатым набором свойств и методов, обеспечивающих поиск и изменение данных.

В рабочей области ODBCDirect поддерживаются объекты Recordset четырех типов — динамический набор записей, объект динамического типа, статический набор записей и статический набор записей с последовательным доступом.

Для приложений-клиентов, в которых требуется обеспечить работу с указателем набора записей без наложения блокировок или без выдачи требования на обновление для каждой записи, поддерживается библиотека указателей пакетного обновления.  Клиент сохраняет информацию об обновлении многих записей во временном буфере ("пакете"), а затем выполняет пакетное обновление.

Асинхронное выполнение методов

Методы Execute, MoveLast, OpenConnection и OpenRecordset поддерживают параметр dbRunAsync.  Этот режим позволяет приложению-клиенту выполнять другие задачи (например, загрузку форм) во время выполнения метода.  Пользователь имеет возможность с помощью свойства StillExecuting проверить, закончено ли выполнение задачи, а затем отключить асинхронную задачу с помощью метода Cancel.


Указатель методов доступа к данным по объектам

В настоящем указателе все методы доступа к данным группируются по объектам.  Чтобы узнать, поддерживается ли конкретный метод в рабочей области Microsoft Jet или ODBCDirect, следует обратиться к разделу справки для конкретного метода.

Connection Container — не имеет методов Database DBEngine Document Error — не имеет методов Field Group Index	Parameter — не имеет методов Property — не имеет методов QueryDef Recordset Relation TableDef User Workspace


Указатель методов доступа к данным для рабочей области Microsoft Jet

В настоящем указателе перечислены все методы доступа к данным, доступные в рабочей области Microsoft Jet (для файлов баз данных ISAM).

A-C

AddNew Append AppendChunk BeginTrans CancelUpdate Clone Close CommitTrans CompactDatabase CopyQueryDef	CreateDatabase CreateField CreateGroup CreateIndex CreateProperty CreateQueryDef CreateRelation CreateTableDef CreateUser CreateWorkspace
D-M

Delete Edit Execute FillCache FindFirst FindLast FindNext FindPrevious GetChunk	GetRows Idle MakeReplica Move MoveFirst MoveLast MoveNext MovePrevious
N-Z

NewPassword OpenDatabase OpenRecordset PopulatePartial Refresh RefreshLink RegisterDatabase	RepairDatabase Requery Rollback Seek SetOption Synchronize Update


Указатель методов доступа к данным для рабочей области ODBCDirect

В настоящем указателе перечислены все методы доступа к данным, доступные в рабочей области ODBCDirect.

A-C

AddNew Append AppendChunk BeginTrans Cancel CancelUpdate	Clone Close CommitTrans CreateQueryDef CreateWorkspace
D-M

Delete Edit Execute GetChunk GetRows	Move MoveFirst MoveLast MoveNext MovePrevious
N-Z

NextRecordset OpenConnection OpenDatabase OpenRecordset Refresh	RegisterDatabase Requery Rollback Update


Модель объектов доступа к данным для рабочей области Microsoft Jet


Модель объектов доступа к данным для рабочей области ODBCDirect


Указатель объектов и семейств доступа к данным

Объекты и семейства доступа к данным (DAO) являются основой общей схемы разработки программ, позволяющих создавать системы баз данных и управлять их компонентами.  Объекты и семейства имеют свойства, с помощью которых описываются характеристики компонентов базы данных, и методы, обеспечивающие управление этими компонентами.  Объекты и семейства образуют иерархическую структуру базы данных, управление которой осуществляется программным образом.

Объекты и семейства находятся на разных уровнях иерархии вложенности: объект может не содержать семейств или содержать несколько семейств разных типов; а семейство может не содержать объектов или содержать несколько объектов одного типа.  Хотя объекты и семейства имеют много общего, последнее различие определяет их использование.

В следующей таблице перечислены семейства и соответствующие им объекты.  В третьем столбце приводится краткое описание объекта.

Семейство	Объект	Описание
Connections	Connection	Сведения о подключении к источнику данных ODBC (только в рабочей области ODBCDirect).
Containers	Container	Сохраняет информацию о встроенном типе объектов (только в рабочей области Microsoft Jet).
Databases	Database	Открытая база данных.
Отсутствует	DBEngine	Ядро базы данных Microsoft Jet
Documents	Document	Сохраняет информацию о сохраненном встроенном объекте (только в рабочей области Microsoft Jet).
Errors	Error	Сохраняет информацию об ошибках, связанных с объектом.
Fields	Field	Поле в таблице, запросе, индексе, связи или наборе записей.
Groups	Group	Группа учетных записей пользователей (только в рабочей области Microsoft Jet).
Indexes	Index	Определяет порядок сортировки и уникальность записей в таблице (только в рабочей области Microsoft Jet).
Parameters	Parameter	Параметр для запроса с параметрами.
Properties	Property	Встроенное или определяемое пользователем свойство.
QueryDefs	QueryDef	Сохраненное описание запроса.
Recordsets	Recordset	Набор записей из основной таблицы или запроса.
Relations	Relation	Связь, определенная между полями таблиц или запросов (только в рабочей области Microsoft Jet).
TableDefs	TableDef	Сохраненное описание таблицы (только в рабочей области Microsoft Jet).
Users	User	Учетная запись пользователя (только в рабочей области Microsoft Jet).
Workspaces	Workspace	Сеанс ядра базы данных Microsoft Jet.


Указатель свойств доступа к данным по объектам

В настоящем указателе все свойства доступа к данным группируются по объектам и семействам.  Чтобы узнать, поддерживается ли конкретной свойство для баз данных Microsoft Jet или ODBC, следует обратиться к разделу справки для конкретного свойства.

Connection Container Database DBEngine Document Error Field Group Index	Parameter Property QueryDef Recordset Relation TableDef User Workspace


Указатель свойств доступа к данным для рабочей области Microsoft Jet

В настоящем указателе перечислены все свойства доступа к данным, поддерживаемые в рабочей области Microsoft Jet.

A-C

AbsolutePosition AllowZeroLength AllPermissions Attributes  BOF Bookmark Bookmarkable  CacheSize	CacheStart Clustered CollatingOrder ConflictTable Connect Container Count
D-H

DataUpdatable DateCreated DefaultUser DefaultPassword DefaultValue  Description DesignMasterID DistinctCount EditMode	EOF FieldSize Filter Foreign ForeignName ForeignTable HelpContext HelpFile
I-O

IgnoreNulls Index Inherit Inherited IniPath IsolateODBCTrans KeepLocal LastModified LastUpdated LockEdits	LoginTimeout LogMessages MaxRecords Name NoMatch Number ODBCTimeout OrdinalPosition Owner
P-R

PartialReplica Password PercentPosition Permissions PID Primary QueryTimeout RecordCount	RecordsAffected Replicable ReplicableBool ReplicaFilter ReplicaID Required Restartable ReturnsRecords
S-Z

Size Sort Source SourceField SourceTable SourceTableName SQL SystemDB Table Transactions	Type Unique Updatable UserName V1xNullBehavior ValidateOnSet ValidationRule ValidationText Value Version


Указатель свойств доступа к данным для рабочей области ODBCDirect

В настоящем указателе перечислены все свойства доступа к данным, поддерживаемые в рабочей области ODBCDirect.

A-D

AbsolutePosition Attributes BatchCollisionCount BatchCollisions BatchSize BOF  Bookmark Bookmarkable CacheSize	Connect Connection Count  Database DataUpdatable DefaultCursorDriver DefaultType Description Direction
E-Q

EditMode EOF FieldSize HelpContext HelpFile LastModified LockEdits  LoginTimeout LogMessages	MaxRecords Name Number ODBCTimeout OrdinalPosition OriginalValue  PercentPosition Prepare QueryTimeout
R-Z

RecordCount RecordsAffected RecordStatus Restartable  Size Source SourceField SourceTable SQL	StillExecuting Transactions Type Updatable  UpdateOptions UserName Value Version VisibleValue


Новые средства объектов доступа к данным (DAO)

В версии DAO 3.5 определен новый режим подключения клиент/сервер, называемый "ODBCDirect".  В режиме ODBCDirect устанавливается прямое подключение к источнику данных ODBC, без необходимости загрузки ядра базы данных Microsoft Jet в память.  Это полезно в ситуациях, когда требуется использовать специфические характеристики ODBC.

Для баз данных Microsoft Jet определены новые интерфейсы, позволяющие использовать новые возможности частичной репликации, поддерживаемые ядром Microsoft Jet.

Примечание.   Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL. Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню. При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.

Новые интерфейсы версии DAO 3.5 для ODBCDirect

•	Объект Connection — подключение к базе данных ODBC.

•	Метод Cancel (для объектов Connection, QueryDef и Recordset) — отменяет выполнение асинхронной операции.

•	Метод NextRecordset (для объектов Recordset) — загружает следующий набор записей, если имеется, возвращаемых при вызове метода OpenRecordset в запросе, который возвращает множественные наборы записей, и указывает, был ли успешно загружен новый набор записей.

•	Метод OpenConnection (для объектов Workspace) — Открывает объект Connection для источника данных ODBC.

•	Свойство BatchCollisionCount (для объектов Recordset) — возвращает число записей, которые не были обновлены в последней операции пакетного обновления.

•	Свойство BatchCollisions (для объектов Recordset) — возвращает массив закладок, указывающий строки, в которых возникли конфликты обновления при последней операции пакетного обновления.

•	Свойство BatchSize (для объектов Recordset) — задает или возвращает число инструкций, посылаемых на сервер в каждом пакете.

•	Свойство Connection (для объектов Database и Recordset) — возвращает объект Connection, которому соответствует объект Database или которому принадлежит объект Recordset.

•	Свойство Database (для объектов Connection) — возвращает имя объекта Database, соответствующего объекту Connection.

•	Свойство DefaultCursorDriver (для объектов Workspace) — задает или возвращает тип драйвера указателя набора записей, используемого объектами Recordset в подключении ODBCDirect.

•	Свойство DefaultType (для объектов DBEngine) — указывает тип рабочей области (Microsoft Jet или ODBCDirect), который будет использоваться при следующем вызове метода CreateWorkspace.

•	Свойство Direction (для объектов Parameter) — указывает, представляет ли объект Parameter входной параметр, выходной параметр, и то, и другое, или значение, возвращаемое из сохраненной процедуры.

•	Свойство MaxRecords (для объектов QueryDef) — задает или возвращает максимальное число записей, возвращаемых в запросе.

•	Свойство OriginalValue (для объектов Field) — возвращает значение объекта Field, которое существовало в базе данных к моменту начала последней операции пакетного обновления.

•	Свойство Prepare (для объектов QueryDef) — возвращает значение, указывающее, должен ли запрос перед его выполнением быть подготовлен на сервере как временная сохраненная процедура с помощью функции SQLPrepare ODBC или выполняться непосредственно с помощью функции SQLExecDirect ODBC.

•	Свойство RecordStatus (для объектов Recordset) — возвращает значение, указывающее состояние обновления текущей записи, если эта запись участвует в операции пакетного обновления.

•	Свойство StillExecuting (для объектов Connection, QueryDef и Recordset) — возвращает значение, указывающее, закончено ли выполнение асинхронной операции.

•	Свойство UpdateOptions (для объектов Recordset) — возвращает значение, указывающее, как конструируется предложение WHERE для каждой записи в операции пакетного обновления, а также способ выполнения операции обновления.

•	Свойство VisibleValue (для объектов Recordset) — Возвращает в случае возникновения конфликта при пакетном обновлении значение в базе данных, которое является более новым, чем сохраняемое в свойстве OriginalValue.

Новые средства ODBCDirect

Подключение к серверу

Поддерживаемый только в модели объектов ODBCDirect, новый объект Connection содержит сведения о подключении к источнику данных ODBC, такие как имя сервера, имя источника данных и т.д.  Этот объект аналогичен объекту Database, и будет выглядеть как знакомый для пользователей, открывавших объект Database для источника данных ODBC.  Фактически, объект Connection и объект Database представляют разные ссылки на один объект, а свойства каждого из этих объектов позволяют получить ссылку на второй объект.  Это облегчает задачу преобразования приложения-клиента ODBC, использующего ядро Microsoft Jet, для использования механизма ODBCDirect.

Пакетное обновление

Для приложений-клиентов, в которых требуется обеспечить работу с указателем набора записей без наложения блокировок или без выдачи требования на обновление для каждой записи, поддерживается новый указатель пакетного обновления.  Клиент сохраняет информацию об обновлении многих записей во временном буфере ("пакете"), а затем выполняет пакетное обновление.

Поскольку существует временная задержка между открытием объект Recordset и возврат пакета обновлений из объекта Recordset на сервер, другие пользователи могут изменить данные до отправки обновлений на сервер.  При этом возникает "конфликт обновления" с изменениями, внесенными другими пользователями.  Ряд средств новой версии позволяют обнаружить возникновение конфликта обновления при пакетном обновлении и предоставляют пользователю некоторые возможности разрешения конфликта.

Асинхронное выполнение методов

Методы Execute, MoveLast, OpenConnection и OpenRecordset поддерживают параметр dbRunAsync.  Этот режим позволяет приложению-клиенту выполнять другие задачи (например, загрузку форм) во время выполнения метода.  Пользователь имеет возможность проверить, закончено ли выполнение задачи, а затем отключить асинхронную задачу.

Поддержка клиента для указателей ODBC

Четыре различных типа объектов Recordset поддерживают следующие типы указателей набора записей ODBC:

Указатель ODBC	Тип объекта Recordset
Динамический тип	dbOpenDynamic (новый в версии DAO 3.5)
Динамический набор записей	dbOpenDynaset
С последовательным доступом	dbOpenForwardOnly (новый в версии DAO 3.5)
Статический набор записей	dbOpenSnapshot
Новые интерфейсы версии DAO 3.5 для ядра базы данных Microsoft Jet

•	Метод PopulatePartial (для объектов Database) — выполняет синхронизацию любых изменений в частичной реплике с полной репликой, очищает все записи в частичной реплике, а затем снова заполняет частичную реплику с использованием текущих фильтров реплики.

•	Метод SetOption (для объекта DBEngine) — задает новые значения параметров для записей ядра базы данных Microsoft Jet в реестре Windows, действующие для текущего экземпляра объекта доступа к данным.

•	Свойство FieldSize (для объектов Field) — заменяет метод FieldSize; синтаксис конструкций не изменяется, поэтому нет необходимости изменять существующие программы.

•	Свойство MaxRecords (для объектов QueryDef) — задает или возвращает максимальное число записей, возвращаемых в запросе.

•	Свойство ReplicaFilter (для объектов TableDef) — возвращает значение, указывающее, какое подмножество записей таблицы отбирается при репликации.

•	Свойство PartialReplica (для объектов Relation) — указывает, должна ли учитываться связь, представляемая объектом Relation, при заполнении частичной реплики из полной реплики.

Новые возможности ядра базы данных Microsoft Jet

Частичная репликация

Версия 3.5 ядра базы данных Microsoft Jet позволяет выполнять репликацию части таблицы, а не всей таблицы (допускается отбор только записей, а не полей).  При создании частичной реплики можно использовать фильтры двух типов — логические выражения и связи.  Логические фильтры отбирают для репликации только записи, удовлетворяющие определенным условиям.  В механизме DAO эти фильтры представлены свойством ReplicaFilter объекта TableDef.  Фильтры, использующие связи, позволяют указать учет связи между участвующими в частичной репликации таблицами, ограничивающей число реплицируемых записей.  В механизме DAO для объекта Relation задается свойство PartialReplica, указывающее использование объекта Relation при частичной репликации.

Новый тип объектов Recordset

В версии DAO 3.5 для аргумента тип метода OpenRecordset определена новая константа dbOpenForwardOnly, соответствующая новому типу объектов Recordset, свойства которого аналогичны объекту Recordset типа статического набора записей, открытому в версии DAO 3.0 с параметром dbForwardOnly.

Указание во время выполнения параметров, отличных от параметров реестра

Новый метод SetOption позволяет преодолевать при выполнении значения параметров Microsoft Jet, заданные в реестре.  Это позволяет регулировать ход выполнения запросов Microsoft Jet, изменять интервалы ожидания и т.д.


Устаревшие средства объектов доступа к данным (DAO)

В Microsoft Access версии 1.x и 2.0, а также в Microsoft Visual Basic версии 3.0, использовались предыдущие версии DAO. Некоторые объекты, методы, свойства и инструкции из предыдущих версий считаются "устаревшими", однако, по-прежнему поддерживаются для совместимости с существующими программами.

Ниже перечислены методы, свойства, объекты и инструкции DAO, которые были заменены на более мощные, гибкие и удобные для использования. Каждому устаревшему средству сопоставлена рекомендуемая замена.

Устаревшие средства	Рекомендуемое средство
Все методы CreateDynaset	Метод OpenRecordset
Все методы CreateSnapshot	Метод OpenRecordset
Все методы ListFields	Семейство Fields
Все методы ListIndexes	Семейство Indexes
Инструкция CompactDatabase	Метод DBEngine.CompactDatabase
Инструкция CreateDatabase	Метод DBEngine.CreateDatabase
Метод DBEngine.FreeLocks	Метод DBEngine.Idle
Метод DBEngine.SetDefaultWorkspace	Свойства DBEngine.DefaultUser и DBEngine.Password
Метод DBEngine.SetDataAccessOption	Свойство DBEngine.IniPath
Метод Database.BeginTrans	Метод Workspace.BeginTrans
Метод Database.CommitTrans	Метод Workspace.CommitTrans
Метод Database.Rollback	Метод Workspace.Rollback
Метод Database.DeleteQuerydef	Метод Delete
Метод Database.ExecuteSQL	Метод Execute
Метод Database.ListTables	Семейство Tabledefs
Database.OpenQuerydef	Семейство Querydefs
Метод Database.OpenTable	Метод OpenRecordset
Метод FieldSize	Свойство FieldSize
Свойство Index.Fields	Семейство Index.Fields
Инструкция OpenDatabase	Метод DBEngine.OpenDatabase
Метод Querydef.ListParameters	Семейство Parameters
Объект Snapshot	Объект Recordset
Объект Dynaset	Объект Recordset
Объект Table	Объект Recordset


Объект Container

В объектах Container (контейнер) группируются однотипные объекты Document.

Дополнительные сведения

Каждый объект Database содержит семейство Containers, состоящее из встроенных объектов Container.  В приложениях могут определяться собственные типы документов и соответствующих контейнеров (только в базах данных Microsoft Jet); но эти объекты не всегда поддерживаются с помощью объектов доступа к данным (DAO).

Некоторые из этих объектов Container определены в ядре базы данных Microsoft Jet, тогда как другие определяются в других приложениях.  В следующей таблице приведен список имен всех объектов Container, определенных в ядре Microsoft Jet, и описание содержащейся в них информации.

Имя контейнера	Описываемые объекты
Databases	Сохраненные базы данных.
Tables	Сохраненные таблицы или запросы.
Relations	Сохраненные связи.
Примечание.   Не следует путать отдельные типы объектов Container, перечисленные в приведенной выше таблице, с одноименными типами семейств.  Объект Container типа "Databases" относится ко всем сохраненным объектам указанного типа, в то время как семейство Databases включает только открытые объекты данного типа.

Каждый объект Container содержит семейство Documents, в которое входят объекты Document, включающие все экземпляры документов определенного типа.  Как правило, объект Container используется как промежуточное звено доступа к сведениям, содержащимся в объекте Document.  Кроме того, семейство Containers позволяет задать условия защиты для всех объектов Document конкретного типа.

Существующие объекты Container позволяют выполнить следующие действия:

•	Использовать свойство Name для возвращения ранее определенного имени объекта Container.

•	Определить или указать с помощью свойства Owner владельца объекта Container.  Для того чтобы задать значение свойства Owner, необходимо иметь разрешение для объекта Container, а задаваемое значение данного свойства должно представлять имя существующего объекта User или Group.

•	Установить разрешения на доступ к объекту Container с помощью свойств Permissions и UserName, при этом любой объект Document, созданный в семействе Documents данного объекта Container унаследует установленные разрешения на доступ.

Объекты Container являются встроенными, поэтому нельзя создать новые объекты Container или удалить существующие объекты.

При ссылках на объект Container используют его порядковый номер в семействе или значение свойства Name (имя) в одной из следующих синтаксических конструкций:

Containers(0)

Containers("имя")

Containers![имя]


Семейство Containers

Семейство Containers содержит все объекты Container, определенные в базе данных (только в базах данных Microsoft Jet).

Дополнительные сведения

Каждый объект Database содержит семейство Containers , состоящее из встроенных объектов Container.  Некоторые из этих объектов Container определены в ядре базы данных Microsoft Jet, тогда как другие определяются в приложениях.


Объект Container, семейство Containers - Общие сведения

Объект Container

Объект Container не содержит методов и содержит следующие семейства и свойства.

Семейства

Documents (используется по умолчанию)

Properties

Свойства

AllPermissions

Inherit

Name

Owner

Permissions

UserName

Семейство Containers

Семейство Containers входит в состав каждого объекта Database, представляющего базу данных Microsoft Jet, и содержит следующий метод и следующее свойство.

Метод

Refresh

Свойство

Count


Объект Database

Объект Database представляет открытую базу данных.

Дополнительные сведения

Работа с открытой базой данных ведется с помощью объекта Database и его методов и свойств.  Для баз данных любого типа пользователь имеет следующие возможности:

•	Использовать метод Execute для запуска запроса на изменение.

•	С помощью свойства Connect установить подключение к источнику данных ODBC.

•	С помощью свойства QueryTimeout ограничить время ожидания выполнения запроса к источнику данных ODBC.

•	Использовать свойство RecordsAffected для определения количества записей, измененных в запросе на изменение.

•	Использовать метод OpenRecordset для выполнения запроса на выборку и создания объекта Recordset.

•	С помощью свойства Version определить версию ядра базы данных, в которой была создана база данных.

В базах данных Microsoft Jet (файлы .mdb) можно использовать другие методы, свойства и семейства для работы с объектом Database, а также для создания, изменения или получения информации о содержащихся в базе данных таблицах, запросах и связях.  Например, пользователь имеет возможность:

•	Использовать методы CreateTableDef и CreateRelation для создания таблиц и связей, соответственно.

•	Использовать метод CreateProperty для определения новых свойств объекта Database.

•	Использовать метод CreateQueryDef для создания описания постоянного или временного запроса.

•	Использовать методы MakeReplica, Synchronize и PopulatePartial для создания и синхронизации полных или частичных реплик базы данных.

•	С помощью свойства CollatingOrder указать язык, по правилам которого выполняется сортировка символьных полей.

В рабочей области ODBCDirect пользователь имеет возможность:

•	С помощью свойства Connection получить ссылку на объект Connection, соответствующий объекту Database.

Примечание.   Полный список методов, свойств и семейств, поддерживаемых объектом Database как в рабочей области Microsoft Jet, так и в рабочей области ODBCDirect, см в разделе Общие сведения.

При вызове метода CreateDatabase создается постоянный объект Database, который автоматически добавляется в семейство Databases, что приводит к его сохранению на диске.

При использовании метода OpenDatabase нет необходимости указывать объект DBEngine.

Открытие базы данных, содержащей присоединенные таблицы, не приводит к автоматическому установлению связей с указанными внешними файлами или источниками данных ODBC, подключенными к ядру Microsoft Jet.  В этом случае требуется либо указать ссылку на соответствующие таблице объекты TableDef или Field, либо открыть для таблицы объект Recordset.  Если связи установить не удается, возникает перехватываемая ошибка.  К возникновению перехватываемой ошибки приводит также отсутствие необходимых разрешений на доступ к базе данных или попытка установить связь с базой данных, открытой другим пользователем для монопольного доступа.

Допускается также непосредственное открытие с помощью метода OpenDatabase внешней базы данных (такой как FoxPro, dBASE или Paradox) вместо открытия базы данных с ядром Microsoft Jet с последующим присоединением внешних таблиц.

Примечание.   Не рекомендуется непосредственно открывать объект Database для источника данных ODBC, подключенного к ядру Microsoft Jet, такого как Microsoft SQL Server, поскольку запрос возвращает данные медленнее, чем присоединенные таблицы.  При открытии объекта Database для внешних бах данных с драйверами ISAM, таких как  FoxPro или Paradox, проблем с быстродействием не возникает.

При завершении выполнения процедуры, в которой описан объект Database, этот локальный объект Database закрывается вместе со всеми открытыми объектами Recordset.  Любые незавершенные изменения при этом теряются, а незавершенные транзакции свертываются без возникновения перехватываемой ошибки.  Чтобы избежать потери изменений пользователь должен в явном виде до выхода из процедуры завершить все транзакции или операции редактирования и закрыть объекты Recordset и объекты Database, описанные в этой процедуре на локальном уровне.

После применения к объекту Workspace одного из методов управления транзакциями (BeginTrans, CommitTrans или Rollback) эти транзакции применяются ко всем базам данных, открытым в объекте Workspace, в котором был открыт этот объект Database.  Для того чтобы выполнить независимую транзакцию, следует предварительно открыть дополнительный объект Workspace, а затем открыть в этом объекте Workspace еще один объект Database.

Примечание.   Можно открыть источник данных или базу данных несколько раз, создавая повторяющиеся имена в семействе Databases.  После этого следует присвоить объекты Database объектным переменным и ссылаться на объекты по именам переменных.


Семейство Databases

Семейство Databases содержит все объекты Database, открытые или созданные в объекте Workspace.

Дополнительные сведения

При открытии существующего объекта Database или при создании нового объекта в объекте Workspace база данных автоматически добавляется в семейство Databases.  Объект Database, закрытый с помощью метода Close, удаляется из семейства Databases, но не  удаляется с диска.  Перед закрытием объекта Database необходимо зарыть все открытые объекты Recordset.

В рабочей области Microsoft Jet значением свойства Name является строка, указывающая полный путь к файлу базы данных.  В рабочей области ODBCDirect значение свойства Name совпадает с именем соответствующего объекта Connection.

При ссылках на объект Database используют его порядковый номер в семействе или значение свойства Name (имя) в одной из следующих синтаксических конструкций:

Databases(0)

Databases("имя")

Databases![имя]

Примечание.   Можно открыть источник данных или базу данных несколько раз, создавая повторяющиеся имена в семействе Databases.  После этого следует присвоить объекты Database объектным переменным и ссылаться на объекты по именам переменных.


Объект Database, семейство Databases - Общие сведения

Объект Database

Объект Database содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Containers

Properties

QueryDefs

Recordsets (используется по умолчанию для [image])

Relations

TableDefs (используется по умолчанию для [image])

Методы

Close

CreateProperty

CreateQueryDef

CreateRelation

CreateTableDef

Execute

MakeReplica

NewPassword

OpenRecordset

PopulatePartial

Synchronize

Свойства

CollatingOrder

Connect

Connection

DesignMasterID

Name

QueryTimeout

RecordsAffected

Replicable (определяется пользователем)

ReplicaID

Updatable

V1xNullBehavior

Version

Семейство Databases

Семейство Databases входит в состав каждого объекта Workspace и содержит один метод и одно свойство.

Метод

Refresh

Свойство

Count


Объект DBEngine

Объект DBEngine является объектом самого верхнего уровня в модели объектов доступа к данным (DAO).

Дополнительные сведения

Объект DBEngine содержит в себе и управляет всеми другими объектами в иерархии объектов доступа к данным (DAO).  Создание дополнительных объектов DBEngine невозможно, а сам объект DBEngine не является компонентом ни одного семейства.

Примечание.   Способ ссылок на источник данных ODBC непосредственно через объекты доступа к данным (DAO) называют "рабочей областью ODBCDirect".  Это делается, чтобы отличать этот способ от непрямых ссылок на источник данных ODBC через ядро базы данных Microsoft Jet с использованием "рабочей области Microsoft Jet".  В каждом из способов доступа к источнику данных ODBC требуется один из двух возможных типов объекта Workspace.  Для того чтобы указать используемый по умолчанию тип объекта Workspace, создаваемого в объекте DBEngine, следует определить свойство DefaultType.  Тип объекта Workspace и тип соответствующего источника данных определяют доступные для использования объекты доступа к данным, методы и свойства.

Для баз данных или подключений любого типа данный объект позволяет:

•	Использовать свойство Version для получения номера версии объектов доступа к данным (DAO).

•	Использовать свойство LoginTimeout для получения или установки интервала ожидания для подключения ODBC, а также использовать метод RegisterDatabase для передачи сведений ODBC ядру базы данных Microsoft Jet.  Эти возможности используются одинаково, вне зависимости от того, выполняется ли подключение к источнику данных ODBC через ядро Microsoft Jet или в рабочей области ODBCDirect.

•	Использовать свойство DefaultType, чтобы указать тип подключения, используемый по умолчанию создаваемым объектом Workspace, т.е. либо рабочую область Microsoft Jet, либо ODBCDirect.

•	Использовать свойства DefaultPassword и DefaultUser, чтобы указать используемые по умолчанию имя пользователя и пароль для объекта Workspace.

•	Использовать метод CreateWorkspace для создания нового объекта Workspace.  При этом  необязательные аргументы позволяют указать параметры, имеющие приоритет над значениями свойств DefaultType, DefaultPassword и DefaultUser.

•	С помощью метода OpenDatabase открыть базу данных в стандартном объекте Workspace и вызывать методы BeginTrans, Commit и Rollback для управления транзакциями в стандартном объекте Workspace.

•	Использовать семейство Workspaces для ссылок на конкретные объекты Workspace.

•	Использовать семейство Errors для получения сведений об ошибках доступа к данным.

Другие свойства и методы являются доступными только при использовании объектов доступа к данным (DAO) совместно с ядром базы данных Microsoft Jet.  Они используются для управления ядром базы данных Microsoft Jet, определении его свойств и выполнения операций над временными объектами, не являющимися компонентами семейств.  Например, пользователь имеет возможность:

•	Использовать метод CreateDatabase для создания нового объекта Database Microsoft Jet.

•	Использовать метод Idle для предоставления ядру Microsoft Jet возможности завершить незаконченные операции.

•	Использовать методы CompactDatabase и RepairDatabase для обработки файлов баз данных.

•	С помощью свойств IniPath и SystemDB указать положение данных о Microsoft Jet в реестре Windows и положение системной базы данных Microsoft Jet, соответственно.  Метод SetOption позволяют указать параметры, имеющие приоритет над параметрами ядра Microsoft Jet, заданными в реестре Windows.

После изменения значений свойств DefaultType и IniPath новые значения свойств будут применяться только при создании новых объектов Workspace.  Свойства существующих объектов изменены не будут.

Примечание.   Полный список методов, свойств и семейств, поддерживаемых объектом DBEngine, см в разделе Общие сведения.

Для ссылки на семейство, принадлежащее объекту DBEngine, или на его метод и свойство используется следующий синтаксис:

[DBEngine.][семейство | метод | свойство]


Объект DBEngine - Общие сведения

Объект DBEngine содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Errors

Properties

Workspaces (Используется по умолчанию)

Методы

BeginTrans

CommitTrans

CompactDatabase

CreateDatabase

CreateWorkspace

Idle

OpenConnection

OpenDatabase

RegisterDatabase

RepairDatabase

Rollback

SetOption

Свойства

DefaultPassword

DefaultType

DefaultUser

IniPath

LoginTimeout

SystemDB

Version


Объект Document

Объект Document содержит сведения о конкретном экземпляре объекта.  Этот объект может быть базой данных, сохраненной таблицей, запросом или связью (только в базах данных Microsoft Jet).

Дополнительные сведения

Каждый объект Container содержит семейство Documents, включающее объекты Document, которые содержат сведения о встроенных объектах данного контейнера.  В следующей таблице приведен список типов объектов, описания которых содержатся в объектах Document, имя соответствующего объекта Container и тип сведений, содержащихся в объекте Document.

Документ	Контейнер	Описываемый объект
База данных	Databases	Сохраненная база данных.
Таблица или запрос	Tables	Сохраненная таблица или запрос.
Связь	Relations	Сохраненная связь.
Примечание.   Не следует путать конкретные типы объектов Container с семействами, имеющими такие же имена.  Например, объект Container типа "Databases" относится ко всем сохраненным объектам указанного типа, в то время как семейство Databases включает только базы данных, открытые в конкретной рабочей области.

Объект Document позволяет:

•	Определить с помощью свойства Name имя, которое было присвоено объекту при его создании пользователем или ядром базы данных Microsoft Jet.

•	Определить с помощью свойства Container имя объекта Container, содержащего данный объект Document.

•	Определить или указать владельца объекта с помощью свойства Owner.  Для того чтобы задать значение свойства Owner, необходимо иметь разрешение на запись для объекта Document.  Задаваемое значение данного свойства должно представлять имя существующего объекта User или Group.

•	Определить или установить разрешения на доступ к объекту для пользователя или группы, с помощью свойств UserName или Permissions.  Для указания значений данных свойств необходимо иметь разрешение на запись для объекта Document, а задаваемое значение свойства UserName должно являться именем существующего объекта User или Group.

•	Определить дату и время создания или последнего изменения объекта Document с помощью свойств DateCreated и LastUpdated.

Объект Document представляет существующий объект базы данных, поэтому невозможно создать новый объект Document или удалить существующие объекты.  При ссылках на объект Document используют его порядковый номер в семействе или значение свойства Name (имя):

Documents(0)

Documents("имя")

Documents![имя]


Семейство Documents

Семейство Documents содержит все объекты Document, относящиеся к определенному типу объектов (только в базах данных Microsoft Jet).

Дополнительные сведения

Каждый объект Container содержит семейство Documents, включающее объекты Document, которые содержат сведения об экземплярах встроенных объектов типа,  определяемого объектом Container.

При ссылках на объект Document используют его порядковый номер в семействе или значение свойства Name (имя):

Documents(0)

Documents("имя")

Documents![имя]


Объект Document, семейство Documents - Общие сведения

Объект Document

Объект Document содержит одно семейство, один метод и следующие свойства.

Семейство

Properties

Метод

CreateProperty

Свойства

AllPermissions

Container

DateCreated

KeepLocal (определяется пользователем)

LastUpdated

Name

Owner

Permissions

Replicable (определяется пользователем)

UserName

Семейство Documents

Семейство Documents содержится в каждом объекте Container, оно содержит один метод и одно свойство.

Метод

Refresh

Свойство

Count


Объект Recordset - Динамический набор записей

Объект Recordset типа динамического набора записей может содержать поля из одной или нескольких таблиц или запросов базы данных.  Эти наборы записей являются обновляемыми.  В базе данных ODBCDirect динамический объект Recordset соответствует указателю ключевого набора записей ODBC.

Дополнительные сведения

Объекты Recordset типа динамического набора записей используют для обработки данными в основной таблице или таблицах.

Эти объекты отличаются от объектов Recordset типа статического набора записей тем, что в них в память загружаются не все данные из записи, а только уникальный ключ, определяющий каждую запись.  В результате, динамический набор записей в нормальных условиях обновляется при изменении содержимого источника, тогда как статический набор записей при этом не изменяется.  Аналогично объектам Recordset типа таблицы, в динамическом наборе записей полная запись загружается только для изменения или вывода на экран.

Для создания объекта Recordset типа динамического набора записей следует применить OpenRecordset к открытой базе данных, к другому динамическому или статическому объекту Recordset, к объекту QueryDef или к объекту TableDef.  (Открытие объекта Recordset на основе другого объекта Recordset или объекта TableDef поддерживается только в рабочей области Microsoft Jet).

Если пользователем затребован объект Recordset типа динамического набора записей, а ядро базы данных Microsoft Jet не может получить доступ к записям на чтение/запись, то может быть создан динамический объект Recordset, доступный только для чтения.

По мере обновления данных пользователями, эти изменения отражаются в основных таблицах.  Измененные данные становятся доступными в исполняющемся приложении при переходе на другую запись.  В сетевой базе данных несколько пользователей могут одновременно открыть объекты Recordset типа динамического набора записей, представляющие одни и те же данные.  Поскольку набор записей является динамическим, то при изменении данных одним пользователем остальные пользователи сразу получат доступ к измененным данным.  Однако если один из пользователей добавит в набор новую запись, то другие пользователи не узнают об этом до тех пор, пока они не применят к объекту Recordset метод Requery.  Если один из пользователей удалит запись, то другие пользователи получат сообщение об этом при попытке получить доступ к удаленной записи.

Записи, добавленные в базу данных, не становятся частью созданного объекта Recordset типа динамического набора записей до их явного добавления с помощью методов AddNew и Update.  Например, при добавлении записей с помощью запроса на изменение, содержащего инструкцию SQL INSERT INTO, новые записи не будут включены в динамический объект Recordset либо до вызова метода Requery, либо до воссоздания объекта Recordset с помощью метода OpenRecordset.

Для сохранения целостности данных ядро базы данных Microsoft Jet блокирует объекты Recordset типа таблиц и динамических наборов записей во время операций Edit (жесткая блокировка) или Update (нежесткая блокировка) таким образом, чтобы в каждый момент времени конкретную запись мог изменить только один пользователь.  При блокировке записи ядром Microsoft Jet блокируется вся содержащая запись странице размером 2 Кбайт.

Нежесткая и жесткая блокировка используются также при работе с таблицами, не являющимися таблицами ODBC.  При доступе к внешним таблицам по протоколу ODBC через рабочую область Microsoft Jet всегда следует использовать нежесткую блокировку.  Тип блокировки при редактировании записей определяется значением свойства LockEdits и значением аргумента блокировки метода OpenRecordset.

Не все поля динамических наборов записей допускают обновление.  Для того чтобы узнать, является ли возможным обновление конкретного поля, следует проверить значение свойства DataUpdatable объекта Field.

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

•	Отсутствует уникальный индекс для таблицы или таблиц ODBC или Paradox.

•	Страница, содержащая данные, блокирована другим пользователем.

•	Запись была изменена после ее последнего считывания.

•	Пользователь не имеет соответствующего разрешения.

•	Одна или несколько таблиц или полей доступны только для чтения.

•	База данных была открыта только для чтения.

•	Объект Recordset был создан либо на основе нескольких таблиц без инструкции JOIN, либо в слишком сложном запросе.

Данные в объекте Recordset не обязательно будут упорядочиваться определенным образом.  Для того чтобы указать определенный порядок записей, следует использовать при создании объекта Recordset инструкцию SQL с предложением ORDER BY.  Допускается также использование предложения WHERE для отбора добавляемых в объект Recordset записей, удовлетворяющих конкретным условиям.  Использование инструкций SQL для отбора и упорядочивания подмножества записей обычно обеспечивает более быстрый доступ к данным, чем использование свойств Filter и Sort.


Объект Error

Объект Error содержит подробные сведения об ошибках доступа к данным, каждая из которых относится к определенной операции с объектом доступа к данным (DAO).

Дополнительные сведения

Любая операция с участием объектов доступа к данным может привести к возникновению одной или нескольких ошибок.  Например, вызов сервера ODBC может привести к ошибке сервера базы данных, к ошибке ODBC или к ошибке DAO.  При возникновении каждой такой ошибки объект Error помещается в семейство Errors объекта DBEngine.  Таким образом, результатом одного события может оказаться появление нескольких объектов Error в семействе Errors.

При возникновении ошибки в другой операции с объектами доступа к данным семейство Errors очищается и в него помещается новый объект Error.  Операции DAO, в которых ошибки не возникают, не оказывают влияния на семейство Errors.

Набор объектов Error в семействе Errors описывает одну ошибку.  Первый объект Error представляет ошибку низшего уровня (исходную ошибку), второй объект ошибку следующего уровня и т.д.  Например, если ошибка ODBC возникает при попытке открыть объект Recordset, то первый объект Error — Errors(0) — содержит ошибку ODBC низшего уровня; следующие объекты-ошибки содержат ошибки ODBC, возвращаемые со следующих уровней программного обеспечения ODBC.  В подобном случае диспетчер драйвера ODBC и, возможно, сам драйвер возвращают отдельные объекты Error.  Последний объект Error — Errors.Count-1 — содержит ошибку DAO, указывающую невозможность открытия объекта.

Просмотр сведений о конкретных ошибках в семействе Errors позволяет более точно определить в программах обработки ошибок причину и источник каждой ошибки и принять соответствующие меры для исправления ситуации.  Как в рабочей области Microsoft Jet, так и в рабочей области ODBCDirect пользователь имеет возможность читать значения свойств Error, чтобы получить подробные сведения о каждой ошибке, включая следующие:

•	Свойство Description содержит текст сообщения об ошибке, которое будет выведено на экран, если ошибка не перехватывается.

•	Свойство Number содержит значение типа Long, представляющее код ошибки.

•	Свойство Source указывает объект, в котором возникла ошибка.  Это особенно полезно, если в семействе Errors появляется несколько объектов Error в результате обращения к источнику данных ODBC.

•	Свойства HelpFile и HelpContext указывают файл справочной системы Microsoft Windows и раздел справки (если они существуют), соответствующие ошибке.

Примечание.   Если при программировании на языке Microsoft Visual Basic для приложений (VBA) ключевое слово New было использовано при создании объекта, ставшего источником ошибки до своего добавления в семейство, то семейство Errors объекта DBEngine не будет содержать ошибку, соответствующую этому объекту, поскольку еще не установлена связь этого объекта с объектом DBEngine.  Однако сведения об этой ошибке будут доступны в объекте Err VBA.

В программах обработки ошибок на языке VBA следует проверять семейство Errors во всех случаях, когда возможно возникновение ошибки доступа к данным.  При создании централизованной программы обработки ошибок следует проверять значение объекта Err VBA, чтобы определить, является ли применимой к конкретной ошибке информация, содержащаяся в семействе Errors.  Если значение свойства Number последнего элемента семейства Errors (с номером DBEngine.Errors.Count - 1) и значение объекта Err совпадают, можно использовать набор инструкций Select Case для идентификации конкретной ошибки или ошибок объектов доступа к данным.  Если эти значения не совпадают, следует вызвать метод Refresh для семейства Errors.


Семейство Errors

Семейство Errors содержит все сохраненные объекты Error, каждый из которых описывает конкретную ошибку при операциях с объектами доступа к данным (DAO).

Дополнительные сведения

Любая операция с участием объектов доступа к данным может привести к возникновению одной или нескольких ошибок.  При возникновении каждой ошибки один или несколько объектов Error помещаются в семейство Errors объекта DBEngine.  При возникновении ошибки в другой операции с объектами доступа к данным семейство Errors очищается и в него помещается новый объект Error.  Объект с максимальным номером в семействе Errors (DBEngine.Errors.Count - 1) соответствует ошибке, возвращаемой объектом Err Microsoft Visual Basic для приложений (VBA).

Операции DAO, в которых ошибки не возникают, не оказывают влияния на семейство Errors.

Для семейства Errors не выполняется операция добавления элементов, как это имеет место в других семействах, поэтому семейство Errors не поддерживает методы Append и Delete.

Набор объектов Error в семействе Errors описывает одну ошибку.  Первый объект Error представляет ошибку низшего уровня, второй объект ошибку следующего уровня и т.д.  Например, если ошибка ODBC возникает при попытке открыть объект Recordset, то первый объект Error содержит ошибку ODBC низшего уровня; следующие объекты-ошибки содержат ошибки ODBC, возвращаемые со следующих уровней программного обеспечения ODBC.  В подобном случае диспетчер драйвера ODBC и, возможно, сам драйвер возвращают отдельные объекты Error.  Последний объект Error содержит ошибку DAO, указывающую невозможность открытия объекта.

Просмотр сведений о конкретных ошибках в семействе Errors позволяет более точно определить в программах обработки ошибок причину и источник каждой ошибки и принять соответствующие меры для исправления ситуации.

Примечание.   Ключевое слово New было использовано при создании объекта, ставшего источником ошибки до своего добавления в семейство Errors, то семейство Errors объекта DBEngine не будет содержать ошибку, соответствующую этому объекту, поскольку еще не установлена связь этого объекта с объектом DBEngine.  Однако сведения об этой ошибке будут доступны в объекте Err VBA.


Объект Error, семейство Errors - Общие сведения

Объект Error

Объект Error не содержит методов и семейств; в нем содержатся следующие свойства:

Свойства

Description

HelpContext

HelpFile

Number

Source

Семейство Errors

Семейство Errors входит в состав объекта DBEngine; оно содержит один метод и одно свойство:

Метод

Refresh

Свойство

Count


Объект Field

Объект Field (поле) представляет столбец данных одного типа, обладающий общим набором свойств.

Дополнительные сведения

Семейство Fields объектов Index, QueryDef, Relation и TableDef содержит спецификации полей, входящих в эти объекты.  Семейство Fields объекта Recordset представляет объекты Field, содержащиеся в строке данных, т.е. в записи.  Объекты Field, входящие в объект Recordset, используются для чтения и задания значений полей в текущей записи объекта Recordset.

Как в рабочей области Microsoft Jet, так и в рабочей области ODBCDirect методы и свойства объекта Field обеспечивают работу с полями.  Например, данный объект позволяет:

•	Определить или указать порядок объектов Field в семействе Fields с помощью свойства OrdinalPosition.  (В базах данных ODBCDirect это свойство доступно только для чтения).

•	С помощью свойства Value поля объекта Recordset задавать или возвращать сохраненные данные.

•	Применять методы AppendChunk и GetChunk и свойство FieldSize для считывания или задания значения поля объекта ActiveX или поля Memo объекта Recordset.

•	С помощью свойств Type, Size и Attributes определить тип данных, которые могут сохраняться в поле.

•	С помощью свойств SourceField и SourceTable определить источник данных.

В рабочей области Microsoft Jet пользователь имеет возможность:

•	С помощью свойства ForeignName задать или возвратить сведения о внешнем поле объекта Relation.

•	С помощью свойств AllowZeroLength, DefaultValue, Required, ValidateOnSet, ValidationRule или ValidationText задать или возвратить условия на значения поля.

•	С помощью свойства DefaultValue поля в объекте TableDef задать значение по умолчанию, которое это поле получит при добавлении новой записи.

В рабочей области ODBCDirect пользователь имеет возможность:

•	С помощью свойств Value, VisibleValue и OriginalValue проверить успешное завершение операции пакетного обновления.

Примечание.   Полный список методов, свойств и семейств, поддерживаемых объектом Field для любой базы данных или подключения, см. в разделе Общие сведения.

Для создания нового объекта Field в объектах Index, TableDef или Relation следует использовать метод CreateField.

Если доступ к объекту Field осуществляется в рамках доступа к объекту Recordset, то данные в текущей записи являются видимыми с помощью свойства Value объекта Field.  Для работы с данными в объекте Recordset обычно нет необходимости в прямых ссылках на семейство Fields; вместо этого используют косвенные ссылки на свойство Value объекта Field в семействе Fields объекта Recordset.

При ссылках на объект Field используют его порядковый номер в семействе или значение свойства Name (имя):

Fields(0)

Fields("имя")

Fields![имя]

Этот же синтаксис используется для ссылок на свойство Value объекта Field, который пользователь создает и добавляет в семейство Fields.  Ссылка на объект Field или на свойство Value объекта Field определяется по контексту.


Семейство Fields

Семейство Fields содержит все сохраненные объекты Field объектов Index, QueryDef, Recordset, Relation или TableDef.

Дополнительные сведения

Семейство Fields объектов Index, QueryDef, Relation и TableDef содержит спецификации полей, входящих в эти объекты.  Семейство Fields объекта Recordset представляет объекты Field, содержащиеся в строке данных, т.е. в записи.  Объекты Field, входящие в объект Recordset, используются для чтения и задания значений полей в текущей записи объекта Recordset.

При ссылках на объект Field используют его порядковый номер в семействе или значение свойства Name (имя):

Fields(0)

Fields("имя")

Fields![имя]

Этот же синтаксис используется для ссылок на свойство Value объекта Field, который пользователь создает и добавляет в семейство Fields.  Ссылка на объект Field или на свойство Value объекта Field определяется по контексту.


Объект Field, семейство Fields - Общие сведения

Объект Field

Объект Field содержит одно семейство и следующие методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области Microsoft Jet.

Семейство

Properties

Методы

В следующей таблице перечислены все методы объекта Field.  Применимость методов определяется типом объекта, в семействе Fields которого содержится объект Field.

Метод	Index	QueryDef	Recordset	Relation	TableDef
AppendChunk
CreateProperty
GetChunk
Свойства

В следующей таблице перечислены все свойства объекта Field.  Применимость свойств определяется типом объекта, в семействе Fields которого содержится объект Field.  Все свойства объектов Field, добавленных в семейство Fields объектов Index, Relation и TableDef, доступны только для чтения.

Только чтение

Чтение/запись

Свойство	Index	QueryDef	Recordset	Relation	TableDef
AllowZeroLength
Attributes
CollatingOrder
DataUpdatable
DefaultValue
FieldSize
ForeignName
Name
OrdinalPosition
OriginalValue			*
Required
Size
SourceField
SourceTable
Type
ValidateOnSet
ValidationRule
ValidationText
Value
VisibleValue			*
* Эти свойства доступны только в рабочей области ODBCDirect, в которой для свойства DefaultCursorDriver задано значение dbUseClientBatchCursor.

Семейство Fields

Семейство Fields входит в состав каждого объекта TableDef, QueryDef, Recordset, Relation и Index; оно содержит следующие методы и одно свойство.

Методы	Index	QueryDef	Recordset	Relation	TableDef
Append
Delete
Refresh
Свойство	Index	QueryDef	Recordset	Relation	TableDef
Count


Объект Group

Объект Group представляет группу учетных записей пользователей, которые имеют общие разрешения при открытии объекта Workspace для защищенной рабочей группы (только в рабочей области Microsoft Jet).

Дополнительные сведения

После создания объектов Group их имена используются для указания и обеспечения соблюдения разрешений на базы данных, таблицы и запросы с помощью объектов Document, представляющих объекты Database, TableDef и QueryDef, с которыми работает пользователь.

При работе с объектом Group пользователь имеет возможность:

•	Использовать свойство Name существующего объекта Group для возвращения его имени.  Не допускается возвращение значения свойства PID существующего объекта Group.

•	Использовать свойства Name и PID нового, еще не добавленного в семейство объекта Group для идентификации этого объекта.

Существующий объект Group можно добавить в семейство Groups объекта User для того, чтобы установить принадлежность пользователя к данной группе.  С другой стороны, можно добавить объект User в семейство Users объекта Group для того, чтобы предоставить пользователю общие разрешения, определенные для данной группы.  Если используемое семейство Groups или Users не совпадает с семейством, в которое был добавлен объект, то может потребоваться вызов метода Refresh для обновления семейства.

В ядре базы данных Microsoft Jet заранее определены три объекта Group с именами "Admins" (администраторы), "Users" (пользователи) и "Guests" (гости).  Чтобы создать новый объект Group следует вызвать метод CreateGroup для объекта User или Workspace.

При ссылках на объект Group используют его порядковый номер в семействе или значение свойства Name (имя):

Groups(0)

Groups("имя")

Groups![имя]


Семейство Groups

Семейство Groups содержит все сохраненные объекты Group, принадлежащие объекту Workspace или учетной записи пользователя (только в рабочей области Microsoft Jet).

Дополнительные сведения

Существующий объект Group можно добавить в семейство Groups объекта User для того, чтобы установить принадлежность пользователя к данной группе.  С другой стороны, можно добавить объект User в семейство Users объекта Group для того, чтобы предоставить пользователю общие разрешения, определенные для данной группы.  В обоих случаях объект Group должен являться компонентом семейства Groups в текущем объекте Workspace.  Если используемое семейство Groups или Users не совпадает с семейством, в которое был добавлен объект, то может потребоваться вызов метода Refresh для обновления семейства.

При ссылках на объект Group используют его порядковый номер в семействе или значение свойства Name (имя):

Groups(0)

Groups("имя")

Groups![имя]


Объект Group, семейство Groups - Общие сведения

Объект Group

Объект Group содержит следующие семейства и свойства и один метод.

Семейства

Properties

Users (используется по умолчанию)

Метод

CreateUser

Свойства

Name

PID

Семейство Groups

Семейство Groups входит в состав каждого объекта User и объекта Workspace Microsoft Jet; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект Index

Объект Index (индекс) описывает отношения упорядочивания и однозначности значений, с помощью которых обеспечивается эффективный доступ к записям в таблицах.  При работе с внешними базами данных объекты Index содержат описания индексов, определенных во внешних таблицах (только в рабочей области Microsoft Jet).

Дополнительные сведения

Индексы используются ядром базы данных Microsoft Jet при объединении таблиц и при создании объектов Recordset.  Индексы определяют порядок записей в возвращаемых объектах Recordset типа таблицы, однако, индексы не влияют на порядок записей, в котором ядро базы данных Microsoft Jet сохраняет записи в основной таблице, а также на порядок записей, возвращаемых в объектах Recordset других типов.

Объект Index позволяет:

•	Определить с помощью свойства Required, обязательно ли объекты Field индекса должны содержать непустые значения (не Null), после чего вызвать метод IgnoreNulls, а с помощью свойства Null определить, имеются ли в индексе записи с пустыми значениями.

•	С помощью свойств Primary и Unique определить отношения упорядочивания и однозначности в объекте Index.

Ядро базы данных Microsoft Jet автоматически осуществляет управление всеми индексами в основной таблице.  Индексы обновляются при добавлении, изменении или удалении записей из основной таблицы.  После создания базы данных следует регулярно вызывать метод CompactDatabase для обновления индексов.

При доступе к объекту Recordset типа таблицы пользователь задает порядок записей с помощью свойства Index объекта.  В значении этого свойства следует указывать значение свойства Name существующего объекта Index из семейства Indexes.  Это семейство содержится в объекте TableDef, который представляет базовую таблицу заполняемого объекта Recordset.

Примечание.   Создавать индексы для таблицы не обязательно, однако, в больших неиндексированных таблицах доступ к конкретной записи или обработка объединений может занимать много времени.  С другой стороны, избыточные индексы могут замедлить обновление базы данных, поскольку при этом обновляется каждый индекс.

Порядок записей и, как следствие, методика доступа к данным для данного индекса определяется свойством Attributes каждого из объектов Field в индексе.

Каждый объект Field из семейства Fields объекта Index является составной частью индекса.  При создании нового индекса необходимо задать значения его свойств до добавления индекса в семейство, чтобы сделать объект Index доступным для последующего использования.

Примечание.   Изменение значения свойства Name существующего объекта Index возможно только в том случае, если свойство Updatable содержащего индексы объекта TableDef имеет значение True.

При создании ключа таблицы ядро Microsoft Jet автоматически определяет данный ключ как первичный индекс.  Первичный индекс состоит из одного или нескольких полей, однозначно определяющих каждую запись и ее положение в таблице.  Поскольку первичный индекс по определению является уникальным, ядро Microsoft Jet автоматически задает значение True для свойства Unique объекта Index, представляющего первичный индекс.  Если первичный индекс включает несколько полей, то в каждом из этих полей могут содержаться повторяющиеся значения, но комбинация значений полей индекса должна быть уникальной.  Первичным индексом является ключ таблицы, а поля его образующие, совпадают с полями ключа.

Внимание!   Пользователь должен обеспечить совместимость данных с атрибутами создаваемого индекса.  Если индекс требует уникальности значений, то повторения не допускаются.  При наличии повторений ядро Microsoft Jet не сможет создать индекс, результатом чего будет возникновение перехватываемой ошибки при попытке вызвать метод Append для нового индекса.

При создании связи, обеспечивающей целостность данных, ядро базы данных Microsoft Jet автоматически создает индекс и устанавливает значение свойства Foreign таким образом, чтобы индекс являлся внешним ключом адресующей таблицы.  После определения связи ядро Microsoft Jet запрещает все изменения и добавления в базе данных, противоречащие условиям связи.  Если значения свойства Attributes объекта Relation допускают операции каскадного обновления и каскадного удаления, то ядро Microsoft Jet автоматически обновляет или удаляет записи в связанных таблицах.

Создание нового объекта Index

1.	Вызовите метод CreateIndex для объекта TableDef.

2.	Вызовите метод CreateField для объекта Index и создайте объект Field для каждого поля (столбца), включаемого в объект Index.

3.	Задайте свойства объекта Index.

4.	Добавьте объекты Field в семейство Fields.

5.	Добавьте объект Index в семейство Indexes.

Примечание.   Значение свойства Clustered игнорируется в базах данных, использующих ядро Microsoft Jet, поскольку это ядро базы данных не поддерживает кластерные индексы.


Семейство Indexes

Семейство Indexes содержит все сохраненные объекты Index объекта TableDef (только в рабочей области Microsoft Jet).

Дополнительные сведения

При доступе к объектам Recordset типа таблицы порядок записей определяется свойством Index объекта.  В значении этого свойства следует указывать значение свойства Name существующего объекта Index из семейства Indexes объекта TableDef, представляющего базовую таблицу объекта Recordset.

Примечание.   Применение методов Append или Delete к семейству Indexes возможно только при значении True свойства Updatable вмещающего объекта TableDef.

Созданный новый объект Index должен быть добавлен в семейство Indexes объекта TableDef с помощью метода Append.

Внимание!   Пользователь должен обеспечить совместимость данных с атрибутами создаваемого индекса.  Если индекс требует уникальности значений, то повторения не допускаются.  При наличии повторений ядро Microsoft Jet не сможет создать индекс, результатом чего будет возникновение перехватываемой ошибки при попытке вызвать метод Append для нового индекса.


Объект Index, семейство Indexes - Общие сведения

Объект Index

Объект Index содержит следующие семейства, методы и свойства.

Семейства

Fields (используется по умолчанию)

Properties

Методы

CreateField

CreateProperty

Свойства

Clustered

DistinctCount

Foreign

IgnoreNulls

Name

Primary

Required

Unique

Семейство Indexes

Семейство Indexes входит в состав каждого объекта TableDef; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект Parameter

Объект Parameter представляет параметр, связанный с объектом QueryDef, который создан на основе запроса с параметрами.

Дополнительные сведения

Объекты Parameter позволяют изменять аргументы, которые используются в часто выполняемых объектах QueryDef, без необходимости перекомпилировать запрос.

В свойствах объекта Parameter определяется параметр запроса, значение которого можно изменить непосредственно перед выполнением запроса.  Данный объект позволяет выполнить следующие действия:

•	Проверить значение свойства Name для определения имени параметра.

•	Проверить или указать значение свойства Value, определяющего используемое в запросе значение параметра.

•	Проверить значение свойства Type для определения типа данных объекта Parameter.

•	С помощью свойства Direction указать или определить, является ли параметр входным параметром, выходным параметром или и тем, и другим.

В рабочей области ODBCDirect пользователь также имеет возможность:

•	Изменить значение свойства Type.  При этом одновременно очищается значение свойства Value.

•	С помощью свойства Direction указать или определить, является ли параметр входным параметром, выходным параметром или и тем, и другим.


Семейство Parameters

Семейство Parameters содержит все объекты Parameter объекта QueryDef.

Дополнительные сведения

Семейство Parameters содержит сведения только о существующих параметрах.  Нельзя добавить объекты в семейство Parameters или удалить из него объекты.


Объект Parameter, семейство Parameters - Общие сведения

Объект Parameter

Объект Parameter не содержит методов; он содержит одно семейство и следующие свойства.

Обозначения:

Поддерживается только в рабочей области ODBCDirect.

Семейство

Properties

Свойства

Direction

Name

Type

Value (используется по умолчанию)

Семейство Parameters

Семейство Parameters входит в состав каждого объекта QueryDef, оно содержит один метод и одно свойство.

Метод

Refresh

Свойство

Count


Объект Property

Объект Property (свойство) представляет встроенную или определенную пользователем характеристику объекта доступа к данным (DAO).

Дополнительные сведения

Каждый объект доступа к данным кроме объектов Connection и Error содержит семейство Properties, в которое входят объекты Property, соответствующие встроенным свойствам конкретного объекта доступа к данным.  Кроме того, пользователь имеет возможность определять объекты Property и добавлять их в семейство Properties некоторых объектов доступа к данным.  Эти объекты Property (которые обычно называют просто свойствами) однозначно определяют характеристики конкретных экземпляров объекта.

Определяемые пользователем свойства можно создавать для следующих объектов:

•	объекты Database, Index, QueryDef и TableDef;

•	объекты Field в семействе Fields объекта QueryDef или TableDef.

Для добавления определяемого пользователем свойства следует воспользоваться методом CreateProperty и создать объект Property с уникальным значением свойства Name.  После этого необходимо задать значения свойств Type и Value нового объекта Property, а затем добавить его в семейство Properties подходящего объекта.  Объект, для которого определяется новое свойство, должен быть предварительно добавлен в семейство.  Ссылка на определяемый пользователем объект Property, не добавленный в семейство Properties, а также попытка добавления определяемого пользователем объекта Property в семейство Properties, содержащее объект Property с тем же именем, приведет к возникновению ошибки.

Из семейства Properties можно удалять определенные пользователем свойства, однако, встроенные свойства удалить невозможно.

Примечание.   Определенное пользователем свойство (объект Property) связано только с конкретным объектом, в семейство которого Properties оно было включено.  Данное свойство не будет определено для всех экземпляров объектов выбранного типа.

Семейство Properties объекта позволяет вывести список свойств объекта, как встроенных, так и определяемых пользователем.  Для работы со свойствами не требуется знать заранее, какие точно свойства существуют для данного объекта или какими характеристиками (свойства Name и Type) этот объект обладает.  Однако попытка прочитать значение свойства, доступного только для записи (такого как свойство Password объекта Workspace), а также попытка записать или прочитать значение свойства в неподходящем контексте, например, значение свойства Value объекта Field в семействе Fields объекта TableDef, приведет к ошибке.

Сам объект Property имеет четыре встроенных свойства:

•	Свойство Name, имеющее значение типа String, которое однозначно определяет данное свойство.

•	Свойство Type, имеющее значение типа Integer, которое однозначно определяет тип данных этого свойства.

•	Свойство Value, принадлежащее к типу Variant, которое представляет значение данного свойства.

•	Свойство Inherited, имеющее значение типа Boolean, которое указывает, было ли данное свойство унаследовано от другого объекта.  Например, объект Field из семейства Fields объекта Recordset может наследовать свойства базовых объектов TableDef или QueryDef.

При ссылках на встроенный объект Property используют его порядковый номер в семействе или значение свойства Name (имя):

объект.Properties(0)

объект.Properties("имя")

объект.Properties![имя]

Для встроенного свойства допускается также следующий синтаксис:

объект.имя

Примечание.   Для определяемого пользователем свойства требуется полный синтаксис объект.Properties("имя").

Те же варианты синтаксиса могут использоваться для ссылок на свойство Value объекта Property.  Ссылка на объект Property или на свойство Value объекта Property определяется по контексту.


Семейство Properties

Семейство Properties содержит все объекты Property (свойства) конкретного экземпляра объекта.

Дополнительные сведения

Каждый объект доступа к данным объектов Connection и Error содержит семейство Properties, в которое входят объекты Property, соответствующие встроенным свойствам конкретного объекта доступа к данным.  Эти объекты Property (которые обычно называют просто свойствами) однозначно определяют характеристики конкретных экземпляров объекта.

В дополнение к встроенным свойствам некоторые объекты позволяют создавать и добавлять новые, определяемые пользователем свойства.  Для добавления определяемого пользователем свойства к конкретному объекту следует сначала определить его характеристики с помощью метода CreateProperty, а затем добавить их в семейство с помощью метода Append.  Ссылка на определяемый пользователем объект Property, не добавленный в семейство Properties, а также попытка добавления определяемого пользователем объекта Property в семейство Properties, содержащее объект Property с тем же именем, приведет к возникновению ошибки.

Метод Delete позволяет удалять из семейства Properties определенные пользователем свойства, однако, встроенные свойства удалить невозможно.

Примечание.   Определенное пользователем свойство (объект Property) связано только с конкретным объектом, в семейство которого Properties оно было включено.  Данное свойство не будет определено для всех экземпляров объектов выбранного типа.

Семейство Properties объекта позволяет вывести список свойств объекта, как встроенных, так и определяемых пользователем.  Для работы со свойствами не требуется знать заранее, какие точно свойства существуют для данного объекта или какими характеристиками (свойства Name и Type) этот объект обладает.  Однако попытка прочитать значение свойства, доступного только для записи (такого как свойство Password объекта Workspace), а также попытка записать или прочитать значение свойства в неподходящем контексте, например, значение свойства Value объекта Field в семействе Fields объекта TableDef, приведет к ошибке.

При ссылках на встроенный объект Property используют его порядковый номер в семействе или значение свойства Name (имя):

объект.Properties(0)

объект.Properties("имя")

объект.Properties![имя]

Для встроенного свойства допускается также следующий синтаксис:

объект.имя

Примечание.   Для определяемого пользователем свойства требуется полный синтаксис объект.Properties("имя").

Те же варианты синтаксиса могут использоваться для ссылок на свойство Value объекта Property.  Ссылка на объект Property или на свойство Value объекта Property определяется по контексту.


Объект Property, семейство Properties - Общие сведения

Объект Property

Объект Property не содержит методов; он содержит одно семейство и следующие свойства.

Семейство

Properties

Свойства

Inherited (всегда False в базах данных ODBCDirect).

Name

Type

Value

Семейство Properties

Семейство Properties входит в состав каждого объекта доступа к данным (DAO) кроме объектов Connection и Error; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект QueryDef

Объект QueryDef представляет сохраненное определение запроса в базе данных Microsoft Jet или временное определение запроса в рабочей области ODBCDirect.

Дополнительные сведения

Объект QueryDef используют для определения запроса.  Например, данный объект позволяет:

•	С помощью свойства SQL задать или возвратить определение запроса.

•	Задать или возвратить параметры запроса с помощью семейства Parameters объекта QueryDef.

•	С помощью свойства Type возвратить значение, показывающее, выполняется ли в запросе выборка записей из существующей таблицы, создание новой таблицы, вставка записей из одной таблицы в другую, удаление записей или обновление записей.

•	С помощью свойства MaxRecords ограничить количество записей, возвращаемых в запросе.

•	С помощью свойства ODBCTimeout указать интервал ожидания для возвращения записей.  Свойство ODBCTimeout применимо к любым запросам, в которых осуществляется доступ к данным ODBC.

В рабочей области Microsoft Jet пользователь также имеет возможность:

•	С помощью свойства ReturnsRecords указать возвращение записей в запрос.  Свойство ReturnsRecords определено только для запросов к серверу SQL.

•	Использовать свойство Connect для создания запроса к серверу SQL, выполняющего запрос к базе данных ODC.

В рабочей области ODBCDirect пользователь также имеет возможность:

•	С помощью свойства Prepare определить, следует ли вызывать программный интерфейс (API) ODBC SQLPrepare при выполнении запроса.

•	С помощью свойства CacheSize определить временный буфер, в который помещаются записи, возвращаемые запросом.

Кроме того, имеется возможность создания временных объектов QueryDef.  В отличие от постоянных объектов QueryDef, временные объекты QueryDef не сохраняются на диске и не добавляются в семейство QueryDefs.  Временные объекты QueryDef полезны в запросах, которые повторно запускаются во время выполнения, но не требуются в сохраненном виде, в особенности, если их инструкции SQL создаются во время выполнения.

Постоянный объект QueryDef в рабочей области Microsoft Jet фактически является откомпилированной инструкцией SQL.  Запросы с помощью постоянных объектов QueryDef выполняются существенно быстрее, чем при запуске эквивалентной инструкции SQL в методе OpenRecordset, поскольку при этом ядро базы данных Microsoft Jet не должно компилировать запрос перед его запуском.

Рекомендуется при доступе к внешней базе данных ядро Microsoft Jet использовать в объектах QueryDef версию языка SQL, используемую внешней базой данных.  Например, можно создать запрос к серверу Microsoft SQL Server и сохранить его в объекте QueryDef.  При необходимости использовать запрос SQL, предназначенный для ядра базы данных, отличного от Microsoft Jet, следует задать строку свойства Connect, указывающую внешний источник данных. Запрос с допустимым значением свойства Connect передается для обработки непосредственно на сервер внешней базы данных в обход ядра Microsoft Jet.

Для создания нового объекта QueryDef следует использовать метод CreateQueryDef.  Если в рабочей области Microsoft Jet указать строку для аргумента имя или явно задать в свойстве Name нового объекта QueryDef строку, не являющуюся пустой строкой, будет создан постоянный объект QueryDef, который будет автоматически добавлен в семейство QueryDefs и сохранен на диске.  Если задать пустую строку в аргументе имя или в свойстве Name, будет создан временный объект QueryDef.

В рабочей области ODBCDirect объект QueryDef всегда является временным.  Все открытые объекты QueryDef содержатся в семействе QueryDefs.  Закрытие объекта QueryDef приводит к его автоматическому удалению из семейства QueryDefs.

При ссылках на объект QueryDef используют его порядковый номер в семействе или значение свойства Name (имя):

QueryDefs(0)

QueryDefs("имя")

QueryDefs![имя]

Для ссылок на временные объекты QueryDef могут использоваться только объектные переменные, которым были присвоены эти объекты.


Семейство QueryDefs

Семейство QueryDefs содержит все объекты QueryDef из объекта Database, представляющего базу данных Microsoft Jet, и все объекты QueryDef из объекта Connection в рабочей области ODBCDirect.

Дополнительные сведения

Для создания нового объекта QueryDef следует использовать метод CreateQueryDef.  Если в рабочей области Microsoft Jet указать строку для аргумента имя или явно задать в свойстве Name нового объекта QueryDef строку, не являющуюся пустой строкой, будет создан постоянный объект QueryDef, который будет автоматически добавлен в семейство QueryDefs и сохранен на диске.  Если задать пустую строку в аргументе имя или в свойстве Name, будет создан временный объект QueryDef.

В рабочей области ODBCDirect объект QueryDef всегда является временным.  Все открытые объекты QueryDef содержатся в семействе QueryDefs.  Закрытие объекта QueryDef приводит к его автоматическому удалению из семейства QueryDefs.

При ссылках на объект QueryDef используют его порядковый номер в семействе или значение свойства Name (имя):

QueryDefs(0)

QueryDefs("имя")

QueryDefs![имя]

Для ссылок на временные объекты QueryDef могут использоваться только объектные переменные, которым были присвоены эти объекты.


Объект QueryDef, семейство QueryDefs - Общие сведения

Объект QueryDef

Объект QueryDef содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Fields

Parameters (используется по умолчанию.)

Properties

Методы

Cancel

Close

CreateProperty

Execute

OpenRecordset

Свойства

CacheSize

Connect

DateCreated

KeepLocal

LastUpdated

LogMessages

MaxRecords

Name

ODBCTimeout

Prepare

RecordsAffected

Replicable

ReturnsRecords

SQL

StillExecuting

Type

Updatable

Семейство QueryDefs

Семейство QueryDefs входит в состав каждого объекта Connection в рабочей области ODBCDirect и каждого объекта Database; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект Recordset

Объект Recordset представляет набор записей в основной таблице или набор записей, который получается в результате выполнения запроса.

Дополнительные сведения

Объекты Recordset используются для обработки данных в базе данных на уровне записи.  При работе с объектами доступа к данным (DAO) почти все операции выполняются с помощью объектов Recordset.  Каждый объект Recordset состоит из записей (строк) и полей (столбцов).  Существуют объекты Recordset пяти типов:

•	Объект Recordset типа таблицы — программное представление основной таблицы; используется для добавления, изменения или удаления записей из отдельной таблицы базы данных (только в рабочей области Microsoft Jet).

•	Объект Recordset типа динамического набора записей — набор обновляемых записей, полученный в результате выполнения запроса.  Объект Recordset типа динамического набора записей позволяет добавлять, изменять или удалять записи в основной таблице или таблицах.  В объекте Recordset этого типа динамического набора могут содержаться поля из одной или нескольких таблиц базы данных.  Этот тип объектов соответствует указателю ключевого набора записей ODBC.

•	Объект Recordset типа статического набора записей — статическая копия набора записей, используемая для поиска данных или создания отчетов.  Объект Recordset типа статического набора записей может содержать поля из одной или нескольких таблиц базы данных, но не допускает обновления полей.  Этот тип объектов соответствует указателю статического набора записей ODBC.

•	Объект Recordset типа статического набора записей с последовательным доступом — аналогичен статическому набору записей с тем лишь исключением, что в нем отсутствует указатель.  Пользователь имеет возможность прокручивать записи только вперед.  Это повышает быстродействие в ситуациях, когда достаточен однократный проход по набору записей.  Этот тип объектов соответствует указателю набора записей с последовательным доступом ODBC.

•	Объект Recordset динамического типа — результирующий набор записей запроса по одной или нескольким основным таблицам, в котором допускается добавление, изменение или удаление записей.  В таком объекте Recordset отображаются записи, добавляемые, удаляемые или изменяемые в основных таблицах другими пользователями.  Этот тип объектов соответствует динамическому указателю ODBC (только в рабочей области ODBCDirect).

При создании нового объекта Recordset тип объекта определяется с помощью аргумента тип метода OpenRecordset.

В рабочей области Microsoft Jet, если аргумент тип не задан, механизм DAO пытается создать тип объекта Recordset с максимально возможными функциональными характеристиками, начиная с таблицы.  Если таблицу создать не удается, делается попытка создать динамический набор записей, затем статический набор записей и наконец, набор записей с последовательным доступом.

В рабочей области ODBCDirect, если аргумент тип не задан, механизм DAO пытается создать тип объекта Recordset, обеспечивающий максимально быстрое выполнение запроса, начиная с набора записей с последовательным доступом.  Если объект этого типа создать невозможно, механизм DAO делает попытку создать статический набор записей, затем динамический набор записей, и наконец, объект Recordset динамического типа.

При создании объекта Recordset на основе неприсоединенного объекта TableDef в рабочей области Microsoft Jet создаются объекты Recordset типа таблицы.  На основе присоединенных таблиц или таблиц в базах данных ODBC, подключенных к ядру Microsoft Jet, могут быть созданы только объекты Recordset типа динамического набора записей или статического набора записей.

Новый объект Recordset автоматически добавляется в семейство Recordsets при открытии объекта и автоматически удаляется из семейства при закрытии объекта.

Примечание.   При описании в программе объекта Recordset и содержащего его объекта Database с помощью объектных переменных необходимо обеспечить, чтобы эти переменные имели одинаковую область определения или одинаковое время жизни.  Например, при описании общей переменной, представляющей объект Recordset, необходимо обеспечить, чтобы переменная, представляющая объект Database, содержащий объект Recordset, также была общей, либо описать эту переменную в процедуре Sub или Function с ключевым словом Static.

В приложении допускается определение произвольного числа объектных переменных, представляющих объект Recordset.  Разные объекты Recordset могут иметь доступ к одним таблицам, запросам и полям без возникновения конфликтов.

Объекты Recordset типа динамического набора записей, статического набора записей и статического набора записей с последовательным доступом сохраняются в локальной оперативной памяти.  Если в оперативной памяти не хватает места, ядро базы данных Microsoft Jet сохраняет избыточные данные в каталоге временных файлов на диске.  Если и этот объем окажется недостаточным, возникает перехватываемая ошибка.

Объекты Recordset по умолчанию помещаются в семейство Fields.  Используемым по умолчанию свойством объекта Field является свойство Value (значение). Эти используемые по умолчанию характеристики позволяют упростить программу.

Если созданный объект Recordset содержит записи, то текущей записью становится первая запись.  Если записи в объекте отсутствуют, свойство RecordCount получает значение 0, а свойства BOF и EOF значение True

Изменить положение указателя текущей записи позволяют методы MoveNext, MovePrevious, MoveFirst и MoveLast.  Для объектов Recordset типа статического набора записей с последовательным доступом поддерживается только метод MoveNext.  При выполнении цикла по всем записям с помощью методов Move ("прохода" по объекту Recordset) свойства BOF и EOF используются для проверки начальной и конечной границы объекта Recordset.

Для объектов Recordset типа динамического статического набора записей в рабочей области Microsoft Jet допускается также использование методов группы Find, таких как FindFirst, позволяющих найти запись, удовлетворяющую определенным условиям.  Если запись не обнаруживается, свойство NoMatch получает значение True.  Для объектов Recordset типа таблицы допускается сканирование записей с помощью метода Seek.

Тип созданного объекта Recordset задается свойством Type, а возможность изменения записей в объекте определяется свойством Updatable.

Сведения о структуре основной таблицы, такие как имя и тип данных каждого поля (объект Field) и индекса (объект Index) сохраняются в объекте TableDef.

При ссылках на объект Recordset используют его порядковый номер в семействе или значение свойства Name (имя):

Recordsets(0)

Recordsets("имя")

Recordsets![имя]

Примечание.   Для одного источника данных или базы данных допускается открытие нескольких объектов Recordset, что приводит к образованию повторяющихся имен в семействе Recordsets.  В этом случае необходимо присваивать объекты Recordset объектным переменным и ссылаться на них по именам переменных.


Семейство Recordsets

Семейство Recordsets содержит все открытые объекты Recordset из объекта Database.

Дополнительные сведения

При работе с объектами доступа к данным почти все операции выполняются с помощью объектов Recordset.

Новый объект Recordset автоматически добавляется в семейство Recordsets при открытии объекта и автоматически удаляется из семейства при закрытии объекта.

В приложении допускается определение произвольного числа объектных переменных, представляющих объект Recordset.  Разные объекты Recordset могут иметь доступ к одним таблицам, запросам и полям без возникновения конфликтов.

При ссылках на объект Recordset используют его порядковый номер в семействе или значение свойства Name (имя):

Recordsets(0)

Recordsets("имя")

Recordsets![имя]

Примечание.   Для одного источника данных или базы данных допускается открытие нескольких объектов Recordset, что приводит к образованию повторяющихся имен в семействе Recordsets.  В этом случае необходимо присваивать объекты Recordset объектным переменным и ссылаться на них по именам переменных.


Объект Recordset, семейство Recordsets - Общие сведения

Объект Recordset

Объект Recordset содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается в рабочих областях Microsoft Jet и ODBCDirect.

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Fields (используется по умолчанию)

Properties

Методы объектов Recordset

В следующей таблице перечислены все методы объектов Recordset и показано, какие типы объектов Recordset и в какой рабочей области, Microsoft Jet или ODBCDirect, поддерживают каждый метод.

Метод	Таблица	ДНЗ	СНЗ	СНЗ ПД	Дин. ODBC
AddNew			*
Cancel
CancelUpdate			*
Clone
Close
CopyQueryDef
Delete			*
Edit			*
FillCache
FindFirst
FindLast
FindNext
FindPrevious
GetRows
Move				Только вперед без отсчета от закладки
MoveFirst
MoveLast
MoveNext
MovePrevious
NextRecordset
OpenRecordset
Requery
Seek
Update			*
* В рабочей области ODBCDirect возможность обновления объектов Recordset типа статического набора записей зависит от драйвера ODBC.  Методы AddNew, Edit, Delete, Update и CancelUpdate применимы к объектам Recordset типа статического набора записей ODBCDirect, если драйвер ODBC поддерживает обновляемые статические наборы записей.

Свойства объектов Recordset

В следующей таблице показано, какие свойства применимы к объектам Recordset каждого из типов, какие свойства доступны для чтения и записи или только для чтения, а также какие свойства всегда имеют значение False в базах данных Microsoft Jet или ODBCDirect.

Только чтение

Чтение/запись

Свойство	Таблица	ДНЗ	СНЗ	СНЗ ПД	Дин.ODBC
AbsolutePosition
BatchCollisionCount
BatchCollisions
BatchSize
BOF
Bookmark
Bookmarkable
CacheSize		Microsoft Jet
		ODBCDirect
CacheStart
Connection
DateCreated
EditMode
EOF
Filter
Index
LastModified			*
LastUpdated
LockEdits		Microsoft Jet	Microsoft Jet
		ODBCDirect	ODBCDirect
Name
NoMatch
PercentPosition
RecordCount
RecordStatus
Restartable	False
Sort
StillExecuting
Transactions			Всегда False	Всегда False
Type
Updatable			Всегда False для Microsoft Jet	Всегда False для Microsoft Jet
			ODBCDirect *	ODBCDirect *
UpdateOptions
ValidationRule
ValidationText
* В рабочей области ODBCDirect возможность обновления объектов Recordset типа статического набора записей зависит от драйвера ODBC.  Свойство LastModified поддерживается, а свойство Updatable имеет значение True только для объектов Recordset типа статического набора записей ODBCDirect, если драйвер ODBC поддерживает обновляемые статические наборы записей.

Семейство Recordsets

Семейство Recordsets входит в состав каждого объекта Connection и Database; оно содержит один метод и одно свойство.

Метод

Refresh

Свойство

Count


Объект Relation

Объект Relation представляет связь между полями таблиц или запросов (только в базах данных Microsoft Jet).

Дополнительные сведения

Объект Relation используют для создания новых связей и просмотра существующих связей в базе данных.

Свойства объекта Relation позволяют выполнить следующие действия:

•	Установить режим сохранения целостности данных для связи между полями в основных таблицах (однако, этого нельзя сделать для связи с участием запроса или присоединенной таблицы).

•	Установить связи без поддержания целостности данных между полями любых таблиц или запросов — принадлежащих базе данных или присоединенных.

•	Ссылаться при помощи свойства Name на связь между полями адресуемой главной таблицы и адресующей внешней таблицы.

•	При помощи свойства Attributes определить тип связи между полями таблиц (отношение "один-к-одному" или отношение "один-ко-многим"), а также режим поддержания целостности данных.

•	Указать с помощью свойства Attributes, может ли ядро Microsoft Jet выполнять операции каскадного обновления и каскадного удаления над главными и внешними связанными таблицами.

•	Указать с помощью свойства Attributes, принадлежит ли связь между таблицами к типу левого объединения или правого объединения.

•	Использовать значения свойства Name всех объектов Field из семейства Fields объекта Relation для задания или возвращения имен полей ключа адресуемой таблицы, а также значения свойства ForeignName объектов Field для задания или возвращения имен полей внешнего ключа адресующей таблицы.

При попытке внесения изменений, противоречащих связям, установленным в базе данных, возвращает перехватываемая ошибка.  При попытке выполнить операции каскадного обновления или каскадного удаления ядро базы данных Microsoft Jet изменяет в таблицах ключ и внешний ключ таким образом, чтобы обеспечить условия установленной связи.

Например, в демонстрационной базе данных "Борей" установлена связь между таблицами "Заказы" и "Клиенты".  Поле "КодКлиента" таблицы "Клиенты" является ключевым, а поле "КодКлиента" в таблице "Заказы" является полем внешнего ключа.  При занесении новой записи в таблицу "Заказы" ядро Microsoft Jet проводит поиск в таблице "Клиенты" записей с совпадающим значением поля "КодКлиента".  Если такая запись не найдена, ядро Microsoft Jet не принимает новую запись, и возникает перехватываемая ошибка.

При задании режима сохранения целостности данных должен существовать уникальный индекс для ключевого поля адресуемой таблицы.  Ядро базы данных Microsoft Jet автоматически создает индекс и устанавливает значение свойства Foreign в адресующей таблице, необходимое для выполнения роли внешнего ключа.

Для создания нового объекта Relation следует вызвать метод CreateRelation.  При ссылках на объект Relation используют его порядковый номер в семействе или значение свойства Name (имя):

Relations(0)

Relations("имя")

Relations![имя]


Семейство Relations

Семейство Relations содержит сохраненные объекты Relation объекта Database (только в базах данных Microsoft Jet).

Дополнительные сведения

Объект Relation используют для создания новых связей и просмотра существующих связей в базе данных.  Чтобы добавить объект Relation в семейство Relations, следует сначала создать этот объект с помощью метода CreateRelation, а затем добавить его в семейство Relations с помощью метода Append.  Это приведет к сохранению объекта Relation при закрытии объекта Database.  Для удаления объекта Relation из семейства следует вызвать метод Delete.

При ссылках на объект Relation используют его порядковый номер в семействе или значение свойства Name (имя):

Relations(0)

Relations("имя")

Relations![имя]


Объект Relation, семейство Relations - Общие сведения

Объект Relation

Объект Relation содержит следующие семейства, один метод и следующие свойства.

Семейства

Fields (используется по умолчанию)

Properties

Метод

CreateField

Свойства

Attributes

ForeignTable

Name

PartialReplica

Table

Семейство Relations

Семейство Relations содержится в каждом объекте Database, представляющем базу данных Microsoft Jet; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект Recordset - Статический набор записей

Объект Recordset типа статического набора записей содержит необновляемый набор записей, которые используются для просмотра данных в основной таблице или таблицах.  В базах данных ODBCDirect объект Recordset типа статического набора записей соответствует указателю статического набора записей.

Дополнительные сведения

Для создания объекта Recordset типа статического набора записей следует применить метод OpenRecordset к открытой базе данных, к другому объекту Recordset типа динамического или статического набора записей или к объекту QueryDef.

Статический набор записей может содержать поля из одной или из нескольких таблиц базы данных.  В рабочей области Microsoft Jet статический набор записей является необновляемым.  В рабочей области ODBCDirect допускается обновление статического набора записей, если такая операция поддерживается драйвером ODBC.

При создании статического объекта Recordset в память из файлов .mdb загружаются значения полей всех типов кроме полей Memo и объектов ActiveX (Long Binary).  Изменения в основных таблицах, сделанные после загрузки набора записей, не отражаются в содержимом статического объекта Recordset.  Для того чтобы привести статический объект Recordset в соответствие с измененными данными следует вызвать метод Requery или повторно выполнить метод OpenRecordset.

Порядок записей в статическом объекте Recordset не подчиняется каким-либо определенным правилам.  Для того чтобы упорядочить данные следует при создании объекта Recordset использовать инструкцию SQL с предложением ORDER BY.  Этот способ используют также при отборе записей с помощью фильтра.  Применение данного приема вместо использования свойств Filter и Sort или вместо проверки значений в каждой записи обычно обеспечивает более быстрый доступ к данным.

Объект Recordset типа статического набора записей обычно создаются быстрее и обеспечивают более быстрый доступ к данным, чем объекты Recordset типа динамического набора записей, поскольку содержащиеся в них записи сохраняются либо в оперативной памяти, либо в каталоге временных файлов на диске.  В результате от ядра базы данных Microsoft Jet не требуется блокировка страниц или выполнения других сетевых операций.  Однако объекты Recordset типа статических наборов записей требуют больше ресурсов, чем объекты Recordset типа динамического набора записей, поскольку в оперативную память загружается целая запись.


Объект Recordset - Таблица

Объект Recordset типа таблицы является программным представлением основной таблицы.  Этот объект используется для добавления, изменения или удаления записей в таблице.  В память загружается только текущая запись.  Для определения порядка записей в объекте Recordset используется заранее определенный индекс (только в рабочей области Microsoft Jet).

Дополнительные сведения

Для создания объекта Recordset типа таблицы следует применить метод OpenRecordset к открытому объекту Database.

Табличный объект Recordset можно создать на основе таблицы базы данных Microsoft Jet, создание такого объекта на основе таблицы ODBC или присоединенной таблицы невозможно.  Допускается также использование табличных объектов Recordset с базами данных ISAM (такими как FoxPro, dBASE или Paradox) при их прямом открытии.

В отличие от объектов Recordset типа динамического или статического набора записей табличный объект Recordset может иметь только одну основную таблицу.  Невозможно создать такой объект с помощью инструкции SQL, в которой задается фильтр или условие сортировки данных.  В общем случае, при доступе к табличному объекту Recordset пользователь указывает один из заранее определенных индексов таблицы, с помощью которого определяется порядок записей, возвращаемых в приложение.  Если таблица не имеет индекса, порядок возвращаемых записей становится неопределенным.  При необходимости, в приложении может быть создан индекс, определяющий порядок возвращаемых записей.  Для того чтобы определить порядок записей в объекте Recordset типа таблицы, следует указать в значении свойства Index имя допустимого индекса.

Кроме того, в отличие от объектов Recordset типа динамического или статического набора записей, нет необходимости явно заполнять табличный объект Recordset, чтобы получить правильное значение свойства RecordCount.

Для обеспечения целостности данных объекты Recordset типа таблицы блокируются на время выполнения операций Edit или Update, позволяя в каждый момент обновлять конкретную запись только одному пользователю.  При блокировке записи ядро базы данных Microsoft Jet блокирует содержащую запись страницу размером 2 Кбайт.

С таблицами, не являющимися таблицами ODBC, используются два типа блокировок — жесткая блокировка и нежесткая блокировка.  Для таблиц, доступ к которым осуществляется по протоколу ODBC, всегда используется нежесткая блокировка.  Условие блокировки, действующей во время изменения записей, определяется значением свойства LockEdits.


Объект TableDef

Объект TableDef (таблица) представляет сохраненное определение основной таблицы или присоединенной таблицы (только в рабочей области Microsoft Jet).

Дополнительные сведения

Работа с определением таблицы проводится с помощью объекта TableDef и его методов и свойств.  Например, данный объект позволяет:

•	Выполнить в базе данных просмотр структуры полей и индексов любой локальной, присоединенной или внешней таблицы.

•	Прочитать или задать значения свойств Connect (подключение) и SourceTableName (имя таблицы-источника) для присоединенных таблиц и вызвать метод RefreshLink для обновления связей с присоединенными таблицами.

•	Прочитать или задать значения свойств ValidationRule и ValidationText, определяющих условия на значение.

•	Использовать метод OpenRecordset для создания на основе описания таблицы объекта Recordset типа таблицы, динамического набора записей, объекта динамического типа, статического набора записей или статического набора записей с последовательным доступом.

Для основных таблиц свойство RecordCount содержит число записей в указанной таблице базы данных.  Для присоединенных таблиц свойство RecordCount всегда имеет значение -1.

Для создания нового объекта TableDef используется метод CreateTableDef.

Добавление поля в таблицу

1.	Проверьте, что все объекты Recordset, базирующиеся на этой таблице, не открыты ни одним пользователем.

2.	Вызовите метод CreateField, чтобы создать объектную переменную для объекта Field и задать ее свойства.

3.	Добавьте объект Field в семейство Fields объекта TableDef с помощью метода Append.

Допускается удаление объекта Field из семейства TableDefs, если этот объект не был использован при создании индексов, однако, при этом будут потеряны все содержащиеся в поле данные.

Создание в базе данных новой таблицы

1.	Вызовите метод CreateTableDef для создания объекта TableDef.

2.	Задайте свойства объекта.

3.	Для каждого поля в таблице создайте объектную переменную для объекта Field и задайте ее свойства с помощью метода CreateField.

4.	Добавьте объект Field в семейство Fields объекта TableDef с помощью метода Append.

5.	Добавьте новый объект TableDef в семейство TableDefs объекта Database с помощью метода Append.

Присоединенная таблица связывается с базой данных с помощью свойств SourceTableName и Connect объекта TableDef.

Присоединение таблицы к базе данных

1.	Вызовите метод CreateTableDef для создания объекта TableDef.

2.	Задайте значения свойств Connect и SourceTableName (и, при необходимости, свойства Attributes).

3.	Добавьте объект TableDef в семейство TableDefs объекта Database с помощью метода Append.

При ссылках на объект TableDef используют его порядковый номер в семействе или значение свойства Name (имя):

TableDefs(0)

TableDefs("имя")

TableDefs![имя]


Семейство TableDefs

Семейство TableDefs содержит все сохраненные объекты TableDef базы данных (только в рабочей области Microsoft Jet).

Дополнительные сведения

Работа с определением таблицы проводится с помощью объекта TableDef и его методов и свойств.

Используемым по умолчанию семейством объекта Database является семейство TableDefs.

При ссылках на объект TableDef используют его порядковый номер в семействе или значение свойства Name (имя):

TableDefs(0)

TableDefs("имя")

TableDefs![имя]


Объект TableDef, семейство TableDefs - Общие сведения

Объект TableDef

Объект TableDef содержит следующие семейства, методы и свойства.

Семейства

Fields (используется по умолчанию)

Indexes

Properties

Методы

CreateField

CreateIndex

CreateProperty

OpenRecordset

RefreshLink

Свойства

Attributes

ConflictTable

Connect

DateCreated

KeepLocal (определяется пользователем)

LastUpdated

Name

RecordCount

Replicable (определяется пользователем)

ReplicaFilter

SourceTableName

Updatable

ValidationRule

ValidationText

Объект TableDef может также иметь свойства, определяемые в приложении.  Дополнительные сведения о чтении и задании значений таких свойств можно найти в справочной системе приложения.

Семейство TableDefs

Семейство TableDefs содержится в каждом объекте Database, представляющем базу данных Microsoft Jet; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект User

Объект User представляет учетную запись пользователя, обладающую разрешениями на доступ при использовании объекта Workspace (рабочая область) для защищенной рабочей группы (только в рабочей области Microsoft Jet).

Дополнительные сведения

Объекты User используются для присваивания и соблюдения разрешений на доступ к объектам Document, представляющим базы данных, таблицы и запросы.  Кроме того, если известны свойства определенного объекта User, то можно создать новый объект Workspace и получить в этом сеансе работы такие же разрешения на доступ к объектам, какие заданы в объекте User.

Добавление существующего объекта User в семейство Users объекта Group предоставляет пользователю общие для данной группы разрешения на доступ к объектам.  С другой стороны, добавление объекта Group в семейство Groups объекта User устанавливает принадлежность учетной записи пользователя к данной группе.  Если используемое семейство Users или Groups не совпадает с семейством, к которому был добавлен объект, то может потребоваться вызов метода Refresh для обновления семейства.

Свойства объекта User позволяют выполнять следующие действия:

•	Проверить значение свойства Name существующего объекта User для определения имени пользователя.  Однако не допускается возвращение значений свойств PID (персональный код) и Password (пароль) существующего объекта User.

•	Указать значения свойств Name, PID и Password нового, только что созданного объекта User, не входящего в семейства, для однозначного определения данного объекта в будущем.  Если значение свойства Password не задано, то в качестве пароля принимается пустая строка ("").

В ядре базы данных Microsoft Jet заранее определены два объекта User с именами "Admin" (администратор) и "Guest" (гость).  Пользователь "Admin" является членом групп "Admins" и "Users", а пользователь "Guest" является только членом группы "Guests".

Для создания нового объекта User используется метод CreateUser.

При ссылках на объект User используют его порядковый номер в семействе или значение свойства Name (имя):

[рабочаяОбласть | группа].Users(0)

[рабочаяОбласть | группа].Users("имя")

[рабочаяОбласть | группа].Users![имя]


Семейство Users

Семейство Users содержит все сохраненные объекты User объекта Workspace или Group (только в рабочей области Microsoft Jet).

Дополнительные сведения

Добавление существующего объекта User в семейство Users объекта Group предоставляет учетной записи пользователя общие для данной группы разрешения на доступ к объектам.  С другой стороны, добавление объекта Group в семейство Groups объекта User устанавливает принадлежность учетной записи пользователя к данной группе.  Если используемое семейство Users или Groups не совпадает с семейством, к которому был добавлен объект, то может потребоваться вызов метода Refresh для обновления семейства.

В ядре базы данных Microsoft Jet заранее определены два объекта User с именами "Admin" (администратор) и "Guest" (гость).  Пользователь "Admin" является членом групп "Admins" и "Users", а пользователь "Guest" является только членом группы "Guests".

При ссылках на объект User используют его порядковый номер в семействе или значение свойства Name (имя):

[рабочаяОбласть | группа].Users(0)

[рабочаяОбласть | группа].Users("имя")

[рабочаяОбласть | группа].Users![имя]


Объект User, семейство Users - Общие сведения

Объект User

Объект User содержит следующие семейства, методы и свойства.

Семейства

Groups (используется по умолчанию)

Properties

Методы

CreateGroup

NewPassword

Свойства

Name

Password

PID

Семейство Users

Семейство Users содержится в каждом объекте Group и объекте Workspace, представляющем рабочую область Microsoft Jet; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект Workspace

Объект Workspace определяет именованный сеанс работы пользователя.  Этот объект содержит открытые базы данных и предоставляет механизмы для одновременного выполнения транзакций, а также, в рабочей области Microsoft Jet, поддерживает работу защищенной рабочей группы.  Этот объект также определяет, осуществляется ли доступ к внешним данным через ядро базы данных Microsoft Jet или через механизм ODBCDirect.

Дополнительные сведения

Объект Workspace является непостоянным объектом, который определяет, осуществляется ли доступ к внешним данным через ядро базы данных Microsoft Jet или через механизм ODBCDirect.  Объект Workspace используется для управления текущим сеансом работы или для запуска дополнительного сеанса.  В каждом работы допускается открытие нескольких баз данных или подключений, а также выполнение транзакций.  Например, данный объект позволяет:

•	Открыть именованный сеанс с использованием свойств Name, UserName и Type.  Сеанс работы создает область определения, в которой возможно открытие нескольких баз данных и проведение одной серии вложенных транзакций.

•	Вызвать метод Close для закрытия сеанса.

•	Вызвать метод OpenDatabase для открытия одной или нескольких существующих баз данных в данном объекте Workspace.

•	Использовать методы BeginTrans, CommitTrans и Rollback для управления вложенными транзакциями в пределах объекта Workspace, а также использовать несколько объектов Workspace для одновременного выполнения нескольких пересекающихся транзакций.

Кроме того, при работе с базой данных Microsoft Jet имеется возможность установить систему защиты, основанную на использовании имен пользователей и паролей:

•	Семейства Groups и Users позволяют установить разрешения на доступ к объектам для пользователей и групп в объекте Workspace.

•	Семейство IsolateODBCTrans позволяет изолировать множественные транзакции, в которых используется одна и та же база данных, подключенная к ядру Microsoft Jet.

Примечание.   Полный список методов, свойств и семейств, поддерживаемых объектом Workspace как для баз данных Microsoft Jet, так и для баз данных ODBCDirect, см. в разделе Общие сведения.

При первой ссылке или первом вызове объекта Workspace автоматически создается стандартная рабочая область DBEngine.Workspaces(0), в которой свойства Name и UserName по умолчанию получают значения, соответственно, "#Default Workspace#" и "Admin".  Если система защиты баз данных активизирована, то значением свойства UserName становится имя подключенного пользователя.

Для создания объекта Workspace ODBCDirect, позволяющего избежать загрузки ядра базы данных Microsoft Jet в память, следует задать константу dbUseODBC в свойстве DefaultType объекта DBEngine или в аргументе тип метода CreateWorkspace.

В транзакциях участвуют все базы данных, входящие в состав данного объекта Workspace, даже если при этом открыто несколько объектов Database.  Например, если пользователь вызывает метод BeginTrans, обновляет несколько записей в базе данных, а затем удаляет записи в другой базе данных, то при вызове метода Rollback свертываются (отменяются) и операции удаления, и операции обновления.  Для того чтобы транзакции выполнялись независимо для разных объектов Database, следует создать или открыть независимые объекты Workspace.

Объекты Workspace создаются с помощью метода CreateWorkspace.  Если предполагается ссылаться на новый объект Workspace через семейство, то необходимо после создания объекта добавить этот объект в семейство Workspaces.

Допускается также использование нового объекта Workspace без его добавления в семейство.  Ссылки на объект при этом осуществляются через объектную переменную, которой присвоен объект.

При ссылках на объект Workspace используют его порядковый номер в семействе или значение свойства Name (имя):

DBEngine.Workspaces(0)

DBEngine.Workspaces("имя")

DBEngine.Workspaces![имя]


Семейство Workspaces

Семейство Workspaces содержит все активные не скрытые объекты Workspace, входящие в объект DBEngine.  (Скрытые объекты Workspace не добавляются в семейство, а ссылки на них выполняются с помощью переменных, которым они присвоены).

Дополнительные сведения

Объект Workspace используется для управления текущим сеансом или для запуска дополнительного сеанса.

При первой ссылке или первом вызове объекта Workspace автоматически создается стандартная рабочая область DBEngine.Workspaces(0), в которой свойства Name и UserName по умолчанию получают значения, соответственно, "#Default Workspace#" и "Admin".  Если система защиты баз данных активизирована, то значением свойства UserName становится имя подключенного пользователя.

Объекты Workspace создаются с помощью метода CreateWorkspace.  Если предполагается ссылаться на новый объект Workspace через семейство, то необходимо после создания объекта добавить этот объект в семейство Workspaces.  Допускается также использование нового объекта Workspace без его добавления в семейство.

При ссылках на объект Workspace используют его порядковый номер в семействе или значение свойства Name (имя):

DBEngine.Workspaces(0)

DBEngine.Workspaces("имя")

DBEngine.Workspaces![имя]


Объект Workspace, cемейство Workspaces - Общие сведения

Объект Workspace

Объект Workspace содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Connections

Databases (используется по умолчанию)

Groups

Properties

Users

Методы

BeginTrans

Close

CommitTrans

CreateDatabase

CreateGroup

CreateUser

OpenConnection

OpenDatabase

Rollback

Свойства

DefaultCursorDriver

IsolateODBCTrans

LoginTimeout

Name

Type

UserName

Семейство Workspaces

Семейство Workspaces содержится в объекте DBEngine; оно содержит следующие методы и одно свойство.

Методы

Append

Delete

Refresh

Свойство

Count


Объект Connection

Объект Connection представляет подключение к базе данных ODBC (только в рабочей области ODBCDirect).

Дополнительные сведения

Объект Connection является непостоянным объектом, представляющим подключение к удаленной базе данных.  Объект Connection доступен только в рабочей области ODBCDirects (т.е. в объекте Workspace, созданном с определяющим его тип параметром dbUseODBC).

Примечание.   В программах, написанных для предыдущих версий механизма объектов доступа к данным (DAO), допускается использование объекта Database.  Однако для использования новых возможностей, представляемых объектом Connection, рекомендуется исправить программы и использовать объект Connection.  Чтобы облегчить преобразование, можно получить ссылку на объект Connection из объекта Database с помощью свойства Connection объекта Database.  Допускается также получение ссылки на объект Database с помощью свойства Database объекта Connection.


Семейство Connections

Семейство Connections содержит текущие объекты Connection из объекта Workspace (только в рабочей области ODBCDirect).

Дополнительные сведения

При открытии объекта Connection он автоматически добавляется в семейство Connections объекта Workspace.  При закрытии объекта Connection с помощью метода Close он удаляется из семейства Connections.  Перед закрытием объекта Connection следует закрыть все открытые объекты Recordset.

Одновременно с открытием объекта Connection соответствующий объект Database создается и добавляется в семейство Databases того же объекта Workspace, и наоборот.  Аналогично этому, при закрытии объекта Connection соответствующий объект Database удаляется из семейства Databases.

Значением свойства Name объекта Connection является строка, указывающая путь к файлу базы данных.  При ссылках на объект Connection используют его порядковый номер в семействе или значение свойства Name (имя):

Connections(0)

Connections("имя")

Connections![имя]

Примечание.   Один и тот же источник данных можно открыть несколько раз, создавая повторяющиеся имена в семействе Connections.  В этом случае необходимо присвоить объекты Connection объектным переменным и ссылаться на них по именам переменных.


Объект Connection, семейство Connections - Общие сведения

Объект Connection

Объект Connection содержит следующие семейства, методы и свойства.

Семейства

QueryDefs (используется по умолчанию)

Recordsets

Методы

Cancel

Close

CreateQueryDef

Execute

OpenRecordset

Свойства

Connect

Database

Name

QueryTimeout

RecordsAffected

StillExecuting

Transactions

Updatable

Семейство Connections

Семейство Connections содержится в каждом объекте Workspace ODBCDirect; оно содержит один метод и одно свойство:

Метод

Refresh

Свойство

Count


Объект Recordset - Статический набор записей с последовательным доступом

Этот тип объектов Recordset идентичен статическому набору записей, с тем лишь исключением, что в нем допускается прокрутка записей только вперед.  Это повышает быстродействие в ситуациях, когда достаточен однократный проход по результирующему набору записей.

В рабочей области ODBCDirect этот тип объектов соответствует указателю набора записей с последовательным доступом ODBC.


Объект Recordset типа статического набора записей с последовательным доступом - Общие сведения

Объект Recordset типа статического набора записей с последовательным доступом содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Fields (используется по умолчанию)

Properties

Методы	Ограничения
AddNew
Cancel
CancelUpdate
Close
CopyQueryDef
Delete
Edit
GetRows
Move	Только для перемещения вперед без использования закладки.
MoveNext
NextRecordset
Requery
Update
Свойства

В следующей таблице отмечены свойства, доступные для чтения/записи, только для чтения, а также всегда имеющие значение False в рабочей области Microsoft Jet или ODBCDirect.

Только чтение

Чтение/запись

Свойства	Ограничения
BatchCollisionCount
BatchCollisions
BatchSize
BOF
Connection
EOF
Filter
Name
RecordCount
RecordStatus
Restartable
StillExecuting
Transactions	Всегда False
Type
Updatable	False
UpdateOptions
ValidationRule
ValidationText


Объект Recordset - Динамический тип

Объект Recordset этого типа представляет результирующий набор записей, возвращаемый запросом из одной или нескольких основных таблиц, в котором пользователь имеет возможность добавлять, изменять или удалять записи.  Кроме того, в этом объекте Recordset выводятся записи, добавленные, удаленные или измененные в основных таблицах другими пользователями.

Этот тип объектов является доступным только в рабочей области ODBCDirect и соответствует динамическому указателю ODBC.


Объект Recordset динамического типа - Общие сведения

Объект Recordset динамического типа содержит следующие семейства, методы и свойства.  Этот тип объектов Recordset, а также его методы и свойства доступны только в рабочей области ODBCDirect.

Семейства

Fields (используется по умолчанию)

Properties

Методы

AddNew

Cancel

CancelUpdate

Close

Delete

Edit

GetRows

Move

MoveFirst

MoveLast

MoveNext

MovePrevious

NextRecordset

Requery

Update

Свойства

В следующей таблице отмечены свойства, доступные для чтения/записи, только для чтения, а также всегда имеющие значение False.

Только чтение

Чтение/запись

Свойства	Ограничения
AbsolutePosition
BatchCollisionCount
BatchCollisions
BatchSize
BOF
Bookmark
Bookmarkable
CacheSize
Connection
EditMode
EOF
LastModified
LockEdits
Name
PercentPosition
RecordCount
RecordStatus
Restartable
StillExecuting
Type
Updatable
UpdateOptions


Объект Recordset типа динамического набора записей - Общие сведения

Объект Recordset типа динамического набора записей содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Fields (используется по умолчанию)

Properties

Методы	Ограничения
AddNew
Cancel
CancelUpdate
Clone
Close
CopyQueryDef
Delete
Edit
FillCache
FindFirst
FindLast
FindNext
FindPrevious
GetRows
Move
MoveFirst
MoveLast
MoveNext
MovePrevious
NextRecordset
OpenRecordset
Requery
Update
Свойства

В следующей таблице отмечены свойства, доступные для чтения/записи, только для чтения, а также всегда имеющие значение False в рабочей области Microsoft Jet или ODBCDirect.

Только чтение

Чтение/запись

Свойства	Ограничения
AbsolutePosition
BatchCollisionCount
BatchCollisions
BatchSize
BOF
Bookmark
Bookmarkable
CacheSize	Microsoft Jet  ODBCDirect
CacheStart
Connection
EditMode
EOF
Filter
LastModified
LockEdits
Name
NoMatch
PercentPosition
RecordCount
RecordStatus
Restartable
Sort
StillExecuting
Transactions
Type
Updatable
UpdateOptions
ValidationRule
ValidationText


Объект Recordset типа статического набора записей - Общие сведения

Объект Recordset типа статического набора записей содержит следующие семейства, методы и свойства.

Обозначения:

Поддерживается только в рабочей области Microsoft Jet.

Поддерживается только в рабочей области ODBCDirect.

Семейства

Fields (используется по умолчанию)

Properties

Методы	Ограничения
AddNew	*
Cancel
CancelUpdate	*
Clone
Close
CopyQueryDef
Delete	*
Edit	*
FindFirst
FindLast
FindNext
FindPrevious
GetRows
Move
MoveFirst
MoveLast
MoveNext
MovePrevious
NextRecordset
OpenRecordset
Requery
Update	*
* В рабочей области ODBCDirect объект Recordset типа статического набора записей допускает обновление, если такая операция поддерживается драйвером ODBC.  Методы AddNew, Edit, Delete, Update и CancelUpdate являются доступными для объектов Recordset типа статического набора записей в рабочей области, если драйвер ODBC поддерживает обновление статических наборов записей.

Свойства

В следующей таблице отмечены свойства, доступные для чтения/записи, только для чтения, а также всегда имеющие значение False в рабочей области Microsoft Jet или ODBCDirect.

Только чтение

Чтение/запись

Свойства	Ограничения
AbsolutePosition
BatchCollisionCount
BatchCollisions
BatchSize
BOF
Bookmark
Bookmarkable
CacheSize
Connection
EditMode
EOF
Filter
LastModified	*
LockEdits
Name
NoMatch
PercentPosition
RecordCount
RecordStatus
Restartable
Sort
StillExecuting
Transactions	Всегда False
Type
Updatable	Всегда False в рабочей области Microsoft Jet; [image] в рабочей области ODBCDirect *
UpdateOptions
ValidationRule
ValidationText
* В рабочей области ODBCDirect объект Recordset типа статического набора записей допускает обновление, если такая операция поддерживается драйвером ODBC.  Свойство LastModified является доступным, а свойство Updatable имеет значение True для объектов Recordset типа статического набора записей, только если драйвер ODBC поддерживает обновление статических наборов записей.


Объект Recordset типа таблицы - Общие сведения

Объект Recordset типа таблицы содержит следующие семейства, методы и свойства.  Объекты Recordset этого типа, а также их методы и свойства доступны только в рабочей области Microsoft Jet.

Семейства

Fields (используется по умолчанию)

Properties

Методы

AddNew

CancelUpdate

Clone

Close

Delete

Edit

GetRows

Move

MoveFirst

MoveLast

MoveNext

MovePrevious

OpenRecordset

Seek

Update

Свойства

В следующей таблице отмечены свойства, доступные для чтения/записи, только для чтения, а также всегда имеющие значение False.

Только чтение

Чтение/запись

Свойства	Ограничения
BOF
Bookmark
Bookmarkable
DateCreated
EditMode
EOF
Index
LastModified
LastUpdated
LockEdits
Name
NoMatch
PercentPosition
RecordCount
Restartable	Всегда False
Transactions
Type
Updatable
ValidationRule
ValidationText


Метод AddNew

Создает новую запись в обновляемом объекте Recordset.

Синтаксис

наборЗаписей.AddNew

Прототип наборЗаписей представляет объектную переменную, задающую обновляемый объект Recordset, в который требуется добавить новую запись.

Дополнительные сведения

Метод AddNew создает и добавляет новую запись в объект Recordset с именем наборЗаписей.  Данный метод присваивает всем полям записи значения Null (пустые значения, присваивающиеся полям объекта Recordset табличного типа по умолчанию) или значения по умолчанию, определенные пользователем.

После внесения изменений в новую запись следует вызвать метод Update для сохранения изменений и добавления записи в объект Recordset.  До вызова метода Update изменения в базу данных не заносятся.

Внимание!   Если вызвать метод AddNew, а затем, не вызывая метод Update, выполнить любую операцию, приводящую к переходу на другую запись, то все изменения будут потеряны без предупреждения.  Кроме того, при закрытии объекта Recordset или завершении процедуры, в которой описан сам объект Recordset или вмещающий объект Database, то новая запись будет потеряна без предупреждения.

Примечание.   Если при использовании метода AddNew в рабочей области ядра Microsoft Jet ядро базы данных должно создать новую страницу для хранения текущей записи, то устанавливается жесткая блокировка страницы.  Если новая запись помещается на существующую страницу, применяется нежесткая блокировка.

Если пользователь не осуществил переход на последнюю запись объекта Recordset, то записи, добавляемые другими процессами в основные таблицы, могут быть включены только в том случае, если их удается разместить после текущей записи.  При добавлении записи пользователем в открытый им объект Recordset эта запись будет видимой в объекте Recordset и будет включена в основную таблицу, где она станет видимой для любого нового объекта Recordset.

Положение новой записи в наборе зависит от типа объекта Recordset:

•	В объектах Recordset типа динамического набора записей новая запись будет добавлена в конец набора вне зависимости от любых правил сортировки или упорядочивания, которые действовали в момент открытия объекта Recordset.

•	В объектах Recordset типа таблицы, имеющих заданное значение свойства Index, записи будут помещены в соответствующее положение, определяемое порядком сортировки.  Если значение свойства Index не задано, то записи добавляются в конец набора записей.

Текущей записью остается та запись, которая была текущей до применения метода AddNew.  При необходимости сделать текущей новую запись можно указать в свойстве Bookmark закладку, ссылка на которую определена в значении свойства LastModified.

Примечание.   Для добавления, изменения или удаления записи необходимо существование уникального индекса для этой записи в базовом источнике данных.  В противном случае возникнет ошибка "Разрешение отсутствует" при вызове метода AddNew, Delete или Edit в рабочей области ядра Microsoft Jet или ошибка "Недопустимый аргумент" при вызове метода Update в рабочей области ODBCDirect.


Метод Append

Добавляет новый объект доступа к данным (DAO) в семейство.

Синтаксис

семейство.Append объект

Синтаксис метода Append содержит следующие элементы.

Элемент	Описание
семейство	Объектная переменная, задающая любое семейство, которое может принимать новые объекты (ограничения перечислены ниже в таблице).
объект	Объектная переменная, задающая добавляемый объект, тип которого должен совпадать с типом компонентов семейства.
Дополнительные сведения

Возможные применения метода Append включают добавление новой таблицы в базу данных, добавление поля в таблицу и добавление поля в индекс.

Добавленный объект становится постоянным объектом и сохраняется на диске до тех пор, пока он не будет удален с помощью метода Delete.  Если семейство представляет семейство Workspaces, которое сохраняется только в памяти, то объект остается активным до тех пор, пока он не будет удален с помощью метода Close.

Добавление нового объекта происходит немедленно, однако, при этом необходимо с помощью метода Refresh обновить все другие семейства, на которые может повлиять внесенное в структуру базы данных изменение.

Если добавляемый объект не является завершенным (например, если ни один объект Field не был добавлен в семейство Fields объекта Index перед его добавлением в семейство Indexes) или если для одного или нескольких подчиненных объектов заданы неверные значения свойств, метод Append генерирует ошибку.  Например, метод Append создает ошибку выполнения при попытке добавить в семейство Fields объекта TableDef объект Field, для которого не был определен тип поля.

В следующей таблице перечислены ограничения на использование метода Append.  В первом столбце таблицы указан объект, содержащий семейство, имя которого приведено во втором столбце.  В третьем столбце перечислены условия, при которых допускается добавление объекта в указанное семейство, если это вообще возможно (например, нельзя добавить объект Container в семейство Containers объекта Database).

Объект	Семейство	Добавление объектов?
DBEngine	Workspaces	Да.
DBEngine	Errors	Нет.  Новые объекты Error добавляются автоматически при возникновении ошибок.
Workspace	Connections	Нет.  Новые объекты добавляются автоматически при вызове метода OpenConnection.
Workspace	Databases	Нет.  Новые объекты добавляются автоматически при вызове метода OpenDatabase.
Workspace	Groups	Да.
Workspace	Users	Да.
Connection	QueryDefs	Нет.  Новые объекты добавляются автоматически при вызове метода CreateQueryDef.
Connection	Recordsets	Нет.  Новые объекты добавляются автоматически при вызове метода OpenRecordset.
Database	Containers	Нет.
Database	QueryDefs	Только для новых объектов QueryDef, еще не добавленных в семейство и не имеющих имени.  Дополнительные сведения см. в разделе справки для метода CreateQueryDef.
Database	Recordsets	Нет.  Новые объекты добавляются автоматически при вызове метода OpenRecordset.
Database	Relations	Да.
Database	TableDefs	Да.
Group	Users	Да.
User	Groups	Да.
Container	Documents	Нет.
QueryDef	Fields	Нет.
QueryDef	Parameters	Нет.
Recordset	Fields	Нет.
Relation	Fields	Да.
TableDef	Fields	Только если свойство Updatable объекта TableDef имеет значение True, или если объект TableDef еще не добавлен.
TableDef	Indexes	Только если свойство Updatable объекта TableDef имеет значение True, или если объект TableDef еще не добавлен.
Index	Fields	Только для новых объектов Index, еще не добавленных в семейство.
Database, Field, Index, QueryDef, TableDef	Properties	Только если объект Database, Field, Index, QueryDef или TableDef принадлежит рабочей области ядра Microsoft Jet.
DBEngine, Parameter, Recordset, Workspace	Properties	Нет.


Метод AppendChunk

Добавляет данные из строкового выражения в объект Field (поле) типа Memo или Long Binary в объекте Recordset.

Синтаксис

наборЗаписей ! поле.AppendChunk источник

Синтаксис метода AppendChunk содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, задающая объект Recordset, который содержит нужное семейство Fields.
поле	Объектная переменная, задающая имя объекта Field, свойство Type которого имеет значение dbMemo (Memo), dbLongBinary (Long Binary) или эквивалентное.
источник	Выражение или переменная типа Variant (подтип String), содержащие данные, которые необходимо добавить в объект Field, определяемый аргументом поле.
Дополнительные сведения

Методы AppendChunk и GetChunk применяются для доступа к фрагментам данных в полях типа Memo или Long Binary.

Кроме того, эти методы используются для экономии пространства, отведенного для записи строк при работе с полями Memo и Long Binary.  Некоторые операции (например, копирование) выполняются с применением временных строк.  Если объем памяти ограничен, то экономнее работать не с целыми полями, а с их фрагментами.

Если при вызове метода AppendChunk текущая запись не определена, возникает ошибка.

Примечания

•	При первом вызове метода AppendChunk (после вызова метода Edit или AddNew) содержимое поле заменяется на значение строкового выражения.  Добавление строкового выражения к содержимому поля осуществляется при последующих вызовах AppendChunk в рамках сеанса редактирования, открытого в одном методе Edit или AddNew.

•	В рабочей области ODBCDirect, если ранее не было изменено поле в текущей записи, вызвать метод AppendChunk в режиме Edit невозможно (хотя ошибка при этом не возникает).

•	После вызова метода AppendChunk для поля в рабочей области ODBCDirect чтение или запись в это поле с помощью инструкции присвоения невозможны до выхода из текущей записи и последующего возвращения в нее.  Это выполняется с помощью методов MoveNext и MovePrevious.


Методы BeginTrans, CommitTrans, Rollback

Данные методы позволяют управлять выполнением транзакции во время сеанса, определяемого объектом Workspace:

•	BeginTrans открывает новую транзакцию.

•	CommitTrans завершает текущую транзакцию и сохраняет изменения.

•	Rollback отменяет текущую транзакцию и восстанавливает базы данных, принадлежащие объекту Workspace, в том состоянии, в котором они находились перед началом текущей транзакции.

Синтаксис

рабочаяОбласть.BeginTrans | CommitTrans [dbFlushOSCacheWrites] | Rollback

Прототип рабочаяОбласть представляет объектную переменную, задающую объект Workspace, содержащий базы данных, которые используют транзакции.

Дополнительные сведения

Данные методы объекта Workspace применяются в том случае, когда требуется выполнить как одну операцию ряд изменений, вносимых в базу данных в сеансе работы.

Как правило, транзакции используются для обеспечения целостности данных, когда требуется одновременно обновить записи в двух или нескольких таблицах и необходимо обеспечить, чтобы изменения были занесены во все таблицы (завершить транзакцию) или не были занесены ни в одну (свернуть транзакцию).  Например, при переводе денег с одного счета на другой следует снять необходимую сумму с одного счета и добавить ту же сумму на другой счет.  Если любая из операций обновления не будет выполнена, то баланс счетов будет нарушен.  В подобном случае следует применить метод BeginTrans перед обновлением первой записи, а затем, если любое из последующих обновлений будет неудачным, применить метод Rollback для отмены всех обновлений.  После успешного завершения последнего обновления следует применить метод CommitTrans для сохранения изменений.

В рабочей области Microsoft Jet пользователь имеет возможность задать в методе CommitTrans константу dbFlushOSCacheWrites,  Это приводит к принудительной записи на диск всех обновлений вместо их помещения во временный буфер.  Без этого параметра пользователь может перехватить управление сразу после вызова метода CommitTrans программой приложения, выключить компьютер, и отказаться от записи данных на диск. Хотя включение данного параметра может сказаться на быстродействии приложения, это оказывается полезным в ситуациях, когда возможно отключение компьютера до сохранения на диске кэшированных изменений.

Внимание!   В пределах одного объекта Workspace транзакции всегда являются глобальными и не ограничиваются только одним объектом Connection или Database.  Если операции транзакции проводились в пределах одного сеанса работы над несколькими подключениями или базами данных в объекте Workspace, то разрешение транзакции (т.е. вызов метода CommitTrans или Rollback) затрагивает все операции для всех подключений и баз данных в этой рабочей области.

После вызова метода CommitTrans отмена внесенных во время транзакции изменений становится невозможной за исключением случая, когда данная транзакция была вложена в другую транзакцию, которую можно свернуть.  При использовании вложенных транзакций необходимо разрешить текущую транзакцию до разрешения транзакции высшего уровня вложенности.

Если требуется одновременно выполнять несколько независимых (не вложенных) перекрывающихся транзакций, то следует создать дополнительные объекты Workspace, которые будут содержать конкурирующие транзакции.

Если объект Workspace будет закрыт без явного завершения или отмены открытых транзакций, то транзакции будут автоматически свернуты.

Попытка вызвать методы CommitTrans или Rollback без предварительного вызова метода BeginTrans приводит к ошибке.

Некоторые базы данных ISAM, используемые в рабочей области ядра Microsoft Jet, могут не поддерживать транзакции.  В этом случае свойство Transactions объекта Database или Recordset получает значение False.  Для того чтобы проверить, поддерживает ли база данных транзакции, следует проверить значение свойства Transactions объекта Database перед вызовом метода BeginTrans.  При работе с объектом Recordset, содержащим записи из нескольких баз данных, следует проверить значение свойства Transactions объекта Recordset.  Если объект Recordset создан только на основе таблиц Microsoft Jet, то транзакции всегда возможны.  Объекты Recordset, базирующиеся на таблицах, созданных в других СУБД, могут не поддерживать транзакции.  Например, не допускается выполнение транзакций для объекта Recordset, созданного на основе таблицы Paradox.  В этом случае свойство Transactions имеет значение False.  Если объекты Database или Recordset не поддерживают транзакции, то вызовы методов управления транзакциями игнорируются и ошибка не возникает.

Вложенные транзакции нельзя использовать при работе с источниками данных ODBC с помощью ядра базы данных Microsoft Jet.

Примечания

•	Объединение операций с базой данных, требующих обращения к диску, в блоки транзакций часто позволяет повысить производительность приложения.  Такой подход обеспечивает буферизацию операций и может сильно уменьшить число обращений к диску.

•	В рабочей область ядра Microsoft Jet транзакции регистрируются в файле, который сохраняется в каталоге, указанном в переменной среды TEMP, определенной для данной рабочей станции.  Если файл журнала транзакций исчерпывает доступное пространство на диске, на котором находится каталог TEMP пользователя, ядро базы данных генерирует ошибку выполнения.  В таком случае при вызове метода CommitTrans результаты некоторых операций окажутся занесенными, а результаты остальных незавершенных операций будут потеряны.  Это делает необходимым повторение операции.  Вызов метода Rollback освобождает файл журнала транзакций и свертывает все операции транзакции.


Метод CancelUpdate

Отменяет все предстоящие изменения объекта Recordset.

Синтаксис

наборЗаписей.CancelUpdate тип

Синтаксис метода CancelUpdate содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая объект Recordset, для которого отменяются отложенные обновления.
тип	Необязательный.  Константа, указывающая тип обновления, как описано ниже в разделе "Значения" (только в рабочей области ODBCDirect).
Значения

Для аргумента тип допускается использование следующих значений, если включен режим пакетного обновления.

Константа	Описание
dbUpdateRegular	По умолчанию.  Отмена отложенных обновлений, не помещенных во временный буфер.
dbUpdateBatch	Отмена отложенных обновлений, находящихся во временном буфере.
Дополнительные сведения

Метод CancelUpdate отменяет любые предстоящие операции обновления, являющиеся следствием вызова методов Edit или AddNew.  Это означает, что если пользователь вызвал методы Edit или AddNew и еще не вызвал метод Update, то метод CancelUpdate приведет к отмене всех изменений, которые были следствием вызова методов Edit или AddNew.

Для того чтобы определить, имеются ли операции, которые можно отменить, следует проверить значение свойства EditMode объекта Recordset.

Примечание.   Вызов метода CancelUpdate приводит к тем же результатам, как и переход на другую запись без вызова метода Update, с тем лишь исключением, что при этом не изменяется положение текущей записи и не изменяются значения таких свойств как BOF и EOF.


Метод Clone

Создает копию объекта Recordset, которая связана с исходным объектом.

Синтаксис

Set копия = оригинал.Clone

Синтаксис метода Clone содержит следующие элементы.

Элемент	Описание
копия	Объектная переменная, определяющая создаваемую копию объекта Recordset.
оригинал	Объектная переменная, задающая копируемый объект Recordset.
Дополнительные сведения

Метод Clone используется для создания нескольких копий объекта Recordset.  Каждый объект Recordset может иметь свою собственную текущую запись.  Использование метода Clone само по себе не вызывает изменения данных в объектах или изменения их структуры.  С помощью метода Clone создают общие взаимозаменяемые закладки для двух или нескольких наборов записей.

Метод Clone применяют в том случае, когда необходимо выполнить операцию с объектом Recordset, затрагивающую сразу несколько текущих записей.  Работа с копией объекта является более быстрой и более эффективной, чем создание второго независимого объекта Recordset.  Набор записей, созданный с помощью метода Clone, первоначально не имеет текущей записи.  Для создания текущей записи перед использованием копии объекта Recordset необходимо задать значение свойства Bookmark или применить один из методов группы Move, один из методов группы Find или метод Seek.

Применение метода Close к одному из объектов (оригиналу или копии) не влияет на второй объект.  Например, вызов Close для исходного объекта Recordset не приводит к закрытию копии.

Примечания

•	Закрытие копии объекта Recordset с незавершенной транзакцией приводит к неявному вызову метода Rollback.

•	При создании копии объекта Recordset табличного типа в рабочей области ядра Microsoft Jet свойство Index не копируется в новую копию объекта Recordset.  Свойство Index необходимо копировать явным образом.

•	Применение метода Clone к объектам Recordset с последовательным доступом допускается только в рабочей области ODBCDirect.


Метод Close

Закрывает открытый объект доступа к данным (DAO).

Синтаксис

объект.Close

Прототип объект представляет объектную переменную, задающую открытый объект Connection, Database, Recordset или Workspace.

Дополнительные сведения

Закрытие объекта удаляет открытый объект из семейства, в которое он добавлен.  Любая попытка закрыть стандартную рабочую область игнорируется.

При вызове метода Close для уже закрытого объекта Connection, Database, Recordset или Workspace возникает ошибка выполнения.

Внимание!   При выходе из процедуры, в которой описаны объекты Connection, Database или Recordset, эти объекты закрываются, все незавершенные транзакции свертываются, а результаты всех незаконченных операций редактирования теряются.

Попытка закрыть объект Connection или Database при наличии открытых объектов Recordset приводит к закрытию объектов Recordset и отмене всех незавершенных операций обновления или изменения.  Аналогично, попытка закрыть объект Workspace при наличии любых открытых объектов Connection или Database приводит к закрытию объектов Connection и Database, в результате чего будут закрыты принадлежащие им объекты Recordset.

Применение метода Close к одному из объектов Recordset (оригиналу или копии) не влияет на второй объект.

Для удаления объектов из обновляемых семейств, отличных от семейств Connections, Databases, Recordsets и Workspaces, следует применять к этим семействам метод Delete.  Добавление новых компонентов в семейства Containers, Documents и Errors не допускается.

Альтернативой методу Close может служить задание для объектной переменной значения Nothing (Set dbsTemp = Nothing).


Метод CompactDatabase

Копирует и сжимает закрытую базу данных, предоставляя дополнительную возможность изменить версию, порядок символов при сортировке и состояние шифрования (только в рабочей области ядра Microsoft Jet).

Синтаксис

DBEngine.CompactDatabase стараяБД, новаяБД, порядок, параметры, пароль

Синтаксис метода CompactDatabase содержит следующие элементы.

Элемент	Описание
стараяБД	Выражение или переменная типа String, определяющая существующую закрытую базу данных.  Следует указать полный путь и имя файла, например "C:\db1.mdb".  это поддерживается сетевой операционной системой, можно также указать сетевой путь к файлу, например, "\\server1\share1\dir1\db1.mdb".
новаяБД	Выражение или переменная типа String, содержащая полный путь к создаваемой сжатой базе данных.  Для этого аргумента также допускается указание сетевого пути к файлу.  В аргументе новаяБД нельзя задавать ту же базу данных, которая указана в аргументе стараяБД.
порядок	Необязательный.  Выражение или переменная типа Variant, содержащая строковое выражение, применяемое для определения порядка символов (национальной языковой), который будет использоваться в операциях сравнения и сортировки в базе данных, определяемой аргументом новаяБД, как указано ниже в разделе "Значения".  Если данный аргумент опущен, национальная настройка новой базы данных будет определяться порядком символов, заданным в старой базе данных.
	Допускается также создание пароля для базы данных новаяБД путем слияния строки пароля (начинающейся с символов ";pwd=") с константой в аргументе порядок, например:
	dbLangCyrillic & ";pwd=МойПароль"
	Если требуется задать то же значение аргумента порядок, что и в базе данных стараяБД (значение по умолчанию), но указать новый пароль, достаточно ввести строку пароля как значение аргумента порядок:
	";pwd=НовыйПароль"
параметры	Необязательный.  Константа или комбинация констант, которая определяет один или несколько параметров, как указано ниже в разделе "Значения".  Пользователь имеет возможность комбинировать параметры путем суммирования констант.
пароль	Необязательный.  Выражение или переменная типа Variant, содержащая выражение, задающее пароль для базы данных с парольной защитой.  Паролю должна предшествовать строка ";pwd=".  Если пароль задан в аргументе порядок, данный аргумент игнорируется.
Значения

В аргументе порядок используются следующие константы, определяющих значение свойства CollatingOrder, т.е. язык, в соответствии с правилами которого определяется порядок символов, используемый при сравнении текстовых строк.

Константа	Порядок символов
dbLangGeneral	Английский, немецкий, французский, португальский, итальянский и современный испанский.
dbLangArabic	Арабский.
dbLangChineseSimplified	Упрощенный китайский.
dbLangChineseTraditional	Традиционный китайский.
dbLangCyrillic	Русский.
dbLangCzech	Чешский.
dbLangDutch	Голландский.
dbLangGreek	Греческий.
dbLangHebrew	Иврит.
dbLangHungarian	Венгерский.
dbLangIcelandic	Исландский.
dbLangJapanese	Японский.
dbLangKorean	Корейский.
dbLangNordic	Скандинавские языки (только для версии ядра Microsoft Jet 1.0).
dbLangNorwDan	Норвежский и датский.
dbLangPolish	Польский.
dbLangSlovenian	Словенский.
dbLangSpanish	Традиционный испанский.
dbLangSwedFin	Шведский и финский.
dbLangThai	Тайский.
dbLangTurkish	Турецкий.
Следующие константы определяют в аргументе параметры режим шифрования или дешифрования базы данных во время сжатия.

Константа	Описание
dbEncrypt	Шифрование базы данных при сжатии.
dbDecrypt	Дешифрование базы данных при сжатии.
Если опустить константу шифрования или указать обе константы dbDecrypt и dbEncrypt, новаяБД будет иметь то же состояние шифрования, что и стараяБД.

Следующие константы, применяемые для задания значения аргумента параметры, позволяют установить формат конкретной версии для сжатой базы данных.  Эти константы определяют только версию базы данных новаяБД и не влияют на формат любых объектов Microsoft Access, таких как формы или отчеты.

Константа	Описание
dbVersion10	Создание сжатой базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 1.0.
dbVersion11	Создание сжатой базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 1.1.
dbVersion20	Создание сжатой базы данных, в которой используется формат файла ядро базы данных Microsoft Jet версии 2.0.
dbVersion30	Создание сжатой базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 3.0 (совместимый с версией 3.5).
Допускается указание только одной константы версии.  Если константа версии опущена, новаяБД будет создана в той же версии, что и стараяБД.  При сжатии новаяБД может быть создана в той же версии, что и стараяБД, или в более поздней.

Дополнительные сведения

По мере изменения его содержимого файл базы данных может стать фрагментированным и занимать больше места на диске, чем необходимо.  Для дефрагментации файла базы данных следует периодически проводить его сжатие с помощью метода CompactDatabase.  Сжатие базы данных обычно приводит к экономии места на диске и часто повышает производительность.  Кроме этого, при этом имеется возможность изменить порядок символов, используемый для операций сортировки, зашифровать или дешифровать базу данных или указать для базы данных формат другой версии.

Перед сжатием старой базы данных ее необходимо закрыть.  В многопользовательской среде ни один из пользователей не сможет открыть базу данных стараяБД во время выполнения сжатия.  Если стараяБД не закрыта или недоступна для монопольного доступа, возникает ошибка.

Поскольку в методе CompactDatabase создается копия базы данных, необходимо иметь достаточно места на диске как для исходной базы данных, так и для ее копии.  При нехватке свободного пространства операция сжатия выполнена не будет.  Новая база данных не обязательно должна находиться на том же диске, что и старая база данных.  После успешного выполнения операции сжатия исходную базу данных можно стереть и присвоить сжатой базе данных старое имя.

Метод CompactDatabase копирует все данные и разрешения системы защиты базы данных стараяБД в базу данных новаяБД.

После преобразования с помощью метода CompactDatabase базы данных версии 1.x в формат версии 2.5 или 3.x, база данных может быть открыта только приложениями, использующими ядро Microsoft Jet версии 2.5 или 3.x.

Примечание.   В рабочей области ODBCDirect вызов метода CompactDatabase не приводит к возвращению ошибки, так как ядро Microsoft Jet при этом загружается в память.

Внимание!   Поскольку метод CompactDatabase не приводит к преобразованию объектов Microsoft Access, не рекомендуется его использовать для преобразования баз данных, содержащих такие объекты.  Пользуйтесь для этого командой Преобразовать из подменю Служебные программы в меню Сервис Microsoft Access.


Метод CopyQueryDef

Возвращает объект QueryDef, являющийся копией объекта QueryDef, который был использован при создании объекта Recordset, представляемого переменной наборЗаписей (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set запрос = наборЗаписей.CopyQueryDef

Синтаксис метода CopyQueryDef содержит следующие элементы.

Элемент	Описание
запрос	Объектная переменная, определяющая создаваемую копию объекта QueryDef.
наборЗаписей	Объектная переменная, задающая объект Recordset, созданный для исходного объекта QueryDef.
Дополнительные сведения

Метод CopyQueryDef используется для создания нового объекта QueryDef, являющегося копией объекта QueryDef, который был использован для создания объекта Recordset.

Если объект QueryDef не был использован при создании данного объекта Recordset, возникает ошибка.  Перед вызовом метода CopyQueryDef необходимо открыть объект Recordset с помощью метода OpenRecordset.

Данный метод полезен в ситуации, когда пользователь создает объект Recordset с помощью объекта QueryDef, а затем передает объект Recordset в функцию, в которой должна быть воссоздана эквивалентная инструкция SQL запроса, например, для ее изменения.


Метод CreateDatabase

Создает новый объект Database, сохраняет базу данных на диске и возвращает открытый объект Database (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set базаДанных = рабочаяОбласть.CreateDatabase (имя, порядок, параметры)

Синтаксис метода CreateDatabase содержит следующие элементы.

Элемент	Описание
базаДанных	Объектная переменная, задающая создаваемый объект Database.
рабочаяОбласть	Объектная переменная, задающая существующий объект Workspace, в котором будет содержаться база данных.  Если рабочаяОбласть, не указывается, используется стандартный объект Workspace.
имя	Выражение типа String длиной до 255 символов, определяющее имя файла создаваемой базы данных.  Следует указать полный путь и имя файла, например "C:\db1.mdb".  Если пользователь не указывает расширение имени, автоматически добавляется расширение .mdb.  Если сетевая операционная система это допускает, можно также указать сетевой путь к файлу, например, "\\server1\share1\dir1\db1".  Данный метод позволяет создавать только файлы .mdb.
порядок	Строковое выражение, определяющее порядок символов, который будет использоваться в операциях сравнения и сортировки в создаваемой базе данных, как указано ниже в разделе "Значения".  Данный аргумент является обязательным, в противном случае возникает ошибка.
	Допускается также создание пароля для нового объекта Database путем слияния строки пароля (начинающейся с символов ";pwd=") с константой в аргументе порядок, например:
	dbLangCyrillic & ";pwd=МойПароль"
	Если требуется задать то же значение аргумента порядок, что и в базе данных стараяБД (значение по умолчанию), но указать новый пароль, достаточно ввести строку пароля как значение аргумента порядок:
	";pwd=НовыйПароль"
параметры	Необязательный.  Константа или комбинация констант, которая определяет один или несколько параметров, как указано ниже в разделе "Значения".  Пользователь имеет возможность комбинировать параметры путем суммирования констант.
Значения

В аргументе порядок используются следующие константы, определяющих значение свойства CollatingOrder, т.е. язык, в соответствии с правилами которого определяется порядок символов, используемый при сравнении текстовых строк.

Константа	Порядок символов
dbLangGeneral	Английский, немецкий, французский, португальский, итальянский и современный испанский.
dbLangArabic	Арабский.
dbLangChineseSimplified	Упрощенный китайский.
dbLangChineseTraditional	Традиционный китайский.
dbLangCyrillic	Русский.
dbLangCzech	Чешский.
dbLangDutch	Голландский.
dbLangGreek	Греческий.
dbLangHebrew	Иврит.
dbLangHungarian	Венгерский.
dbLangIcelandic	Исландский.
dbLangJapanese	Японский.
dbLangKorean	Корейский.
dbLangNordic	Скандинавские языки (только для версии ядра Microsoft Jet 1.0).
dbLangNorwDan	Норвежский и датский.
dbLangPolish	Польский.
dbLangSlovenian	Словенский.
dbLangSpanish	Традиционный испанский.
dbLangSwedFin	Шведский и финский.
dbLangThai	Тайский.
dbLangTurkish	Турецкий.
Следующие константы определяют в аргументе параметры версию формата данных и режим шифрования или дешифрования базы данных во время сжатия.

Константа	Описание
dbEncrypt	Создание зашифрованной базы данных.
dbVersion10	Создание базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 1.0.
dbVersion11	Создание базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 1.1.
dbVersion20	Создание базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 2.0.
dbVersion30	(По умолчанию).  Создание базы данных, в которой используется формат файла ядра базы данных Microsoft Jet версии 3.0 (совместимый с версией 3.5).
Если константа шифрования не указана, метод CreateDatabase создает незашифрованную базу данных.  Допускается указание только одной из констант описания версии.  Если константа версии не указана, создается база данных, в формате ядра Microsoft Jet версии 3.0.

Дополнительные сведения

В методе CreateDatabase создается и открывается новая пустая база данных и возвращается объект Database.  Пользователь должен окончательно определить ее структуру и содержимое с помощью дополнительных объектов доступа к данным (DAO).  При необходимости создать частичную или полную копию существующей базы данных для ее дальнейшего использования следует применять метод CompactDatabase.


Метод CreateField

Создает новый объект Field (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set поле = объект.CreateField (имя, тип, размер)

Синтаксис метода CreateField содержит следующие элементы.

Элемент	Описание
поле	Объектная переменная, задающая создаваемый объект Field.
объект	Объектная переменная, задающая объект Index, Relation или TableDef, в котором создается новый объект Field.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая уникальное имя нового объекта Field.  Сведения о допустимых именах полей приведены в разделе о свойстве Name.
тип	Необязательный.  Константа, определяющая тип данных нового объекта Field.  Сведения о допустимых константах определения типа данных приведены в разделе о свойстве Type.
размер	Необязательный.  Выражение или переменная типа Variant (подтип Integer), определяющая в байтах максимальный размер объекта Field, содержащего текстовые значения. Сведения о допустимых значениях аргумента размер приведены в разделе о свойстве Size.  Для числовых полей и текстовых полей постоянной длины данный аргумент игнорируется.
Дополнительные сведения

Метод CreateField используется для создания нового поля и для указания имени, типа данных и размера поля.  Если опустить какие-либо элементы синтаксиса при вызове метода CreateField, то можно задать или изменить значения соответствующего свойства с помощью инструкции присваивания перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство допускается изменение значений некоторых (но не всех) свойств поля.  Дополнительные сведения приведены в разделах, посвященных отдельным свойствам.

Аргументы тип и размер применимы только к объектам Field, описывающим поля объектов TableDef.  Для объектов Field, описывающих поля объектов Index и Relation, эти аргументы игнорируются.

Если аргумент имя указывает на объект, который уже добавлен в семейство, то при вызове метода Append возникает ошибка выполнения.

Для удаления объекта Field из семейства Fields следует применить к семейству метод Delete. Не допускается удаление объекта Field из семейства Fields объекта TableDef после создания индекса, включающего данное поле.


Метод CreateGroup

Создает новый объект Group (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set группа = объект.CreateGroup (имя, код)

Синтаксис метода CreateGroup содержит следующие элементы.

Элемент	Описание
группа	Объектная переменная, задающая создаваемый объект Group.
объект	Объектная переменная, задающая объект User или Workspace, в котором создается новый объект Group.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String),содержащая уникальное имя нового объекта Group.  Сведения о допустимых именах групп приведены в разделе о свойстве Name.
код	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая код учетной записи группы. Код учетной записи группы должен содержать от 4 до 20 букв или цифр.  Сведения о допустимых значениях кода учетной записи приведены в разделе о свойстве PID (код учетной записи).
Дополнительные сведения

Метод CreateGroup используется для создания нового объекта Group в объекте User или Workspace.  Если опустить какие-либо элементы синтаксиса при вызове метода CreateGroup, то можно задать или изменить значения соответствующего свойства с помощью инструкции присваивания перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство допускается изменение значений некоторых (но не всех) свойств группы.  Дополнительные сведения приведены в разделах, посвященных отдельным свойствам.

Если аргумент имя указывает на объект, который уже добавлен в семейство, то при вызове метода Append возникает ошибка выполнения.

Для удаления объекта Group из семейства Groups следует применить к семейству метод Delete.


Метод CreateIndex

Создает новый объект Index (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set индекс = таблица.CreateIndex (имя)

Синтаксис метода CreateIndex содержит следующие элементы.

Элемент	Описание
индекс	Объектная переменная, задающая создаваемый индекс.
таблица	Объектная переменная, задающая объект TableDef, который используется для создания нового объекта Index.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String),  содержащая уникальное имя нового объекта Index.  Сведения о допустимых именах индексов приведены в разделе о свойстве Name.
Дополнительные сведения

Метод CreateIndex используется при создании нового объекта Index для объекта TableDef.  Если опустить необязательный аргумент имя при вызове метода CreateIndex, то можно воспользоваться подходящей инструкцией присваивания для задания или изменения значения свойства Name перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство возможность изменения значения свойства Name будет определяться типом объекта, содержащего семейство Indexes.  Дополнительные сведения приведены в разделе, посвященном свойству Name.

Если аргумент имя указывает на объект, который уже добавлен в семейство, то при вызове метода Append возникает ошибка выполнения.

Для удаления объекта Index из семейства следует применить к семейству метод Delete.


Метод CreateProperty

Создает новый определяемый пользователем объект Property (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set свойство = объект.CreateProperty (имя, тип, значение, кодDDL)

Синтаксис метода CreateProperty содержит следующие элементы.

Элемент	Описание
свойство	Объектная переменная, представляющая создаваемый объект Property.
объект	Объектная переменная, представляющая объект Database, Field, Index, QueryDef, Document или TableDef, который используется при создании нового объекта Property.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая уникальное имя нового объекта Property.  Сведения о допустимых именах свойств приведены в разделе о свойстве Name.
тип	Необязательный.  Константа, определяющая тип данных нового объекта Property.  Сведения о допустимых константах определения типа данных приведены в разделе о свойстве Type.
значение	Необязательный.  Выражение или переменная типа Variant, содержащая начальное значение свойства.  Дополнительные сведения приведены в разделе о свойстве Value.
кодDDL	Необязательный.  Выражение или переменная типа Variant (подтип Boolean), указывающая, является или нет объект Property объектом языка описания данных (DDL).  По умолчанию задается значение False.  Если кодDDL имеет значение True, данный объект Property может быть изменен или удален только пользователем, имеющим разрешение dbSecWriteDef.
Дополнительные сведения

Определяемый пользователем объект Property может быть создан только в постоянном семействе Properties (то есть уже сохраненном на диске).

Если один или несколько необязательных элементов синтаксиса опущены при вызове метода CreateProperty, допускается использование соответствующих инструкций присваивания для задания или изменения значения соответствующего свойства перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство можно будет изменить значения некоторых (но не всех) его свойств.  Дополнительные сведения приведены в разделах, посвященных свойствам Name, Type и Value.

Если аргумент имя указывает на объект, который уже добавлен в семейство, то при вызове метода Append возникает ошибка выполнения.

Для удаления определяемого пользователем объекта Property следует применить метод Delete к семейству Properties.  Встроенные свойства удалить нельзя.

Примечание.   Если опустить аргумент кодDDL, он по умолчанию получает значение False (объект не является объектом DDL).  Поскольку свойства, определяющего объект языка описания данных, не существует, то для превращения объекта DDL в объект, не являющийся объектом DDL, необходимо для преобразования объекта удалить и снова создать объект Property.


Метод CreateQueryDef

Создает новый объект QueryDef в указанном объекте Connection или Database.

Синтаксис

Set запрос = объект.CreateQueryDef (имя, строкаSQL)

Синтаксис метода CreateQueryDef содержит следующие элементы.

Элемент	Описание
запрос	Объектная переменная, представляющая создаваемый объект QueryDef.
объект	Объектная переменная, представляющая открытый объект Connection или Database, который содержит новый объект QueryDef.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая уникальное имя нового объекта QueryDef.
строкаSQL	Необязательный.  Выражение или переменная типа Variant (подтип String), представляющая инструкцию SQL, которая определяет объект QueryDef.  Если данный аргумент будет опущен, то можно определить объект QueryDef путем задания значения его свойства SQL до или после добавления созданного объекта в семейство.
Дополнительные сведения

В рабочей области ядра Microsoft Jet, если при создании объекта QueryDef для имени задано любое значение, кроме пустой строки, то созданный объект QueryDef будет автоматически добавлен в семейство QueryDefs.  В рабочей области ODBCDirect объекты QueryDef всегда являются временными.

В рабочей области ODBCDirect аргумент строкаSQL может задавать как инструкцию SQLТ так и сохраненную процедуру Microsoft SQL Server вместе с ее параметрами.

Если объект, определяемый аргументом имя, уже является компонентом семейства QueryDefs, возникает ошибка выполнения.  Пользователь имеет возможность создать временный объект QueryDef, задавая пустую строку в аргументе имя при вызове метода CreateQueryDef.  Тот же результат будет получен, если задать пустую строку как значение свойства Name нового объекта QueryDef.  Временные объекты QueryDef полезны в ситуации, когда требуется повторно выполнять динамические инструкции SQL без создания постоянных объектов в семействе QueryDefs.  Временный объект QueryDef нельзя добавить ни в одно семейство, поскольку пустая строка не является допустимым значением имени постоянного объекта QueryDef.  Для созданного объекта QueryDef всегда имеется возможность задать значения свойств Name и SQL, после чего данный объект будет добавлен в семейство QueryDefs

Для выполнения инструкции SQL, содержащейся в объекте QueryDef, следует вызвать метод Execute или OpenRecordset.

Использование объектов QueryDef является лучшим способом выполнения запросов к серверу SQL в базах данных ODBC.

Для удаления объекта QueryDef из семейства QueryDefs в базе данных Microsoft Jet следует применить метод Delete к семейству.  В базе данных ODBCDirect следует вызвать метод Close для объекта QueryDef.


Метод CreateRelation

Создает новый объект Relation (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set связь = базаДанных.CreateRelation (имя, таблица, внешняяТаблица, атрибуты)

Синтаксис метода CreateRelation содержит следующие элементы.

Элемент	Описание
связь	Объектная переменная, представляющая создаваемый объект Relation.
базаДанных	Объектная переменная, представляющая объект Database, который используется при создании нового объекта Relation.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая уникальное имя нового объекта Relation.  Дополнительные сведения о допустимых именах объекта Relation приведены в разделе для свойства Name.
таблица	Необязательный.  Выражение или переменная типа Variant (подтип String), задающая имя главной таблицы связи.  Если указанная таблица не существует на момент добавления объекта Relation в семейство, возникает ошибка выполнения.
внешняяТаблица	Необязательный.  Выражение или переменная типа Variant (подтип String), задающая имя внешней таблицы связи.  Если указанная таблица не существует на момент добавления объекта Relation в семейство, возникает ошибка выполнения.
атрибуты	Необязательный.  Константа или комбинация констант, содержащая информацию о типе связи.  Дополнительные сведения приведены в разделе для свойства Attributes.
Дополнительные сведения

Объект Relation передает в ядро базы данных Microsoft Jet описание связи между полями двух объектов TableDef или QueryDef.  Пользователь имеет возможность задать с помощью свойства Attributes условия целостности данных.

Если один или несколько необязательных элементов синтаксиса опущены при вызове метода CreateRelation, допускается использование соответствующих инструкций присваивания для задания или изменения значения соответствующего свойства перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство ни одно из значений свойств связи изменить нельзя.  Дополнительные сведения приведены в разделах, посвященных конкретным свойствам.

Перед вызовом метода Append для объекта Relation, необходимо добавить в семейства соответствующие объекты Field, чтобы определить ключ и внешний ключ в таблицах.

Если аргумент имя указывает на объект, который уже добавлен в семейство, или если имена объектов Field в подчиненном семействе Fields являются недопустимыми, то при вызове метода Append возникает ошибка выполнения.

Не допускается создание или поддержание связи между реплицированной таблицей и локальной таблицей.

Для удаления объекта Relation из семейства Relations следует применить метод Delete к семейству.


Метод CreateTableDef

Создает новый объект TableDef (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set таблица = базаДанных.CreateTableDef (имя, атрибуты, источник, подключение)

Синтаксис метода CreateTableDef содержит следующие элементы.

Элемент	Описание
таблица	Объектная переменная, представляющая создаваемый объект TableDef.
базаДанных	Объектная переменная, представляющая объект Database, который используется при создании нового объекта TableDef.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая уникальное имя нового объекта TableDef.  Дополнительные сведения о допустимых именах объектов TableDef приведены в разделе для свойства Name.
атрибуты	Необязательный.  Константа или комбинация констант, задающая одну или несколько характеристик нового объекта TableDef. Дополнительные сведения приведены в разделе для свойства Attributes.
источник	Необязательный.  Выражение или переменная типа Variant (подтип String), задающая имя таблицы внешней базы данных, являющейся источником данных.  Строка источник становится значением свойства SourceTableName нового объекта TableDef.
подключение	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая информацию об источнике данных открытой базы данных, о базе данных, используемой в запросе к серверу, или о присоединенной таблице.  Дополнительные сведения о допустимых строках подключения приведены в разделе для свойства Connect.
Дополнительные сведения

Если один или несколько необязательных элементов синтаксиса опущены при вызове метода CreateTableDef, допускается использование соответствующих инструкций присваивания для задания или изменения значения соответствующего свойства перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство допускается изменение значений некоторых (но не всех) свойств таблицы.  Дополнительные сведения приведены в разделах, посвященных конкретным свойствам.

Если аргумент имя указывает на объект, который уже добавлен в семейство или если для добавляемого объекта TableDef или Field заданы недопустимые значения свойств, то при вызове метода Append возникает ошибка выполнения.  Кроме того, добавление объекта TableDef в семейство TableDefs невозможно до описания по крайней мере одного объекта Field в объекте TableDef.

Для удаления объекта TableDef из семейства TableDefs следует применить метод Delete к семейству.


Метод CreateUser

Создает новый объект User (только в рабочей области ядра Microsoft Jet).

Синтаксис

Set пользователь = объект.CreateUser (имя, код, пароль)

Синтаксис метода CreateUser содержит следующие элементы.

Элемент	Описание
пользователь	Объектная переменная, представляющая создаваемый объект User.
объект	Объектная переменная, представляющая объект Group или Workspace, который используется при создании нового объекта User.
имя	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая уникальное имя нового объекта User.  Дополнительные сведения о допустимых именах объекта User приведены в разделе для свойства Name.
код	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая код учетной записи пользователя.  Код пользователя должен содержать от 4 до 20 букв или цифр.  Дополнительные сведения приведены в разделе для свойства PID.
пароль	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая пароль для нового объекта User.  Пароль может содержать до 14 любых символов кроме пустого символа ASCII 0.  Дополнительные сведения о допустимых паролях приведены в разделе для свойства Password.
Дополнительные сведения

Если один или несколько необязательных элементов синтаксиса опущены при вызове метода CreateUser, допускается использование соответствующих инструкций присваивания для задания или изменения значения соответствующего свойства перед добавлением нового объекта в семейство.  После добавления нового объекта в семейство можно будет изменить значения некоторых (но не всех) его свойств.  Дополнительные сведения приведены в разделах, посвященных свойствам PID, Name и Password.

Если аргумент имя указывает на объект, который уже добавлен в семейство, то при вызове метода Append возникает ошибка выполнения.

Для удаления объекта User из семейства Users следует применить метод Delete к семейству.


Метод CreateWorkspace

Создает новый объект Workspace.

Синтаксис

Set рабочаяОбласть = CreateWorkspace(имя, пользователь, пароль, тип)

Синтаксис метода CreateWorkspace содержит следующие элементы.

Элемент	Описание
рабочаяОбласть	Объектная переменная, представляющая создаваемый объект Workspace.
имя	Выражение или переменная типа String, содержащая уникальное имя нового объекта Workspace.  Дополнительные сведения о допустимых именах объектов Workspace приведены в разделе для свойства Name.
пользователь	Выражение или переменная типа String, определяющая владельца нового объекта Workspace.  Дополнительные сведения приведены в разделе для свойства UserName.
пароль	Выражение или переменная типа String, содержащая пароль для нового объекта Workspace.  Пароль может содержать до 14 любых символов кроме пустого символа ASCII 0.  Дополнительные сведения о допустимых паролях приведены в разделе для свойства Password.
тип	Необязательный.  Константа, определяющая тип рабочей области, как это описано в разделе "Значения".
Значения

Значения аргумента тип задаются с помощью следующих констант.

Константа	Описание
dbUseJet	Создание рабочей области ядра Microsoft Jet.
dbUseODBC	Создание рабочей области ODBCDirect.
Дополнительные сведения

После создания нового объекта Workspace с помощью метода CreateWorkspace открывается сеанс для новой рабочей области и становятся возможными ссылки на объект Workspace в приложении.

Объекты Workspace не являются постоянными и не сохраняются на диске.  После создания нового объекта Workspace не допускается изменение значения любого из его свойств, за исключением свойства Name, которое пользователь может изменить перед добавлением объекта Workspace в семейство Workspaces.

Новый объект Workspace не обязательно добавлять в семейство перед началом работы с этим объектом.  Новый объект Workspace следует добавлять в семейство только в том случае, если требуется ссылаться на этот объект через семейство Workspaces.

Аргумент тип определяет, представляет ли новый объект Workspace рабочую область ядра Microsoft Jet или рабочую область ODBCDirect.  Если значением аргумента тип является константа dbUseODBC и при этом не создана ни одна рабочая область ядра Microsoft Jet, то ядро базы данных Microsoft Jet не будет загружено в память и все операции будут выполняться с источником данных ODBC, указанным в объекте Connection.  Если аргумент тип опущен, источник данных для объекта Workspace будет определяться значением свойства DefaultType объекта DBEngine.  Допускается сосуществование открытых рабочих областей Microsoft Jet и ODBCDirect.

Для удаления объекта Workspace из семейства Workspaces следует закрыть все открытые базы данных, а затем вызвать метод Close для объекта Workspace.


Метод Delete

•	Объекты Recordset — Метод удаляет текущую запись в обновляемом объекте Recordset.  В рабочей области ODBCDirect тип драйвера определяет, являются ли объекты Recordset обновляемыми и, как следствие, поддерживают ли они метод Delete.

•	Семейства — Метод удаляет постоянный объект из семейства.

Синтаксис

наборЗаписей.Delete

семейство.Delete имяОбъекта

Синтаксис метода Delete содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая обновляемый объект Recordset, содержащий удаляемую запись.
семейство	Объектная переменная, представляющая семейство, из которого удаляется имяОбъекта.
имяОбъекта	Выражение или переменная типа String, представляющая значение свойства Name объекта в семействе.
Дополнительные сведения

Метод Delete используют для удаления текущей записи из объекта Recordset или для удаления объектов из семейств, таких как сохраненная таблица в базе данных, сохраненное поле в таблице или сохраненный индекс в таблице.

Объекты Recordset

При удалении записей из объекта Recordset должен иметь текущую запись, определенную перед вызовом метода Delete; в противном случае возникает ошибка выполнения.

В обновляемом объекте Recordset метод Delete удаляет текущую запись и делает ее недоступной.  Удаленная запись остается текущей записью, хотя ее нельзя изменить или использовать.  После перехода на другую запись сделать удаленную запись текущей записью невозможно.  Последующие ссылки на удаленную запись в объекте Recordset являются недопустимыми и приводят к ошибке.

При использовании транзакций удаленную запись можно восстановить с помощью метода Rollback.

Если основная таблица является главной таблицей в схеме каскадного удаления, то удаление текущей записи может привести к удалению одной или нескольких записей во внешней таблице.

Примечание.   Для добавления, изменения или удаления записи необходимо существование уникального индекса для этой записи в базовом источнике данных.  В противном случае возникнет ошибка "Разрешение отсутствует" при вызове метода AddNew, Delete или Edit в рабочей области ядра Microsoft Jet или ошибка "Недопустимый аргумент" при вызове метода Update в рабочей области ODBCDirect.

Семейства

Метод Delete позволяет удалить постоянный объект.  Однако в семействах Databases, Recordsets или Workspaces (каждое из которых сохраняется только в оперативной памяти) удаление открытого или активного объекта допускается только после закрытия этого объекта с помощью метода Close.

Удаление сохраненного объекта происходит немедленно, однако, при этом следует вызвать метод Refresh для обновления всех других семейств, на которые может повлиять изменение структуры базы данных.

При удалении объекта TableDef из семейства TableDefs происходит удаление как описания таблицы, так и всех данных в этой таблице.

В следующей таблице перечислены ограничения на использование метода Delete.  Для каждой строки таблицы в первом столбце указан объект, который содержит семейство из второго столбца.  В третьем столбце приведены условия, при которых допускается удаление объекта из указанного семейства, если это вообще возможно (например, нельзя удалить объект Container из семейства Containers объекта Database).

Объект	Семейство	Допускается вызов метода Delete?
DBEngine	Workspaces	Нет.  Объекты удаляются при их закрытии.
DBEngine	Errors	Нет.
Workspace	Connections	Нет.  Объекты удаляются при их закрытии.
Workspace	Databases	Нет.  Объекты удаляются при их закрытии.
Workspace	Groups	Да.
Workspace	Users	Да.
Connection	QueryDefs	Нет.
Connection	Recordsets	Нет.  Объекты удаляются при их закрытии.
Database	Containers	Нет.
Database	QueryDefs	Да.
Database	Recordsets	Нет.  Объекты удаляются при их закрытии.
Database	Relations	Да.
Database	TableDefs	Да.
Group	Users	Да.
User	Groups	Да.
Container	Documents	Нет.
QueryDef	Fields	Нет.
QueryDef	Parameters	Нет.
Recordset	Fields	Нет.
Relation	Fields	Только если объект Relation является новым и не добавлен в семейство.
TableDef	Fields	Только если объект TableDef является новым и не добавлен в базу данных, или когда свойство Updatable объекта TableDef имеет значение True.
TableDef	Indexes	Только если объект TableDef является новым и не добавлен в базу данных, или когда свойство Updatable объекта TableDef имеет значение True.
Index	Fields	Только если объект Index является новым и не добавлен в базу данных.
Database, Field, Index, QueryDef, TableDef	Properties	Только если свойство является определяемым пользователем.
DBEngine, Parameter, Recordset, Workspace	Properties	Нет.


Метод Edit

Копирует текущую запись из обновляемого объекта Recordset в буфер копирования для последующего изменения.

Синтаксис

наборЗаписей.Edit

Прототип наборЗаписей представляет открытый обновляемый объект Recordset, который содержит подлежащую изменению запись.

Дополнительные сведения

После вызова метода Edit все изменения, внесенные в поля текущей записи, помещаются в буфер копирования.  После того как все необходимые изменения будут внесены, следует вызвать метод Update для сохранения изменений.

После вызова метода Edit текущая запись остается текущей.

Внимание!   Если после изменения записи перейти к следующей записи без вызова метода Update, то все внесенные изменения будут отменены без предупреждения.  Кроме того, все изменения записи будут потеряны без предупреждения, если закрыть наборЗаписей или завершить процедуру, в которой описан объект Recordset, а также родительский объект Database или Connection.

Вызов метода Edit приводит к возникновению ошибки в следующих случаях:

•	Отсутствует текущая запись.

•	Объект Connection, Database или Recordset был открыт только для чтения.

•	Ни одно из полей записи не является обновляемым.

•	Объект Database или Recordset был открыт другим пользователем для монопольного доступа (в рабочей области ядра Microsoft Jet).

•	Страница, содержащая текущую запись, блокирована другим пользователем (в рабочей области ядра Microsoft Jet).

Если при работе в сети в рабочей области ядра Microsoft Jet для свойства LockEdits объекта Recordset задано значение True (жесткая блокировка), запись блокируется с момента вызова метода Edit до завершения обновления.  При значении False свойства LockEdits (нежесткая блокировка), запись блокируется и сравнивается с исходным содержимым записи непосредственно перед обновлением записи в базе данных.  В ситуации, когда запись была изменена другим пользователем после вызова метода Edit, вызов метода Update приводит к ошибке выполнения, если метод OpenRecordset был вызван без указания константы dbSeeChanges.  По умолчанию, при подключении к ядру Microsoft Jet базы данных ODBC и устанавливаемых драйверов ISAM всегда используют нежесткую блокировку.

В рабочей области ODBCDirect после изменения (и вызова метода Update для обновления) ключевого поля записи пользователь не имеет возможности дальнейшего изменения полей этой записи до закрытия объекта Recordset и последующей загрузки записи с помощью запроса.

Примечание.   Для добавления, изменения или удаления записи необходимо существование уникального индекса для этой записи в базовом источнике данных.  В противном случае возникнет ошибка "Разрешение отсутствует" при вызове метода AddNew, Delete или Edit в рабочей области ядра Microsoft Jet или ошибка "Недопустимый аргумент" при вызове метода Update в рабочей области ODBCDirect.


Метод Execute

Выполняет запрос на изменение или инструкцию SQL для указанного объекта Connection или Database.

Синтаксис

объект.Execute источник, параметры

запрос.Execute параметры

Синтаксис метода Execute содержит следующие элементы.

Элемент	Описание
объект	Объектная переменная, представляющая объект Connection или Database, для которого будет выполнен запрос.
запрос	Объектная переменная, представляющая объект QueryDef, свойство SQL которого содержит выполняемую инструкцию SQL.
источник	Выражение или переменная типа String, содержащая инструкцию SQL или значение свойства Name объекта QueryDef.
параметры	Необязательный.  Константа или комбинация констант, определяющая характеристики целостности данных, как описано в разделе "Значения".
Значения

В аргументе параметры используются следующие константы.

Константа	Описание
dbDenyWrite	Запрет доступа на запись для других пользователей (в рабочей области ядра Microsoft Jet).
dbInconsistent	(Значение по умолчанию).  Выполнение несогласованных обновлений (в рабочей области ядра Microsoft Jet).
dbConsistent	Выполнение согласованных обновлений (в рабочей области ядра Microsoft Jet).
dbSQLPassThrough	Выполнение запроса к серверу SQL. Инструкция SQL передается для обработки на базу данных ODBC (в рабочей области ядра Microsoft Jet).
dbFailOnError	Отмена всех внесенных изменений при возникновении ошибки (в рабочей области ядра Microsoft Jet).
dbSeeChanges	Возникновение ошибки при выполнении, если во время сеансе редактирования данные изменены другим пользователем (в рабочей области ядра Microsoft Jet).
dbRunAsync	Асинхронное выполнение запроса (только для объектов Connection и QueryDef в рабочей области ODBCDirect).
dbExecDirect	Выполнение инструкции без предварительного вызова функции API ODBC SQLPrepare (только для объектов Connection и QueryDef в рабочей области ODBCDirect).
Примечание.   Константы dbConsistent и dbInconsistent являются взаимоисключающими.  При каждом вызове метода OpenRecordset разрешается использование только одной из них.  Одновременное указание констант dbConsistent и dbInconsistent приводит к ошибке.

Дополнительные сведения

Метод Execute определен только для запросов на изменение.  При попытке применить метод Execute к запросу другого типа возникает ошибка.  Поскольку запрос на изменение не возвращают записей, при вызове метода Execute Recordset объект не возвращается.  (Выполнение запроса к серверу SQL в рабочей области ODBCDirect не приводит к возвращению ошибки в случае, когда объект Recordset не возвращается).

Свойство RecordsAffected объекта Connection, Database или QueryDef позволяет определить число записей, измененных в результате последнего вызова метода Execute.  Например, в свойстве RecordsAffected регистрируется число записей, удаленных, обновленных или вставленных при выполнении запроса на изменение.  При запуске объекта Querydef с помощью метода Execute число измененных записей регистрируется в свойстве RecordsAffected объекта Querydef.

В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке — даже если не удается изменить или удалить ни одну из записей.  Поэтому всегда следует использовать параметр dbFailOnError при запуске с помощью метода Execute запроса на обновление или удаление записей.  Данный параметр задает генерирование ошибки выполнения и позволяет отменить все успешно проведенные изменения, если какие-либо из записей оказались заблокированными и не допускают изменения или удаления.

Для достижения максимальной производительности в рабочей области Microsoft Jet, особенно в многопользовательской среде, следует применять вложенные в транзакции вызовы метода Execute.  Сначала следует применить метод BeginTrans к текущему объекту Workspace, затем вызвать метод Execute, после чего завершить транзакцию с помощью метода CommitTrans объекта Workspace.  Такая последовательность позволяет сохранить изменения на диске и обеспечивает снятие любых блокировок, которые могли быть установлены во время выполнения запроса.

В рабочей области ODBCDirect необязательная константа dbRunAsync задает выполнение запроса в асинхронном режиме.  Для того чтобы определить, выполняется ли в данный момент запрос в асинхронном режиме, следует проверить значение свойства StillExecuting объекта, для которого был вызван метод Execute.  Чтобы прекратить выполнение метода Execute, вызванного в асинхронном режиме, следует использовать метод Cancel method.


Метод FillCache

Заполняет частично или полностью локальный буфер объекта Recordset, содержащего данные из источника данных ODBC, подключенного к ядру Microsoft Jet (только для баз данных ODBC, подключенных к Microsoft Jet).

Синтаксис

наборЗаписей.FillCache строки, начало

Синтаксис метода FillCache содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая объект Recordset, созданный на основе источника данных ODBC, такого как объект TableDef, представляющий присоединенную таблицу или объект QueryDef, созданный на основе такого объекта TableDef.
строки	Необязательный.  Выражение или переменная типа Variant (подтип Integer), указывающая число строк, которые следует поместить в локальный буфер.  Если данный аргумент опущен, то число заполняемых строк будет определяться значением свойства CacheSize.
начало	Необязательный.  Выражение или переменная типа Variant (подтип String), определяющая закладку.  Заполнение буфера начнется с записи, на которую указывает закладка.  Если значение данного аргумента не задано, то по умолчанию заполнение начнется с записи, определяемой значением свойства CacheStart.
Дополнительные сведения

Использование буферов повышает быстродействие приложения, в котором данные загружаются с удаленного сервера.  Локальный буфер представляет собой область памяти, в которой содержатся данные, полученные с сервера во время последних обращений.  Буфер обеспечивает возможность повторного обращения к помещенным в него данным во время выполнения приложения.  При поступлении требования на определенные данные ядро базы данных Microsoft Jet сначала проверяет, не содержатся ли запрошенные данные в локальном буфере, прежде чем запросить данные с сервера.  На последнюю операцию уходит намного больше времени.  Данные, которые поступают из источника данных, не являющегося источником ODBC, в локальном буфере не сохраняются.

Вместо того чтобы ожидать заполнения буфера записями по мере обращения к серверу, можно явно заполнить локальный буфер в любой момент с помощью метода FillCache.  Данный метод заполнения буфера является более быстрым, поскольку метод FillCache запрашивает с сервера сразу несколько записей, а не по одной записи за обращение.  Например, пока на экран выводится определенная порция данных, можно вызвать в приложении метод FillCache для получения с сервера следующей порции данных.

Создание локального буфера допускается для объекта Recordset при подключении ядра Microsoft Jet к любому источнику данных ODBC.  Для создания локального буфера следует открыть объект Recordset на основе удаленного источника данных, а затем задать значения свойств CacheSize и CacheStart объекта Recordset.

Если аргументы строки и начало задают диапазон записей, который частично или полностью выходит за пределы области, определяемой с помощью свойств CacheSize и CacheStart, то часть набораЗаписей, находящаяся вне заданной области, игнорируется и не загружается в локальный буфер.

Если метод FillCache запрашивает больше записей, чем остается в удаленном источнике данных, то в локальный буфер передаются только остающиеся записи; ошибка при этом не возникает.

Примечания

•	Полученные из локального буфера записи не отражают изменений, внесенных другими пользователями в записи источника данных после заполнения буфера.

•	Метод FillCache помещает в буфер только записи, которые еще не содержатся в буфере.  Для принудительного обновления всего содержимого буфера следует присвоить значение 0 свойству CacheSize объекта Recordset, после чего задать первоначальное значение размера буфера и вызвать метод FillCache.


Методы FindFirst, FindLast, FindNext, FindPrevious

Находят в объектах Recordset типа динамических и статических наборов записей первую, последнюю, следующую или предыдущую запись, удовлетворяющую заданным условиям, и делают эту запись текущей записью (только в рабочей области ядра Microsoft Jet).

Синтаксис

наборЗаписей.{FindFirst | FindLast | FindNext | FindPrevious} условия

Синтаксис метода Find содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая существующий объект Recordset типа динамического или статического набора записей.
условия	Выражение или переменная типа String, используемая для поиска записи.  Этот аргумент аналогичен предложению WHERE в инструкции SQL (без зарезервированного слова WHERE).
Дополнительные сведения

Если необходимо работать со всеми записями набора, а не только с записями, удовлетворяющими заданным условиям поиска, следует использовать методы группы Move, обеспечивающие переход с записи на запись.  Для поиска записи в объекте Recordset табличного типа следует использовать метод Seek.

Если запись, удовлетворяющая заданным условиям, не обнаружена, то состояние указателя текущей записи становится неопределенным, и свойству NoMatch присваивается значение True.  Если наборЗаписей содержит несколько записей, удовлетворяющих условиям отбора, то в методе FindFirst будет найдена первая из этих записей, в методе FindNext следующая и т.д.

Начальная позиция и направление поиска для каждого из методов группы Find представлены в следующей таблице.

Методы Find	Начало поиска	Направление
FindFirst	Начало набора записей	Конец набора записей
FindLast	Конец набора записей	Начало набора записей
FindNext	Текущая запись	Конец набора записей
FindPrevious	Текущая запись	Начало набора записей
При вызове метода FindLast ядро базы данных Microsoft Jet сначала полностью заполняет объект Recordset, а уже потом выполняет поиск.

Результат применения методов группы Find отличается от результата применения методов группы Move, в которых просто делается текущей первая, последняя, следующая или предыдущая запись без применения условий поиска.  После вызова метода группы Find можно применить метод группы Move.

Всегда необходимо следить с помощью свойства NoMatch за тем, была ли успешной операция Find.  Если запись обнаружена, свойство NoMatch получает значение False.  При неудачном поиске свойство NoMatch принимает значение True, а текущая запись становится неопределенной.  В этом случае пользователь должен явно установить указатель текущей записи на допустимую запись.

Применение методов группы Find к наборам записей, доступ к которым через подключение ODBC ядра Microsoft Jet , может оказаться неэффективным.  Обычно для поиска конкретной записи удобнее изменить аргумент условия, особенно при работе с большими наборами записей.

В рабочей области ODBCDirect нельзя использовать методы группы Find и метод Seek с объектами Recordset любых типов, поскольку вызов Find или Seek через сетевое подключение ODBC не является эффективным.  Вместо этого следует создать запрос (используя аргумент источник в методе OpenRecordset) с соответствующим предложением WHERE, которое ограничивает возвращаемые записи теми, которые удовлетворяют условиям, указанным в методе Find или Seek.

При подключении ядра Microsoft Jet к базам данных ODBC и использовании больших динамических объектов Recordset, пользователь может обнаружить, что выполнение методов Find, а также использование свойств Sort или Filter является достаточно медленным.  Для повышения быстродействия пользуйтесь запросами SQL со специализированными предложениями ORDER BY или WHERE, запросами с параметрами или объектами QueryDef, которые возвращают конкретные индексированные записи.

При поиске в полях, содержащих даты, следует использовать американский формат даты (месяц-день-год) даже в случае работы с локализованной версией ядра базы данных Microsoft Jet; в противном случае искомая запись может быть не найдена.  Перевести дату в нужный формат позволяет функция Visual Basic Format.  Например:

rstEmployees.FindFirst "ДатаНайма > #" _

& Format(mydate, 'm-d-yy' ) & "#"

Если значение аргумента условия образуется путем строкового слияния с нецелым числом, а в системной настройке задано использование национального символа десятичного разделителя, такого как запятая (например, strSQL = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке вызова метода возникает ошибка.  Появление ошибки объясняется тем, что при слиянии число преобразуется в строковое значение с использованием стандартного символа десятичного разделителя, а язык SQL ядра Microsoft Jet поддерживает только американский символ десятичного разделителя (десятичную точку).

Примечания

•	Для обеспечения максимального быстродействия аргумент условия должен быть задан  либо в виде "поле = значение", где поле является индексированным полем в базовой таблице, либо в виде "поле LIKE префикс" где поле является индексированным полем в базовой таблице, а префикс представляет начальную часть искомой строки (например, "ART*").

•	В общем случае, при прочих равных условиях метод Seek выполняется быстрее, чем методы Find.  Если табличные объекты Recordset достаточны для решения задач пользователя, следует применять этот метод.


Метод GetChunk

Возвращает часть или все содержимое объекта Field типа Memo или Long Binary, входящего в семейство Fields объекта Recordset.

Синтаксис

Set переменная = наборЗаписей ! поле.GetChunk (смещение, размер)

Синтаксис метода GetChunk содержит следующие элементы.

Элемент	Описание
переменная	Имя переменной типа Variant (подтип String), в которую будут помещены данные из объекта Field, определяемого аргументом поле.
наборЗаписей	Объектная переменная, определяющая объект Recordset , который содержит нужное семейство Fields.
поле	Объектная переменная, представляющая объект Field, свойство которого Type имеет значение dbMemo (Memo) или dbLongBinary (Long Binary).
смещение	Выражение или переменная типа Long, задающая в байтах размер фрагмента содержимого поля, который следует пропустить перед началом копирования.
размер	Выражение или переменная типа Long, задающая в байтах размер копируемого фрагмента.
Дополнительные сведения

Метод GetChunk возвращает фрагмент содержимого поля, который помещается в переменную.  Пользуйтесь методом GetChunk, если в данный момент требуется использовать только часть содержимого поля.  Для добавления фрагмента данных к содержимому поля используют метод AppendChunk.

Если аргумент смещение имеет значение 0, метод GetChunk начинает копирование с первого байта поля.

Если значение аргумента размер превышает число байтов в поле, возвращается реальное число байтов.

Внимание!   Для больших текстовых значений используются поля типа Memo, а двоичные значения следует помещать только в поля типа Long Binary.  Помещения в эти поля данных других типов может привести к нежелательным результатам.


Метод GetRows

Загружает строки объекта Recordset в массив.

Синтаксис

Set имяМассива = наборЗаписей.GetRows (числоСтрок)

Синтаксис метода GetRows содержит следующие элементы.

Элемент	Описание
имяМассива	Имя переменной типа Variant, в которой сохраняются возвращаемые данные.
наборЗаписей	Объектная переменная, представляющая объект Recordset.
числоСтрок	Выражение или переменная типа Variant, задающая число возвращаемых строк.
Дополнительные сведения

Метод GetRows используется для копирования записей из объекта Recordset в двумерный массив.  Первый индекс массива определяет поле, а второй номер строки, как в следующей примере, где intField представляет поле, а intRecord задает номер строки:

avarRecords(intField, intRecord)

Для того чтобы возвратить значение первого поля во второй записи, следует использовать такие значения индексов:

field1 = avarRecords(0,1)

Значение второго поля в первой записи возвращается с помощью следующей инструкции:

field2 = avarRecords(1,0)

При возвращении данных методом GetRows переменная avarRecords автоматически превращается в двумерный массив.

Если число затребованных строк превышает действительное число строк, возвращаются только имеющиеся строки.  Для определения реально возвращенного методом GetRows числа строк следует вызвать функцию языка Visual Basic для приложений UBound, поскольку массив переменного размера позволяет уместить столько строк, сколько было возвращено.  Например, если результаты возвращаются в переменную типа Variant с именем varA, определить число возвращенных строк позволяет следующая инструкция:

numReturned = UBound(varA,2) + 1

Единицу следует добавить, поскольку нумерация элементов массива начинается с нуля.  Число возвращаемых строк ограничивается только доступной памятью и должно выбираться в соответствии с реальными потребностями.  Не рекомендуется копировать всю таблицу в массив с помощью метода GetRows, особенно, если это большая таблица.

Поскольку в массив записывается содержимое всех полей объекта Recordset, в том числе содержимое полей типа Memo и Long Binary, полезно сначала выполнить запрос, ограничивающий число возвращаемых полей.

После вызова метода GetRows указатель текущей записи переводится на следующую несчитанную строку.  Это означает, что в смысле размещения записи вызов GetRows эквивалентен выполнению метода Move на указанное числоСтрок.

Если делается попытка загрузить все строки с помощью многократных вызовов метода GetRows, следует с помощью свойства EOF убедиться, что достигнут конец объекта Recordset.  Метод GetRows возвращает меньше строк, чем запрашивалось, либо в конце набора записей, либо при невозможности загрузить какую-либо строку из запрашиваемого диапазона.  Например, если не удалось загрузить пятую запись из запрашиваемых десяти записей, GetRows возвратит четыре записи и оставит текущей запись, с которой возникли проблемы.  Ошибка выполнения при этом не генерируется.  Такая ситуация может возникнуть, если запись удалена другим пользователем из объекта Recordset типа динамического набора записей.  Такая ситуация иллюстрируется в примере.


Метод Idle

Приостанавливает выполнение новых инструкций обработки данных и позволяет ядру базы данных Microsoft Jet выполнить все незаконченные операции, такие как оптимизация памяти или интервалы ожидания страниц (только в рабочей области ядра Microsoft Jet).

Синтаксис

DBEngine.Idle [dbRefreshCache]

Дополнительные сведения

Вызов метода Idle позволяет предоставить ядру базы данных Microsoft Jet возможность завершить фоновые операции, которые не были завершены из-за большого объема операций обработки данных.  Такая ситуация часто возникает при работе в многопользовательской и многозадачной среде, когда времени, выделенного на выполнение фоновых задач, недостаточно для своевременного обновления всех записей в текущем объекте Recordset.

Как правило, блокировки изменений снимаются, и данные в локальном объекте Recordset типа динамического набора записей обновляются только тогда, когда в системе не происходят никакие другие события (включая и перемещения указателя мыши).  Периодический вызов метода Idle снимает лишние блокировки изменений, и ядро базы данных получает достаточное количество времени для того, чтобы выполнить фоновые задачи.

Если в качестве аргумента указать необязательную константу dbRefreshCache, принудительно выполняются все отложенные операции записи в файлы .mdb, а память обновляется с использованием последних данных из файла .mdb.

Данный метод применяется на автономных компьютерах только при одновременном запуске нескольких копий приложения.  Метод Idle позволяет увеличить производительность в сети, поскольку ядро базы принуждается к записи данных на диск и снятию ненужных блокировок в памяти.

Примечание.   Снять блокировки изменений позволяет также включение операций в транзакцию.


Метод MakeReplica

Создает новую реплику на основе текущей реплики базы данных (только в рабочей области ядра Microsoft Jet).

Синтаксис

базаДанных.MakeReplica реплика, описание, параметры

Синтаксис метода MakeReplica содержит следующие элементы.

Элемент	Описание
базаДанных	Объектная переменная, представляющая существующий объект Database, который является репликой базы данных.
реплика	Выражение или переменная типа String, задающая путь и имя файла новой реплики.  Если файл с именем реплика уже существует, возникает ошибка.
описание	Выражение или переменная типа String, содержащая описание создаваемой реплики.
параметры	Необязательный.  Константа или комбинация констант, задающая характеристики создаваемой реплики, как описано в разделе "Значения".
Значения

Значения аргумента параметры задаются с помощью следующих констант.

Константа	Описание
dbRepMakePartial	Создание частичной реплики.
dbRepMakeReadOnly	Запрет изменения пользователями реплицируемых объектов в новой реплике; однако, при синхронизации новой реплики с другой репликой из набора реплик изменения структуры и данных будут распространены на новую реплику.
Дополнительные сведения

В созданной новой частичной реплике все свойства ReplicaFilter получат значения False.  Это означает, что таблицы не будут содержать данные.


Метод Move

Перемещает указатель текущей записи в объекте Recordset.

Синтаксис

наборЗаписей.Move строки, начало

Синтаксис метода Move содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая объект Recordset, в котором изменяется положение указателя текущей записи.
строки	Значение типа Long со знаком, указывающее число строк, на которое перемещается указатель текущей записи.  Если значение аргумента строки больше 0, то осуществляется перемещение вперед (по направлению к концу файла).  При отрицательных значениях аргумента строки осуществляется перемещение назад (по направлению к началу файла).
начало	Необязательный. Значение типа Variant (подтип String), определяющее закладку.  Если задан аргумент начало, то перемещение начнется с записи, на которую указывает закладка.  В противном случае метод Move начинает перемещение с текущей записи.
Дополнительные сведения

Если значения аргументов метода Move задают перемещение указателя текущей записи в положение, находящееся перед первой записью набора, то указатель текущей записи будет помещен в начало файла.  Если объект Recordset не содержит записей и свойство BOF объекта имеет значение True, то вызов данного метода для перемещения назад вызывает ошибку.

Если заданные значения аргументов метода Move должны вызвать перемещение указателя текущей записи в положение, находящееся после последней записи набора, то указатель текущей записи будет помещен в положение конца файла.  Если объект Recordset не содержит записей и свойство EOF объекта имеет значение True, то вызов данного метода для перемещения вперед вызывает ошибку.

Ошибка выполнения возникает также при попытке вызова метода Move без допустимой закладки, в то время как любое из свойств BOF или EOF имеет значении True.

Примечания

•	При вызове метода Move для объекта Recordset типа статического набора записей с последовательным доступом аргумент строки должен иметь положительное целое значение, а использование закладок не допускается.  В этом случае перемещение может проводиться только по направлению к концу набора.

•	Для того чтобы сделать текущей первую, последнюю, следующую или предыдущую запись объекта Recordset, следует применить, соответственно, методы MoveFirst, MoveLast, MoveNext или MovePrevious.

•	Вызов метода Move с нулевым значением аргумента строки является удобным способом загрузки значений из базового источника данных в текущую запись.  Это позволяет быть уверенным в том, что запись содержит последние данные из базовых таблиц.  При этом также отменяются любые отложенные вызовы методов Edit или AddNew.


Методы MoveFirst, MoveLast, MoveNext, MovePrevious

Находят в указанном объекте Recordset первую, последнюю, следующую или предыдущую запись и делают эту запись текущей записью.

Синтаксис

наборЗаписей.{MoveFirst | MoveLast [dbRunAsync] | MoveNext | MovePrevious}

Прототип наборЗаписей представляет объектную переменную, задающую открытый объект Recordset.

Дополнительные сведения

Методы группы Move применяются для перехода от записи к записи без указания условия поиска записей.

Внимание!   После изменения текущей записи следует обязательно сохранить изменения с помощью метода Update перехода к следующей записи.  Если переход к другой записи осуществляется без обновления текущей записи, то все внесенные изменения будут потеряны без предупреждения.

При открытии объекта Recordset первая запись набора становится текущей, а свойство BOF получает значение False.  Если объект Recordset не содержит ни одной записи, то свойство BOF получает значение True, а положение текущей записи становится неопределенным.

Если текущей записью является первая или последняя запись набора, то применение, соответственно, методов MoveFirst или MoveLast не изменяет положение текущей записи.

При вызове метода MovePrevious, когда текущей является первая запись набора, свойство BOF принимает значение True, а текущая запись становится неопределенной.  При повторном вызове метода MovePrevious возникает ошибка; свойство BOF при этом сохраняет значение True.

При вызове метода MoveNext, когда текущей является последняя запись набора, свойство EOF принимает значение True, а текущая запись становится неопределенной.  При повторном вызове метода MoveNext возникает ошибка; свойство EOF при этом сохраняет значение True.

Если аргумент наборЗаписей указывает на объект Recordset типа таблицы (только в рабочей области ядра Microsoft Jet), то перемещение по записям производится в соответствии с текущим индексом таблицы.  Текущий индекс задается с помощью свойства Index таблицы.  Если текущий индекс не указан, то порядок записей при переходах становится неопределенным.

Внимание!   Допускается использование метода MoveLast для полного заполнения объектов Recordset типа динамического набора записей или статического набора записей с включением в объект Recordset текущего количества записей. Однако при таком вызове метода MoveLast скорость выполнения приложения может существенно уменьшиться.  Рекомендуется вызывать метод MoveLast для подсчета записей только в том случае, когда требуется аккуратный подсчет числа записей в новом открытом объекте Recordset.  При вызове метода MoveLast с константой dbRunAsync метод выполняется в асинхронном режиме.  Пользователь имеет возможность использовать метод StillExecuting для проверки, является ли объект Recordset полностью заполненным, и метод Cancel для отмены выполнения метода MoveLast в асинхронном режиме.

Не допускается вызов методов MoveFirst, MoveLast и MovePrevious для объектов Recordset типа статического набора записей с последовательным доступом.

Для перемещения положения указателя текущей записи объекта Recordset на заданное число записей вперед или назад следует применять метод Move.


Метод NewPassword

Изменяет пароль существующей учетной записи пользователя или базы данных с ядром Microsoft Jet (только в рабочей области ядра Microsoft Jet).

Синтаксис

объект.NewPassword старыйПароль, новыйПароль

Синтаксис метода NewPassword содержит следующие элементы.

Элемент	Описание
объект	Объектная переменная, представляющая объект User или объект Database версии  Microsoft Jet 3.x, для которого изменяется значение свойства Password.
старыйПароль	Выражение или переменная типа String, представляющая текущее значение свойства Password объекта User или объекта Database версии Jet 3.x.
новыйПароль	Выражение или переменная типа String, представляющая новое значение свойства Password объекта User или объекта Database версии Jet 3.x.
Дополнительные сведения

Строки старыйПароль и новыйПароль могут содержать до 14 символов и включать любые символы, за исключением пустого символа ASCII 0.  Для удаления пароля следует указать пустую строку ("") в аргументе новыйПароль.

Пароли задаются с учетом регистра.

Если в аргументе объект указано имя объекта User, не являющегося компонентом семейства Users, возникает ошибка.  Для того чтобы задать новый пароль, необходимо либо войти в систему под именем пользователя, учетную запись которого требуется изменить, либо принадлежать к группе "Admins" (администраторы).  Свойство Password объекта User доступно только для чтения — при этом сами пользователи не могут считывать текущее значение.

Если в аргументе объект указано имя объекта Database версии Microsoft Jet 3.0 или более поздней, данный метод допускает ограниченную форму защиты данных в виде парольной защиты.  При создании или открытии файла .mdb версии Microsoft Jet 3.x часть строки подключения Connect может описывать пароль.

Если база данных не имеет определенного пароля, то ядро Microsoft Jet автоматически создает пароль, передавая пустую строку ("") в качестве старого пароля.

Внимание!   Пользователь, потерявший или забывший пароль, не сможет открыть базу данных.


Метод OpenDatabase

Открывает указанную базу данных в объекте Workspace и возвращает ссылку на объект Database, представляющий эту базу данных.

Синтаксис

Set базаДанных = рабочаяОбласть.OpenDatabase (имяБД, параметры, толькоЧтение, подключение)

Синтаксис метода OpenDatabase содержит следующие элементы.

Элемент	Описание
базаДанных	Объектная переменная, представляющая открываемый объект Database.
рабочаяОбласть	Необязательный.  Объектная переменная, представляющая существующий объект Workspace, который будет содержать базу данных.  Если аргумент рабочаяОбласть не задан, метод OpenDatabase использует стандартную рабочую область.
имяБД	Выражение или переменная типа String, задающая имя существующего файла базы данных с ядром Microsoft Jet или имя источника данных ODBC. Дополнительные сведения о значениях данного аргумента см. в разделе справки для свойства Name.
параметры	Необязательный.  Выражение или переменная типа Variant, задающая параметры базы данных, как описано в разделе "Значения".
толькоЧтение	Необязательный.  Значение типа Variant (подтип Boolean), имеющее значение True, если база данных открывается только для чтения, и значение False (по умолчанию) при открытии базы данных с доступом для чтения и записи.
подключение	Необязательный.  Выражение или переменная типа Variant (подтип String), содержащая сведения о подключении, в том числе пароли.
Значения

Для рабочей области ядра Microsoft Jet допустимыми являются следующие значения аргумента параметры.

Значение	Описание
True	Открытие базы данных для монопольного доступа.
False	(По умолчанию).  Открытие базы данных для общего доступа.
Для рабочей области ODBCDirect аргумент параметры определяет вывод приглашения пользователю при установлении подключения.  Допускается использование одной из следующих констант.

Константа	Описание
dbDriverNoPrompt	Диспетчер драйвера ODBC использует строку подключения, определяемую аргументами имяБД и подключение.  Если этих данных недостаточно, возникает ошибка выполнения.
dbDriverPrompt	Диспетчер драйвера ODBC открывает диалоговое окно ODBC Data Sources, в котором отображаются данные, определяемые аргументами имяБД и подключение.  Строка подключения образуется из имени источника данных, которое пользователь выбирает в диалоговых окнах, или, если имя источника данных не задано пользователем, используется стандартный источник данных.
dbDriverComplete	(По умолчанию).  Если в аргументах подключение и имяБД заданы все необходимые для подключения сведения, диспетчер драйвера ODBC использует строку из аргумента подключение.  В противном случае выполняются действия, аналогичные задаваемым константой dbDriverPrompt.
dbDriverCompleteRequired	Выполняются действия, аналогичные задаваемым константой dbDriverComplete, с тем лишь исключением, что драйвер ODBC отключает вывод приглашений на ввод сведений, не являющихся необходимыми для подключения.
Дополнительные сведения

При открытии базы данных она автоматически добавляется в семейство Databases.  Кроме того, в рабочей области ODBCDirect создается объект Connection, соответствующий новому объекту Database.  Этот объект Connection добавляется в семейство Connections того же объекта Workspace.

При указании аргумента имяБД необходимо иметь в виду следующее:

•	Если задается имя базы данных, уже открытой для монопольного доступа другим пользователем, возникает ошибка.

•	Если аргумент не задает имя существующей базы данных или допустимого источника данных ODBC, возникает ошибка.

•	Если значением аргумента является пустая строка (""), а аргумент подключение имеет значение "ODBC;", открывается диалоговое окно со списком имен всех зарегистрированных источников данных ODBC, в котором пользователь может выбрать нужную базу данных.

•	При открытии базы данных в рабочей области ODBCDirect с указанием имени источника данных в аргументе подключение пользователь имеет возможность задать в аргументе имяБД произвольную строку, которая в дальнейшем может использоваться в программах для ссылки на базу данных.

Значение аргумента подключение образую два компонента: тип базы данных, за которым после точки с запятой (;) следуют необязательные аргументы.  Указание типа базы данных, например, "ODBC;" или "FoxPro 2.5;" является обязательным.  Необязательные аргументы, следующие в произвольном порядке, также разделяются символом точки с запятой.  Одним из параметров может быть пароль (если пароль определен).  Например:

"FoxPro 2.5; pwd=МойПароль"

Вызов метода NewPassword для объекта Database, не являющегося базой данных ODBCDirect, позволяет изменить параметр пароля, который задается в виде ";pwd=...".  При указании строки источника необходимо определить аргументы параметры и толькоЧтение.  Дополнительные сведения о синтаксисе см. в разделе справки для свойства Connect.

Для закрытия базы данных и удаления объекта Database из семейства Databases следует применить к этому объекту метод Close.

Примечание.   При подключении ядра Microsoft Jet к источнику данных ODBC пользователь имеет возможность повысить быстродействие приложения, открывая объект Database, подключенный к источнику данных ODBC, вместо присоединения отдельных объектов TableDef к конкретным таблицам в источнике данных ODBC.


Метод OpenRecordset

Создает новый объект Recordset и добавляет его в семейство Recordsets.

Синтаксис

Для объектов Connection и Database:

Set наборЗаписей = объект.OpenRecordset (источник, тип, параметры, блокировки)

Для объектов QueryDef, Recordset и TableDef:

Set наборЗаписей = объект.OpenRecordset (тип, параметры, блокировки)

Синтаксис метода OpenRecordset содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая открываемый объект Recordset.
объект	Объектная переменная, представляющая существующий объект, используемый при создании нового объекта Recordset.
источник	Выражение или переменная типа String, определяющая источник записей для нового объекта Recordset.  В качестве источника записей можно указать имя таблицы или запроса, а также инструкцию SQL, которая возвращает записи.  Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы.
тип	Необязательный.  Константа, указывающая тип открываемого объекта Recordset, как описано в разделе "Значения".
параметры	Необязательный.  Произвольная комбинация следующих констант, задающих характеристики нового объекта Recordset, перечисленных в разделе "Значения".
блокировки	Необязательный.  Константа, определяющая тип блокировки объекта Recordset, как описано в разделе "Значения".
Значения

В аргументе тип допускается использование одной из следующих констант.

Константа	Описание
dbOpenTable	Открытие табличного объекта Recordset (только в рабочей области ядра Microsoft Jet).
dbOpenDynamic	Открытие объекта Recordset динамического типа, аналогичного динамическому указателю ODBC (только в рабочей области ODBCDirect).
dbOpenDynaset	Открытие объекта Recordset типа динамического набора записей, аналогичного указателю ключевого набора записей ODBC.
dbOpenSnapshot	Открытие объекта Recordset типа статического набора записей, аналогичного указателю статического набора записей ODBC.
dbOpenForwardOnly	Открытие объекта Recordset типа статического набора записей с последовательным доступом.
Примечание.   Если объект Recordset открывается в рабочей области ядра Microsoft Jet без указания типа, метод OpenRecordset, по возможности, создает табличный объект Recordset.  При указании присоединенной таблицы или запроса метод OpenRecordset создает объект Recordset типа динамического набора записей.  В рабочей области ODBCDirect значением по умолчанию является константа dbOpenForwardOnly.

Значение аргумента параметры задается как комбинация следующих констант.

Константа	Описание
dbAppendOnly	Пользователям разрешается только добавление новых записей в объект Recordset и запрещается изменение или удаление существующих записей (только для объектов Recordset типа динамического набора записей в рабочей области Microsoft Jet).
dbSQLPassThrough	Передача инструкции SQL для обработки источнику данных ODBC, подключенному к ядру Microsoft Jet (только для объектов Recordset типа статического набора записей в рабочей области Microsoft Jet).
dbSeeChanges	Генерация ошибки выполнения, если один пользователь изменил данные, редактируемые другим пользователем (только для объектов Recordset типа динамического набора записей в рабочей области Microsoft Jet).  Это удобно в ситуациях, когда несколько пользователей имеют доступ для чтения/записи к одним и тем же данным.
dbDenyWrite	Запрет другим пользователям изменять или добавлять записи (только для объектов Recordset в рабочей области Microsoft Jet).
dbDenyRead	Запрет другим пользователям на чтение данных в таблице (только для объектов Recordset типа таблицы в рабочей области Microsoft Jet).
dbForwardOnly	Создание объекта Recordset типа статического набора записей с последовательным доступом (только для объектов Recordset типа статического набора записей в рабочей области Microsoft Jet).  Данная константа включена только для совместимости с предыдущими версиями, вместо нее в аргументе тип следует использовать константу dbOpenForwardOnly.
dbReadOnly	Запрет пользователям на внесение изменений в объект Recordset (только в рабочей области Microsoft Jet). Данная константа включена только для совместимости с предыдущими версиями, вместо нее следует использовать константу dbReadOnly в аргументе блокировки.
dbRunAsync	Запуск асинхронного запроса (только в рабочей области ODBCDirect).
dbExecDirect	Запуск запроса без выполнения инструкции SQLPrepare с прямым вызовом инструкции SQLExecDirect (только в рабочей области ODBCDirect). Данный параметр нельзя использовать при открытии объекта Recordset на основе запроса с параметрами.  Дополнительные сведения см. в руководстве по программированию Microsoft ODBC 3.0.
dbInconsistent	Разрешение несогласованных обновлений (только для объектов Recordset типа динамического или статического набора записей в рабочей области Microsoft Jet).
dbConsistent	Разрешение только согласованных обновлений (только для объектов Recordset типа динамического или статического набора записей в рабочей области Microsoft Jet).
Примечание.   Константы dbConsistent и dbInconsistent являются взаимоисключающими, и их одновременное указание приводит к ошибке.  Задание значения аргумента блокировки, когда в аргументе параметры указана константа dbReadOnly, также приводит к ошибке.

Значения аргумента блокировки задаются с помощью следующих констант.

Константа	Описание
dbReadOnly	Запрет пользователям на внесение изменений в объект Recordset (настройка по умолчанию для рабочей области ODBCDirect).  Использование константы dbReadOnly допускается только в одном из аргументов параметры или блокировки.  Если задать эту константы в двух аргументах одновременно, возникает ошибка выполнения.
dbPessimistic	Использование жесткой блокировки при определении возможности изменения объекта Recordset в многопользовательской среде.  Страница, содержащая обрабатываемую запись, блокируется при вызове метода Edit (настройка по умолчанию для рабочей области Microsoft Jet).
dbOptimistic	Использование нежесткой блокировки при определении возможности изменения объекта Recordset в многопользовательской среде.  Страница, содержащая обрабатываемую запись, блокируется при вызове метода Update.
dbOptimisticValue	Использование нежесткой блокировки при конкурентном доступе на основании значений строк (только в рабочей области ODBCDirect).
dbOptimisticBatch	Включение режима пакетного обновления с нежесткой блокировкой (только в рабочей области ODBCDirect).
Дополнительные сведения

В рабочей области ядра Microsoft Jet, если аргумент объект задает объект QueryDef или объект Recordset типа динамического набора записей или статического набора записей, а также, если аргумент источник задает инструкцию SQL или объект TableDef, представляющий присоединенную таблицу, то не допускается использование константы dbOpenTable в аргументе тип; в противном случае возникает ошибка выполнения.  Если требуется использовать запрос к серверу SQL для присоединенной таблицы при подключении ядра Microsoft Jet к источнику данных ODBC, необходимо сначала указать в свойстве Connect базы данных, содержащей присоединенную таблицу, допустимую строку подключения ODBC.  Для однократного прохода по объекту Recordset, открытому при подключении ядра Microsoft Jet к источнику данных ODBC, можно повысить быстродействие, задав константу dbOpenForwardOnly в аргументе тип.

Если аргумент объект задает объект Recordset типа динамического набора записей или статического набора записей, то новый объект Recordset является объектом того же типа.  Если аргумент объект задает табличный объект Recordset, то новый объект является объектом Recordset типа динамического набора записей.  Не допускается открытие нового объекта Recordset на основе статического набора записей с последовательным доступом или объектов Recordset ODBCDirect.

В рабочей области ODBCDirect возможно открытие Recordset, с указанием более одного запроса на выборку в аргументе источник, например:

"SELECT Фамилия, Имя FROM Авторы
WHERE Фамилия = 'Иванов';
SELECT Заголовок, ISBN FROM Заголовки
WHERE Код Like '1-55615-*'"

В возвращенном объекте Recordset будут открыты результаты первого запроса.  Чтобы открыть результаты следующих запросов, следует вызвать метод NextRecordset.

Примечание.   Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL.  Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню.  При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.

Константа dbSeeChanges позволяет в рабочей области Microsoft Jet перехватывать при работе с записью изменения, вносимые в ту же запись другими пользователями.  Например, если два пользователя начинают изменять одну и ту же запись, успешно выполнить обновление сможет только пользователь, первым вызвавший метод Update.  При вызове метода Update вторым пользователем возникнет ошибка при выполнении.  Аналогично этому, ошибка выполнения возникает, если второй пользователь пытается с помощью метода Delete удалить запись, в которую первый пользователь успел занести изменения.

Обычно, перехват такой ошибки должен приводить к программному обновлению содержимого полей и загрузке измененных значений.  Если ошибка возникает при попытке удаления, программа должна вывести новое содержимое записи и сообщение, показывающее, что запись недавно была изменена.  Программа должна запросить подтверждение на удаление измененной записи.

Кроме того, константу dbSeeChanges следует использовать, если пользователь открывает объект Recordset при подключении ядра Microsoft Jet к источнику данных ODBC, который является таблицей Microsoft SQL Server версии 6.0 (или более поздней) со столбцом IDENTITY, в противном случае может возникнуть ошибка.

В рабочей области ODBCDirect допускается выполнение запросов в асинхронном режиме, задаваемом константой dbRunAsync в аргументе параметры.  Это позволяет приложению продолжать обработку других инструкций во время выполнения запроса в фоновом режиме.  Однако пользователь не сможет в этом случае получить доступ к данным в объекте Recordset до завершения запроса.  Чтобы определить, закончено ли выполнение запроса, следует проверить значение свойства StillExecuting нового объекта Recordset.  Если выполнение запроса занимает больше времени, чем предполагается, пользователь имеет возможность прекратить выполнение с помощью метода Cancel.

Попытка открыть несколько объектов Recordset на основе одного источника данных ODBC может привести к ошибке, если подключение оказывается занятым обработкой предыдущего вызова метод OpenRecordset.  Одним из способов обойти эту трудность является использование указателя на стороне сервера и средств ODBCDirect, если они поддерживается сервером.  Другим способом является заполнение объекта Recordset с помощью метода MoveLast при открытии объекта Recordset.

Если открыть объект Connection с заданным для свойства DefaultCursorDriver значением dbUseClientBatchCursor, пользователь имеет возможность открыть объект Recordset как буфер для измененных данных в рабочей области ODBCDirect (такой способ называют пакетным обновлением).  Для включения буфера обновления следует указать константу dbOptimisticBatch в аргументе блокировки.  Дополнительные сведения о выборе способа немедленной записи изменений на диск или способа обновления через буфер с их последующей записью на диск в пакете см. в разделе справки для метода Update.

Закрытие объекта Recordset с помощью метода Close приводит к автоматическому удалению объекта из семейства Recordsets.

Примечание.   Если в аргументе источник указана инструкция SQL, образованная путем слияния строки с нецелым числовым значением, а в системной настройке задано использование неамериканского символа десятичного разделителя, такого как запятая (например, strSQL = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке открыть объект Recordset возникает ошибка.  Причина заключается в том, что число преобразуется в строковое значение с использованием текущей системной настройки, а в языке SQL распознается только американский символ разделителя целой и дробной части (десятичная точка).


Метод Refresh

Обновляет объекты в семействе в соответствии с текущими изменениями в схеме базы данных.

Синтаксис

семейство.Refresh

Прототип семейство представляет объектную переменную, задающую постоянное семейство.

Дополнительные сведения

Не допускается вызов метода Refresh для семейств, не являющихся постоянными, таких как Connections, Databases, Recordsets, Workspaces или семейство QueryDefs объекта Connection.

Для определения положения, которое ядро базы данных Microsoft Jet присваивает объектам Field в семействе Fields объекта QueryDef, Recordset или TableDef, следует использовать свойство OrdinalPosition каждого объекта Field.  Изменение значение свойства OrdinalPosition объекта Field может не отразиться на положении объекта Field в семействе, пока не будет вызван метод Refresh.

Метод Refresh используют при работе в сети, в которой другие пользователи могут вносить изменения в базу данных.  Кроме того, может потребоваться применить этот метод к семействам, на которые косвенно влияют изменения, вносимые в базу данных.  Например, при изменении семейства Users может возникнуть необходимость обновить семейство Groups перед его использованием.

Семейство заполняется объектами при первом обращении к нему.  Состав семейства не будет в дальнейшем автоматически отражать изменения, внесенные в него другими пользователями.  Если существует возможность того, что семейство изменено другим пользователем, то рекомендуется применить метод Refresh к семейству непосредственно перед выполнением любого действия, предполагающего присутствие или отсутствие конкретного объекта в семействе.  Это позволит всегда работать с последней версией семейства.  С другой стороны, следует помнить, что лишние вызовы метода Refresh могут замедлить работу приложения.


Метод RefreshLink

Обновляет сведения о подключении для присоединенной таблицы (только в рабочей области ядра Microsoft Jet).

Синтаксис

таблица.RefreshLink

Прототип таблица задает объект TableDef, представляющий присоединенную таблицу, для которой требуется обновить сведения о подключении.

Дополнительные сведения

Сведения о подключении таблицы изменяют путем сброса значения свойства Connect соответствующего объекта TableDef, после чего следует применить метод RefreshLink для обновления этих сведений. При использовании метода RefreshLink свойства присоединенной таблицы и объекты Relation не изменяются.

Для того чтобы заданные сведения о подключении были обновлены во всех семействах, связанных с описывающим присоединенную таблицу объектом TableDef, следует вызвать метод Refresh для каждого из семейств.


Метод RegisterDatabase

Заносит сведения о подключении к источнику данных ODBC в реестр Windows.  Эти сведения необходимы для драйвера ODBC при открытии источника данных ODBC во время сеанса.

Синтаксис

DBEngine.RegisterDatabase имяБД, драйвер, скрытие, атрибуты

Синтаксис метода RegisterDatabase содержит следующие элементы.

Элемент	Описание
имяБД	Выражение типа String, содержащее имя, используемое в методе OpenDatabase для ссылки на блок сведений о параметрах источника данных.  Например, если источником данных является удаленная база данных ODBC, то данный аргумент задает имя сервера.
драйвер	Выражение типа String, задающее имя драйвера ODBC.  Имя драйвера не совпадает с именем файла библиотеки динамической компоновки (DLL) драйвера ODBC.  Например, "SQL Server" является именем драйвера, а SQLSRVR.dll является именем файла библиотеки.  Программное обеспечение ODBC и соответствующий драйвер должны быть заранее установлены в системе.
скрытие	Выражение типа Boolean, имеющее значение True, если не нужно выводить на экран окна диалога драйвера ODBC, запрашивающие необходимые сведения для драйвера, или значение False при необходимости указать вывод окон диалога драйвера ODBC.  Если в аргументе скрытие задано значение True, то аргумент атрибуты должен содержать всю необходимую для конкретного драйвера информацию, иначе окна диалога все равно будут выводиться.
атрибуты	Выражение типа String, содержащее список элементов, которые следует добавить в реестр Windows.  Элементы, включаемые в строку атрибутов, разделяются символами возврата каретки.
Дополнительные сведения

Если база данных уже зарегистрирована, т.е. сведения о подключении уже введены в реестр Windows, то при вызове метода RegisterDatabase сведения о подключении будут обновлены.

Если по какой-либо причине метод RegisterDatabase не может быть выполнен, то изменения в реестр Windows не заносятся и возникает ошибка.

Дополнительные сведения о драйверах ODBC, таких как SQL Server, можно найти в файле справочной системы, поставляемой с конкретным драйвером.

Для добавления новых источников данных или для изменения существующих рекомендуется использовать диалоговое окно ODBC Data Sources в окне Настройка Windows.  Если, однако, по каким то причинам предпочтительнее использовать метод RegisterDatabase, рекомендуется задавать для аргумента скрытие значение True.


Метод RepairDatabase

Делает попытку восстановить поврежденную базу данных Microsoft Jet (только для баз данных Microsoft Jet).

Синтаксис

DBEngine.RepairDatabase имяБД

Аргумент имяБД задается с помощью выражения типа String, содержащего путь и имя файла существующей базы данных Microsoft Jet.  Если не указать путь, то поиск файла будет проведен только в текущем каталоге. В системах, поддерживающих общее соглашение об именах (UNC, uniform naming convention), можно также указать сетевой путь, например: "\\server1\share1\dir1\db1.mdb".

Дополнительные сведения

Перед восстановлением базы данных, указанной в аргументе имяБД, ее необходимо закрыть.  В сети ни один из пользователей не может держать открытой базу данных во время проведения операции восстановления.  Если база данных имяБД не закрыта или недоступна для монопольного доступа, возникает ошибка.

Данный метод позволяет восстановить базу данных, которая была помечена как возможно поврежденная в результате незавершенной операции записи.  Это может произойти в случае внезапного выхода из приложения, использующего ядро Microsoft Jet, в результате перерыва в питании или сбоев компьютера.  База данных не будет помечена как возможно поврежденная, если она была закрыта с помощью метода Close или если был осуществлен штатный выход из приложения.

В методе RepairDatabase также делается попытка восстановить все системные таблицы и все индексы.  Любые данные, которые не удастся восстановить, будут потеряны. Если восстановление базы данных невозможно, возникает ошибка выполнения.

Ошибка выполнения обычно возникает при попытке открыть или сжать поврежденную базу данных.  Однако в некоторых случаях повреждение базы данных может остаться не обнаруженным и ошибка не возникнет.  Рекомендуется предоставлять пользователям приложения возможность выполнить метод RepairDatabase в случае неожиданного и непредсказуемого поведения базы данных.

Базы данных некоторых типов могут оказаться поврежденными, если пользователь закрывает приложение, не закрыв предварительно объекты Database или Recordset и ядро Microsoft Jet.  В этом случае Microsoft Windows не успевает записать на диск данные, помещенные во временные буферы.  Для того чтобы предотвратить повреждения базы данных, рекомендуется разработать процедуру выхода из приложения и программы отключения, обеспечивающие сохранение всех буферизованных страниц в базе данных.  При возможных сбоях питания рекомендуется иметь автономные аварийные источники питания.

Примечание.   После восстановления базы данных рекомендуется также сжать ее с помощью метода CompactDatabase для дефрагментации файла и освобождения пространства на диске.


Метод Requery

Обновляет данные в объекте Recordset с помощью повторного выполнения запроса, на котором базируется указанный объект.

Синтаксис

наборЗаписей.Requery новыйЗапрос

Синтаксис метода Requery содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая в рабочей области ядра Microsoft Jet объект Recordset типа динамического набора записей, статического набора записей или статического набора записей с последовательным доступом или объект Recordset в рабочей области ODBCDirect.
новыйЗапрос	Необязательный.  Выражение или переменная типа Variant, представляющая значение свойства Name объекта QueryDef (только в рабочей области ядра Microsoft Jet).
Дополнительные сведения

Использование данного метода позволяет быть уверенным в том, что объект Recordset содержит самые свежие данные.  Данный метод заполняет текущий объект Recordset либо с помощью запроса с текущими параметрами, либо (в рабочей области Microsoft Jet) с использованием параметров запроса, указанного в аргументе новыйЗапрос.

Если в рабочей области ODBCDirect исходный запрос выполнялся в асинхронном режиме, метод Requery также запускает асинхронный запрос.

Если не указать аргумент новыйЗапрос, объект Recordset заполняется с использованием определения запроса и параметров, применявшихся при начальном заполнении объекта Recordset.  При повторном заполнении учитываются любые изменения в базовых таблицах.  Если объект QueryDef не был использован для создания объекта Recordset, то объект Recordset создается заново.

Если аргумент новыйЗапрос задает исходный объект QueryDef, то объект Recordset обновляется с использованием параметров, указанных в объекте QueryDef.  При повторном заполнении учитываются любые изменения в базовых таблицах.  Для заполнения объекта Recordset с новыми параметрами запроса необходимо указать другое значение аргумента новыйЗапрос.

Если указать объект QueryDef, отличный от использовавшегося для создания исходного объекта Recordset, то объект Recordset создается заново.

После вызова метода Requery первая запись объекта Recordset становится текущей записью.

Метод Requery нельзя применять к объектам Recordset типа динамических или статических наборов записей, у которых свойство Restartable имеет значение False.  Однако если указан необязательный аргумент новыйЗапрос, то свойство Restartable игнорируется.

Если после применения метода Requery оба свойства BOF и EOF объекта Recordset имеют значение True, то в результате выполнения запроса не будет возвращена ни одна запись, и объект Recordset не будет содержать данных.


Метод Seek

Находит в индексированном объекте Recordset типа таблицы запись, удовлетворяющую заданным условиям для текущего индекса, и делает эту запись текущей записьюрабочей области ядра Microsoft Jet

Синтаксис

наборЗаписей.Seek сравнение, ключ1, ключ2...ключ13

Синтаксис метода Seek содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая существующий табличный объект Recordset, имеющий индекс, определенный с помощью свойства Index объекта Recordset.
сравнение	Одно из следующих строковых выражений: "<", "<=", "=", ">=" или ">".
ключ1, ключ2...ключ13	Одно или несколько значений ключевых полей в текущем индексе объекта Recordset, определенных с помощью свойства Index.  Допускается указание до 13 аргументов ключ.
Дополнительные сведения

Перед вызовом метода Seek следует обязательно с помощью свойства Index указать текущий индекс.  Если в индексе используется ключевое поле с повторяющимися значениями, то метод Seek найдет первую из записей, удовлетворяющую заданным условиям.

Метод Seek проводит поиск по указанным ключевым полям и находит первую запись, удовлетворяющую условиям, которые заданы с помощью аргументов сравнение и ключ1.  Найденная запись становится текущей записью, а свойство NoMatch получает значение False.  Если в методе Seek не найдена запись, удовлетворяющая указанным условиям, свойство NoMatch получает значение True, а положение текущей записи становится неопределенным.

Если в аргументе сравнение задано условие "равняется" (=), "больше или равняется" (>=) или "больше" (>), то поиск по направлению вперед начинается с начала индекса.

Если в аргументе сравнение задано условие "меньше" (<) или "меньше или равняется" (<=), то поиск проводится в обратном порядке и начинается с конца индекса, за исключением случая наличия в конце индекса одинаковых значений.  В последнем случае метод Seek начнет поиск с одной произвольной записи из имеющих одинаковые значения в конце индекса.

Необходимо указать значения для всех полей индекса.  Если метод Seek применяется к составному индексу, и не указано точное значение для каждого поля, то использование оператора "равняется" (=) становится невозможным.  Причиной этого станут значения Null, задающиеся по умолчанию для некоторых из полей (ключ2, ключ3 и т.д.).  В таком случае оператор "равняется" сможет обнаружить только запись, имеющую пустые значения во всех полях индекса, за исключением тех, для которых заданы значения аргументов метода Seek.  Рекомендуется в подобных случаях использовать операторы "больше или равняется" или "меньше или равняется".

Аргумент ключ1 должен иметь тот же самый тип данных поля, что и соответствующее поле текущего индекса.  Например, если в текущий индекс включено числовое поле (такое как поле "КодСотрудника"), то значение аргумента ключ1 должно быть числом.  Аналогично, если текущий индекс описывает текстовое поле (такое как "Фамилия"), то аргумент ключ1 должен иметь строковое значение.

При вызове метода Seek не требуется предварительного определения текущей записи.

Для перечисления существующих индексов можно воспользоваться семейством Indexes.

Для поиска нужной записи в объекте Recordset типа динамического или статического набора записей следует использовать методы группы Find.  Для включения в поиск всех записей, а не только записей, удовлетворяющих определенным условиям, следует использовать методы группы Move.

Метод Seek нельзя применять к присоединенной таблице, поскольку присоединенные таблицы не могут быть открыты как табличные объекты Recordset.  Однако при использовании метода OpenDatabase для прямого открытия базы данных с устанавливаемым драйвером ISAM (не являющейся базой данных ODBC) становится возможным применение метода Seek к таблицам этой базы данных.

В рабочей области ODBCDirect методы Find и Seek нельзя применять к объектам Recordset любых типов, поскольку выполнение методов Find или Seek через сетевое подключение ODBC является неэффективным.  Вместо этого следует создать запрос (т.е. использовать аргумент источник в методе OpenRecordset) с соответствующим предложением WHERE, ограничивающим возвращаемые записи теми, которые удовлетворяют условиям, задаваемым при поиске с использованием методов Find или Seek.


Метод Synchronize

Синхронизирует две реплики (только для баз данных Microsoft Jet).

Синтаксис

базаДанных.Synchronize путь, обмен

Синтаксис метода Synchronize содержит следующие элементы.

Элемент	Описание
базаДанных	Объектная переменная, представляющая объект Database, который является репликой.
путь	Выражение или переменная типа String, содержащая путь к реплике, с которой будет синхронизирована базаДанных.  Расширение имени .mdb указывать необязательно.
обмен	Необязательный.  Константа, указывающая, в каком направлении производится синхронизация изменений двух баз данных, как описано в разделе "Значения".
Значения

Значения аргумента обмен задаются с помощью следующих констант.  Допускается использование одной из первых трех констант с или без четвертой.

Константа	Описание
dbRepExportChanges	Передача изменений из базыДанных в файл путь.
dbRepImportChanges	Передача изменений из файла путь в базуДанных.
dbRepImpExpChanges	(По умолчанию).  Передача изменений из базыДанных в файл путь и обратно, т.е. двухсторонний обмен.
dbRepSyncInternet	Обмен данными между двумя файлами, подключенными через путь Internet.
Дополнительные сведения

Данный метод используется для обмена данными и изменениями структуры между двумя базами данных.  Для того чтобы обмен стал возможен, обе базы данных должны иметь одинаковые структурные уровни.  Например, экспорт, задаваемый константой dbRepExportChanges, может вызвать предварительную передачу изменений макета в текущую реплику, даже при том условии, что данные будут передаваться только из реплики базаДанных в файл путь.

Реплика, определяемая аргументом путь, должна принадлежать к тому же набору реплик.  Если обе реплики имеют одинаковые значения свойства ReplicaID или имеют статус основной реплики, попытка синхронизации приводит к ошибке.

При синхронизации двух реплик через сеть Internet необходимо задать константу dbRepSyncInternet.  В этом случае следует задать в аргументе путь вместо сетевого пути адрес URL (Uniform Resource Locator).

Примечание.   Не допускается синхронизация частичных реплик с другими частичными репликами.  Дополнительные сведения см. в разделе справки для метода PopulatePartial.

Для синхронизации через сеть Internet требуется диспетчер репликации, входящий в комплект разработчика Microsoft Office 97, Developer Edition.


Метод Update

Сохраняет содержимое буфера копирования в обновляемом объекте Recordset.

Синтаксис

наборЗаписей.Update (тип, режим )

Синтаксис метода Update содержит следующие элементы.

Элемент	Описание
наборЗаписей	Объектная переменная, представляющая открытый обновляемый объект Recordset.
тип	Необязательный.  Константа, задающая тип обновления, как описано в разделе "Значения" (только в рабочей области ODBCDirect).
режим	Необязательный.  Значение типа Boolean, указывающее, следует ли принудительно обновлять базу данных, вне зависимости от изменения другим пользователем данных в базовых источниках после вызова методов AddNew, Delete или Edit.  При значении True изменения заносятся, и все изменения, внесенные другим пользователем, переписываются.  При значении False (по умолчанию) изменения, внесенные другим пользователем за время ожидания обновления, приведут к невозможности занесения изменений, конфликтующих с уже внесенными изменениями.  Ошибка при этом не возникает, а в свойствах BatchCollisionCount и BatchCollisions будут записаны число конфликтующих записей и сами записи, соответственно (только в рабочей области ODBCDirect).
Значения

Значения аргумента тип задаются с помощью следующих констант.  Значения, отличные от значений по умолчанию, могут использоваться только при включенном режиме пакетного обновления.

Константа	Описание
dbUpdateRegular	По умолчанию.  Предстоящие изменения не помещаются в буфер и записываются на диск немедленно.
dbUpdateBatch	Запись на диск всех предстоящих изменений из буфера обновления.
dbUpdateCurrentRecord	Запись на диск только предстоящих изменений текущей записи.
Дополнительные сведения

Метод Update применяется для сохранения текущей записи и всех внесенных в нее изменений.

Внимание!   Внесенные в текущую запись изменения теряются в следующих случаях:

•	Вызван метод Edit или AddNew, а затем осуществлен переход к другой записи без вызова метода Update.

•	Вызван метод Edit или AddNew, после чего метод Edit или AddNew вызывается снова без вызова метода Update.

•	В значении свойства Bookmark указывается другая запись.

•	Набор записей, указанный в аргументе наборЗаписей, закрывается без вызова метода Update.

•	Пользователь отменяет сеанс редактирования, заданный в методе Edit, вызвав метод CancelUpdate.

Для внесения изменений в запись следует сначала скопировать содержимое текущей записи в буфер копирования с помощью метода Edit.  Если метод Edit не будет вызван первым, то попытка изменить значение поля или вызвать метод Update приведет к ошибке.

В рабочей области ODBCDirect можно выполнить пакетные обновления, если библиотека указателей набора записей поддерживает пакетные обновления, а объект Recordset был открыт с параметром пакетного обновления с нежесткой блокировкой.

В рабочей области ядра Microsoft Jet, когда в многопользовательской среде свойство LockEdits объекта Recordset имеет значение True (жесткая блокировка), запись остается заблокированной с момента вызова метода Edit до отмены изменения или до обновления записи с помощью метода Update.  Если свойство LockEdits имеет значение False (нежесткая блокировка), запись блокируется и сравнивается с исходной версией записи только непосредственно перед ее обновлением в базе данных. Если запись была изменена после вызова метода Edit, выполнить операцию Update невозможно.  При подключении ядра Microsoft Jet к базе данных ODBC или базе данных ISAM всегда используется нежесткая блокировка.  Для продолжения операции обновления следует снова вызвать метод Update.  Для возвращения к записи, измененной другим пользователем, следует выполнить инструкцию Move 0.

Примечание.   Для добавления, изменения или удаления записи необходимо, чтобы запись имела уникальный индекс в базовом источнике данных.  В противном случае возникает ошибка «Отсутствие разрешения» при вызове метода AddNew, Delete или Edit в рабочей области Microsoft Jet или ошибка «Недопустимый аргумент» при вызове метода Update в рабочей области ODBCDirect.


Метод Cancel

Отменяет отложенный вызов асинхронного метода (только в рабочей области ODBCDirect).

Синтаксис

объект.Cancel

Синтаксис метода Cancel содержит следующие элементы.

Элемент	Описание
объект	Строковое выражение, значением которого является один из объектов, перечисленных в списке "Применение".
Дополнительные сведения

Метод Cancel используют для отмены выполнения асинхронного метода Execute, MoveLast, OpenConnection или OpenRecordset (т.е. при неявном вызове метода с помощью параметра dbRunAsync).  Если параметр dbRunAsync не был использован при вызове отменяемого метода, то метод Cancel возвращает ошибку выполнения.

В следующей таблице показано, какие задачи отменяются при вызове метода Cancel для объектов разных типов.

Объект	Отменяются асинхронные методы
Connection	Execute или OpenConnection
QueryDef	Execute
Recordset	MoveLast или OpenRecordset
Ошибка возникает также, если после вызова метода Cancel делается попытка сослаться на объект, который был бы создан при асинхронном вызове метода OpenConnection или OpenRecordset (т.е. на объект Connection или Recordset, из которого был вызван метод Cancel).


Метод NextRecordset

Принимает следующий набор записей, если он имеется, создаваемый запросом на выборку с выводом по частям, при вызове метода OpenRecordset, и возвращает значение типа Boolean, указывающее, ожидается ли поступление одной или нескольких новых записей (только в рабочей области ODBCDirect).

Синтаксис

Set переменная = наборЗаписей.NextRecordset

Синтаксис метода NextRecordset содержит следующие элементы:

Элемент	Описание
переменная	Переменная типа Boolean. Значение True указывает, что в объекте наборЗаписей имеется следующий доступный набор записей; значение False указывает, что поступления записей не ожидается и наборЗаписей является пустым.
наборЗаписей	Переменная, представляющая существующий объект Recordset, в котором ожидается возвращение записей.
Дополнительные сведения

В рабочей области ODBCDirect пользователь имеет возможность открыть объект Recordset, с указанием более одного запроса на выборку в аргументе source метода OpenRecordset или в свойстве SQL объекта QueryDef, представляющего запрос на выборку, как показано в следующем примере.

SELECT Фамилия, Имя FROM Клиенты
WHERE Фамилия = 'Иванов';
SELECT Марка, Цена FROM Товары
WHERE КодТовара = 9999

В открытом объекте Recordset будут выведены результаты первого запроса.  Чтобы вывести второй результирующий набор записей, следует вызвать метод NextRecordset.

Если имеется доступный дополнительный набор записей (т.е. в методе OpenRecordset или в свойстве SQL указан еще один запрос), то записи, возвращенные в следующем запросе, будут загружены в объект Recordset, а свойство NextRecordset получит значение True, указывающее, что имеется дополнительный набор записей.  Если доступных дополнительных записей нет (т.е. в объект Recordset были загружены записи из последнего запроса), в свойстве NextRecordset возвращается значение False, а объект Recordset становится пустым.

Допускается также использование Cancel для сброса всего содержимого объекта Recordset.  Однако при вызове метода Cancel будут сброшены также еще не загруженные записи.


Метод OpenConnection

Открывает объект Connection (подключение) для источника данных ODBC (только в рабочей области ODBCDirect).

Синтаксис

Set подключение = рабочаяОбласть.OpenConnection (имя, параметры, толькоЧтение, строка)

Синтаксис метода OpenConnection содержит следующие элементы.

Элемент	Описание
подключение	Переменная, представляющая объект Connection, которой присвоено новое подключение.
рабочаяОбласть	Необязательный.  Переменная, представляющая объект Workspace, содержащая ссылка на существующий объект Workspace, в котором будет содержаться новое подключение.
имя	Строковое выражение.  См. описание в разделе "Дополнительные сведения".
параметры	Необязательный.  Значение типа Variant, задающее различные параметры подключения, как описано в разделе "Значения".  Используя это значение, диспетчер драйвера ODBC выводит приглашение пользователю указать такие параметры подключения как имя источника данных, имя пользователя и пароль.
толькоЧтение	Необязательный.  Выражение типа Boolean, имеющее значение True, если подключение открыто только для чтения, и значение False, если подключение открыто для чтения/записи (по умолчанию).
строка	Необязательный.  Строка подключения ODBC.  См. описание конкретных компонентов и синтаксиса этой строки в разделе справки для свойства Connect.  При необходимости, добавьте элемент "ODBC;".  Если аргумент строка опущен, элементы UID и/или PWD буду взяты из свойств UserName и Password объекта Workspace.
Значения

Аргумент параметры определяет, следует ли и в каких условиях выводить пользователю приглашение установить подключение, а также, следует или нет открывать подключение в асинхронном режиме.  Допускается использование одной из следующих констант.

Константа	Описание
dbDriverNoPrompt	Диспетчер драйвера ODBC использует строку подключения, определяемую аргументами имя и строка.  Если нужные сведения не заданы, возникает ошибка выполнения.
dbDriverPrompt	Диспетчер драйвера ODBC открывает диалоговое окно ODBC Data Sources, в котором отображаются сведения, заданные в аргументах имя или строка.  В строке подключения используется имя источника данных, которое пользователь выбирает в диалоговых окнах, или, если пользователь не указывает имя источника данных, используется имя источника по умолчанию.
dbDriverComplete	Используется по умолчанию.  Если в аргументе строка заданы все необходимые для подключения сведения, диспетчер драйвера ODBC использует аргумент строка.  В противном случае выполняются действия, задаваемые константой dbDriverPrompt.
dbDriverCompleteRequired	Данный параметр аналогичен константе dbDriverComplete, с тем лишь исключением, что драйвер ODBC отключает вывод приглашений на ввод любых данных, не являющихся обязательными для установления подключения.
dbRunAsync	Задает асинхронное выполнение метода.  Данную константу можно комбинировать с любыми константами аргумента параметры.
Дополнительные сведения

Метод OpenConnection используют для установления подключения к источнику данных ODBC из рабочей области ODBCDirect.  Метод OpenConnection похож, но не является эквивалентным методу OpenDatabase.  Основное различие заключается в том, что метод OpenConnection доступен только в рабочей области ODBCDirect.

Если указать в аргументе строка зарегистрированное имя источника данных ODBC (DSN), то аргумент имя может содержать любую правильную строку, которая будет служить значением свойства Name объекта Connection.  Если допустимое имя источника данных не включено в аргумент строка, то аргумент имя должен задавать правильное имя источника данных ODBC, которое также будет являться значением свойства Name.  Если ни один из аргументов имя или строка не содержит допустимое имя источника данных, можно указать для диспетчера драйвера ODBC (в аргументе параметры) вывод приглашений пользователю указать необходимые для подключения сведения.  Имя источника данных, введенное в ответ на приглашение, образует значение свойства Name.

Метод OpenConnection возвращает объект Connection, содержащий сведения о подключении.  Объект Connection аналогичен объекту Database.  Основная разница заключается в том, что объект Database обычно представляет базу данных, хотя он также может использоваться для представления подключения к источнику данных ODBC из рабочей области Microsoft Jet.


Метод SetOption

Временно переопределяет значения параметров для записей ядра базы данных Microsoft Jet в реестре Windows (только в рабочей области Microsoft Jet).

Синтаксис

DBEngine.SetOption параметр, новоеЗначение

Синтаксис метода SetOption содержит следующие элементы.

Элемент	Описание
параметр	Константа типа Long, описанная в разделе "Значения".
новоеЗначение	Значение типа Variant, с помощью которого задается параметр.
Значения

Каждая константа определяет соответствующий параметр реестра на пути Jet\3.5\Engines\Jet 3.5\ (например, dbSharedAsyncDelay соответствует записи Jet\3.5\Engines\Jet 3.5\SharedAsyncDelay и т.д.).

Константа	Параметр
dbPageTimeout	PageTimeout
dbSharedAsyncDelay	SharedAsyncDelay
dbExclusiveAsyncDelay	ExclusiveAsyncDelay
dbLockRetry	LockRetry
dbUserCommitSync	UserCommitSync
dbImplicitCommitSync	ImplicitCommitSync
dbMaxBufferSize	MaxBufferSize
dbMaxLocksPerFile	MaxLocksPerFile
dbLockDelay	LockDelay
dbRecycleLVs	RecycleLVs
dbFlushTransactionTimeout	FlushTransactionTimeout
Дополнительные сведения

Метод SetOption позволяет переопределить значение параметра реестра во время выполнения.  Новые значени параметров, заданные в методе SetOption, действуют до их изменения при новом вызове метода SetOption или до закрытия объекта DBEngine.

Для получения дополнительных сведений о записях реестра и соответствующих значениях параметров см. в разделе Инициализация ядра базы данных Microsoft Jet 3.5.


Метод PopulatePartial

Выполняет синхронизацию любых изменений в частичной реплике с полной репликой, очищает все записи в частичной реплике, а затем снова заполняет частичную реплику с использованием текущих фильтров реплики (только в базах данных Microsoft Jet).

Синтаксис

базаДанных.PopulatePartial имяБД

Синтаксис метода PopulatePartial содержит следующие элементы.

Элемент	Описание
базаДанных	Объектная переменная, представляющая ссылку на частичную реплику объекта Database, которую требуется заполнить.
имяБД	Выражение типа String, указывающее путь и имя полной реплики, из которой берутся записи.
Дополнительные сведения

При синхронизации частичной реплики с полной репликой возможно образование в частичной реплике записей, не имеющих исходных в полной реплике.  Например, предположим, что имеется таблица "Клиенты", с заданным в свойстве ReplicaFilter условием "Город = 'Тверь'".  Если пользователь заменяет в записях частичной реплики "Тверь" на "Тула", а затем выполняет синхронизацию с помощью метода Synchronize, то изменения будут направлены в полную реплику, но записи, содержащие значение "Тула" в частичной реплике, не будут иметь соответствующих им записей в полной, поскольку не удовлетворяют условиям фильтра.

Чтобы разрешить проблему записей, не имеющих исходных, следует использовать метод PopulatePartial.  Метод PopulatePartial аналогичен методу Synchronize, но в нем выполняется общая синхронизация с полной репликой, удаляются все записи из частичной реплики, а затем частичная реплика заполняется снова с использованием текущих фильтров реплики.  Даже если фильтры реплики не были изменены, метод PopulatePartial всегда очищает все записи в частичной реплики, а затем снова заполняет ее с помощью текущих фильтров.

В общем случае, метод PopulatePartial следует использовать при создании частичной реплики и при каждом изменении фильтров реплики.  Если приложение изменяет фильтры реплики, необходимо выполнить следующие действия:

1	Выполните синхронизацию полной реплики с частичной репликой, в которой были изменены фильтры.

2	С помощью свойств ReplicaFilter и PartialReplica внесите необходимые изменения в фильтр реплики.

3	Вызовите метод PopulatePartial для удаления всех записей из частичной реплики и перевода в нее всех записей из полной реплики, удовлетворяющих новым условиям фильтра.

Если фильтр реплики был изменен, а метод Synchronize вызывается без предварительного вызова метода PopulatePartial, возникает перехватываемая ошибка.

Метод PopulatePartial можно вызывать для частичной реплики, которая была открыта для монопольного доступа.  Более того, нельзя вызывать метод PopulatePartial из программы, выполняющейся в самой частичной реплике.  Вместо этого следует открыть частичную реплику с монопольным доступом из полной реплики или из другой базы данных, а затем вызвать метод PopulatePartial.

Примечание.   Хотя метод PopulatePartial выполняет односторонюю синхронизацию до очистки и нового заполнения частичной реплики, полезным приемом является вызов метода Synchronize перед вызовом PopulatePartial.  Если вызов Synchronize окажется неудачным, возникает перехватываемая ошибка.  Пользователь имеет возможность использовать эту ошибку, чтобы решить, стоит или нет вызывать метод PopulatePartial (который удалит все записи из частичной реплики).  Если же вызвать только метод PopulatePartial, и при синхронизации записей возникнет ошибка, записи частичной реплики будут удалены, что может явиться нежелательным.


Свойство AbsolutePosition

Задает или возвращает относительный номер текущей записи в объекте Recordset.

Задаваемые и возвращаемые значения

Задаваемые и возвращаемые значения являются целыми числами (типа Long) в диапазоне от 0 до значения, меньшего полного числа записей в объекте Recordset.  Это значение соответствует позиции текущей записи в объекте Recordset.

Дополнительные сведения

Свойство AbsolutePosition позволяет установить указатель текущей записи на запись, занимающую определенную позицию в динамическом или статическом объекте Recordset.  Кроме того, считывая значение свойства AbsolutePosition, можно определить положение текущей записи.

Поскольку нумерация записей в свойстве AbsolutePosition начинается с нуля (0 соответствует первой записи в наборе записей), нельзя задать значение этого свойства, равное или превышающее полное число записей в наборе; такая попытка приведет к возникновению перехватываемой ошибки.  Для того чтобы найти полное число записей в наборе, следует проверить значение свойства RecordCount.  Максимальное допустимое значение свойства AbsolutePosition равняется RecordCount - 1.

Если текущая запись не определена, а также при отсутствии записей в объекте Recordset, свойство AbsolutePosition возвращает значение –1.  При удалении текущей записи значение свойства AbsolutePosition становится неопределенным, и ссылка на значение этого свойства приводит к возникновению перехватываемой ошибки.  Новые записи добавляются в конец набора записей.

Данное свойство не предназначено для использования в качестве заменителя номера  записи.  Для фиксации текущей позиции в наборе и для возвращения в эту позицию рекомендуется использовать закладки.  Закладка также предоставляет единственный способ размещения текущей записи в объекте Recordset любого типа.  В частности, положение конкретной записи изменяется при удалении одной или нескольких предшествующих записей.  Кроме того, нет гарантий, что конкретная запись займет то же положение при новом открытии объекта Recordset, если только этот набор не будет создан с помощью инструкции SQL с предложением ORDER BY.

Примечания

•	Попытка задать превышающее нуль значение свойства AbsolutePosition для только что открытого и еще не заполненного объекта Recordset приводит к возникновению перехватываемой ошибки. Предварительно необходимо заполнить объект Recordset с помощью метода MoveLast.

•	Свойство AbsolutePosition недоступно для объектов Recordset типа статического набора записей с последовательным доступом или для объектов Recordset, открытых с помощью запросов к серверу для баз данных ODBC, подключенных к ядру Microsoft Jet.


Свойство AllowZeroLength

Задает или возвращает значение, указывающее, является ли пустая строка ("") допустимым значением свойства Value объекта Field с типом данных Text или Memo.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение, имеющее тип данных Boolean, показывает, является ли пустые строки допустимым.  Свойство имеет значение True, если в объекте Field допускаются пустые строки в качестве значения свойства Value; значением по умолчанию является False.

Дополнительные сведения

Для объекта, еще не добавленного в семейство Fields, данное свойство доступно для чтения/записи.

После добавления в семейство Fields доступность свойства AllowZeroLength зависит от объекта, в котором содержится семейств Fields, как показано в следующей таблице.

Вмещающий объект	Свойство AllowZeroLength
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Чтение/запись
Данное свойство используют вместе со свойствами Required, ValidateOnSet или ValidationRule для указания условий на значение поля.


Свойство AllPermissions

Возвращает все разрешения, присвоенные учетной записи, указанной в свойстве UserName текущего объекта Container или Document, включая как разрешения, присвоенные конкретному пользователю, так и разрешения, которые пользователь наследует как член групп (только в рабочей области Microsoft Jet).

Возвращаемые значения

Для любого объекта Container или Document возвращаемое значение имеет тип Long или задается с помощью следующих констант.

Константа	Описание
dbSecReadDef	Допускается чтение описания таблицы, в том числе сведений о столбцах и индексах.
dbSecWriteDef	Допускается изменение и удаление описания таблицы, в том числе сведений о столбцах и индексах.
dbSecRetrieveData	Допускается загрузка данных из объекта Document.
dbSecInsertData	Допускается добавление записей.
dbSecReplaceData	Допускается изменение записей.
dbSecDeleteData	Допускается удаление записей.
Кроме того, для контейнера из семейства баз данных, а также для любого объекта Document из семейства Documents, возможно включение следующих констант.

Константа	Описание
dbSecDeleteData	Допускается удаление записей.
dbSecDBAdmin	Допускается репликация и изменение пароля базы данных.
dbSecDBCreate	Допускается создание новой базы данных.  Поддерживается только для контейнера семейства база данных в системной базе данных (System.mdw).
dbSecDBExclusive	Монопольный доступ к базе данных.
dbSecDBOpen	Допускается открытие базы данных.
Дополнительные сведения

Данное свойство отличается от свойства Permissions, в котором возвращаются только разрешения, присвоенных конкретному пользователю, и не включаются разрешения, которые пользователь наследует как член группы.  Если текущим значением свойства UserName является имя группы, то значения, возвращаемые свойствами AllPermissions и Permissions, совпадают.


Свойство Attributes

Задает или возвращает значение, указывающее одну или несколько характеристик объекта Field, Relation или TableDef.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long, значением по умолчанию является 0.

Для объекта Field значение свойства задает характеристики поля, представляемого данным объектом.  Значение данного свойства может быть выражено как сумма констант из следующего списка:

Константа	Описание
dbAutoIncrField	Значение поля в новой записи автоматически увеличивается на уникальное значение типа Long, которое невозможно изменить (в рабочей области Microsoft Jet, поддерживается только для таблиц баз данных Microsoft Jet (.mdb)).
dbDescending	Поле сортируется по убыванию (от "Я" до "А" и от 100 до 0) (только для объектов Field из семейства Fields объекта Index).  Если данная константа не задана, то по умолчанию поле сортируется по возрастанию.  Значение по умолчанию определено для полей объектов Index и TableDef (только в рабочей области Microsoft Jet).
dbFixedField	Поле имеет постоянный размер (задается по умолчанию для числовых полей).
dbHyperlinkField	Поле содержит сведения о гиперссылке (только для полей Memo).
dbSystemField	Поле содержит сведения о реплицикации для реплик; удаление полей этого типа не допускается (только в рабочей области Microsoft Jet).
dbUpdatableField	Значение поля можно изменять.
dbVariableField	Поле имеет переменный размер (только для текстовых полей).
Для объекта Relation значение свойства задает характеристики связи, представляемой данным объектом. Значение данного свойства может быть выражено как сумма констант из следующего списка:

Константа	Описание
dbRelationUnique	Связь имеет тип отношения "один-к-одному".
dbRelationDontEnforce	Отключается режим обеспечения целостности данных.
dbRelationInherited	Связь определена не в текущей базе данных, две присоединенные таблицы содержатся во внешней базе данных.
dbRelationUpdateCascade	Задается режим каскадного обновления.
dbRelationDeleteCascade	Задается режим каскадного удаления.
Примечание.    Если в свойстве Attributes объекта Relation задан режим каскадных операций, то ядро базы данных Microsoft Jet автоматически обновляет или удаляет записи в одной или нескольких подчиненных таблицах при соответствующих изменениях в главных таблицах.

Предположим, например, что задан режим каскадного удаления для связи между таблицами "Клиенты" и "Заказы".  При удалении записей из таблицы "Клиенты" будут автоматически удаляться связанные записи из таблицы "Заказы".  Кроме того, если задано каскадное удаление для связей между таблицей "Заказы" и другими таблицами, то при удалении записей из таблицы "Клиенты" будут удалены связанные записи и в этих таблицах.

Для объекта TableDef свойство Attributes задает характеристики таблицы, представляемой данным объектом.  Значение данного свойства может быть выражено как сумма констант типа Long из следующего списка:

Константа	Описание
dbAttachExclusive	Указывает для баз данных, использующих ядро Microsoft Jet, что таблица является присоединенной таблицей и открыта в режиме монопольного доступа.  Эта константа может быть задана для добавленного объекта TableDef для локальной, но не для удаленной таблицы.
dbAttachSavePWD	Указывает для баз данных, использующих ядро Microsoft Jet, что код пользователя и пароль доступа к удаленной присоединенной таблице следует сохранить вместе со сведениями о присоединении.  Эта константа может быть задана для добавленного объекта TableDef для удаленной, но не для локальной таблицы.
dbSystemObject	Таблица является системной таблицей ядра Microsoft Jet.  Эта константа может быть задана для добавленного объекта TableDef.
dbHiddenObject	Таблица является скрытой таблицей ядра Microsoft Jet.  Эта константа может быть задана для добавленного объекта TableDef.
dbAttachedTable	Таблица является присоединенной таблицей из базы данных, не являющейся источником данных ODBC, например, из базы данных с ядром Microsoft Jet или базы данных Paradox (только чтение).
dbAttachedODBC	Таблица является присоединенной таблицей из базы данных ODBC, например, из базы данных Microsoft SQL Server (только чтение).
Дополнительные сведения

Для объекта, еще не добавленного в семейство, данное свойство доступно для чтения/записи.

Для добавленного объекта Field использование свойства Attributes зависит от того, какой из объектов содержит семейство Fields.

Вмещающий объект	Использование свойства Attributes
Index	Чтение/запись, пока объект TableDef, в который включен объект Index, не добавлен в объект Database; после этого только чтение.
QueryDef	Только чтение.
Recordset	Только чтение.
Relation	Не поддерживается.
TableDef	Чтение/запись.
Для добавленного объекта Relation свойство Attributes доступно только для чтения.

Для добавленного объекта TableDef свойство доступно для чтения/записи, хотя, если объект уже добавлен в семейство, невозможно задать все константы, как отмечалось в разделителе "Задаваемые и возвращаемые значения".

Допускается одновременное задание нескольких атрибутов, при этом следует просто просуммировать соответствующие константы.  Любые неверные (не имеющие смысла) значения свойства будут проигнорированы без возникновения ошибки.


Свойства BOF, EOF

•	BOF — возвращает значение, показывающее, расположен ли указатель текущей записи в позиции перед первой записью объекта Recordset.

•	EOF — возвращает значение, показывающее, расположен ли указатель текущей записи в позиции после последней записи объекта Recordset.

Возвращаемые значения

Возвращаемые значения свойств BOF и EOF имеют тип данных Boolean.

Свойство BOF возвращает значение True, если указатель текущей записи расположен перед первой записью набора записей, и значение False, если указатель текущей записи расположен на первой записи набора или на любой записи после нее.

Свойство EOF возвращает значение True, если указатель текущей записи расположен после последней записи набора, и значение False, если указатель текущей записи расположен на последней записи набора или на любой записи перед ней.

Дополнительные сведения

Свойства BOF и EOF используют для проверки наличия записей в объекте Recordset, а также для сообщения о выходе за пределы объекта при перемещении от записи к записи.

Возвращаемые значения свойств BOF и EOF определяются положением указателя текущей записи.

Если любое из свойств BOF или EOF имеет значение True, текущая запись не определена.

При открытии объекта Recordset, не содержащего ни одной записи, оба свойства BOF и EOF получают значение True, а свойство набора записей RecordCount  (число записей) получает значение 0.  При открытии объекта Recordset, который содержит хотя бы одну запись, первая запись набора становится текущей записью, а свойства BOF и EOF получают значения False.  Данные свойства сохраняют значения False до тех пор, пока указатель текущей записи не переместится за пределы начала или конца набора записей при использовании, соответственно, методов MovePrevious или MoveNext, соответственно.  После выхода за пределы набора записей текущая запись становится неопределенной.

После удаления последней оставшейся записи объекта Recordset свойства BOF и EOF могут сохранять значение False до тех пор, пока не будет предпринята попытка изменить положение указателя текущей записи.

При вызове метода MoveLast для объекта Recordset, содержащего записи, текущей записью становится последняя запись набора.  Если после этого вызвать метод MoveNext, то текущая запись становится неопределенной, а свойство EOF получает значение True.  Аналогично, при вызове метода MoveFirst для непустого объекта Recordset текущей записью становится первая запись набора.  Последующий вызов метода MovePrevious приводит к тому, что текущая запись становится неопределенной, а свойство BOF получает значение True.

Как правило, при работе со всеми записями из объекта Recordset в программе задают перемещение в цикле по записям с помощью метода MoveNext до тех пор, пока свойство EOF не получит значение True.

Вызов метода MoveNext или MovePrevious, когда, соответственно, свойство EOF или BOF имеет значение True, приводит к возникновению ошибки.

В следующей таблице показано, какие из методов группы Move можно применять при различных комбинациях значений свойств BOF и EOF.

	MoveFirst, MoveLast	MovePrevious, Move < 0	Move 0	MoveNext, Move > 0
BOF=True, EOF=False	Допускается	Ошибка	Ошибка	Допускается
BOF=False, EOF=True	Допускается	Допускается	Ошибка	Ошибка
Оба True	Ошибка	Ошибка	Ошибка	Ошибка
Оба False	Допускается	Допускается	Допускается	Допускается
Допустимость применения метода из группы Move еще не означает, что метод обязательно обнаружит запись.  Это просто означает, что попытка выполнить указанный метод Move является допустимой и не приведет к ошибке.  В результате вызова метода из группы Move состояние свойств BOF и EOF может измениться.

При вызове метода OpenRecordset неявно выполняется метод MoveFirst.  Таким образом, в результате вызове метода OpenRecordset для пустого набора записей свойства BOF и EOF получают значение True.  (Результаты неудачной попытки выполнить метод MoveFirst представлены в приведенной ниже таблице).

Все методы группы Move, в которых успешно обнаруживается запись, задают для свойств BOF и EOF значение False.

В рабочей области Microsoft Jet при добавлении записи в пустой объект Recordset, свойство BOF получает значение False, а свойство EOF сохраняет значение True, указывающее, что позиция текущей записи находится в конце объекта Recordset.  В рабочей области ODBCDirect оба свойства BOF и EOF получают значение False, указывающее, что позиция текущей записи находится на новой записи.

Любой вызов метода Delete, даже приводящий к удалению последней записи из набора записей, не изменяет значения свойств BOF и EOF.

Результаты для свойств BOF и EOF вызова одного из методов Move, не приведшего к обнаружению записи, представлены в следующей таблице.

	BOF	EOF
MoveFirst, MoveLast	True	True
Move 0	Без изменений	Без изменений
MovePrevious, Move < 0	True	Без изменений
MoveNext, Move > 0	Без изменений	True


Свойство Bookmark

Устанавливает или возвращает закладку,  которая однозначно определяет текущую запись в Recordset.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение определяются строковым выражением или выражением типа Variant, значением которого является допустимая закладка.  Типом данных является массив Variant элементов типа Byte.

Дополнительные сведения

Для объекта Recordset, созданного исключительно на основе таблиц ядра базы данных Microsoft Jet, свойство Bookmarkable имеет значение True, и допускается использование свойства Bookmark для объектов Recordset.  Например, не допускается использование закладок в любом объекте Recordset, созданном на основе присоединенной таблицы Paradox, в которой не определен ключ.

При создании или открытии объекта Recordset каждая из его записей получает уникальную закладку.  Для того чтобы запомнить положение текущей записи, следует присвоить текущее значение свойства Bookmark переменной.  Для быстрого возвращения к сохраненному в переменной указателю текущей записи в любое время после перехода на другую запись следует указать в значении свойства Bookmark объекта Recordset значение этой переменной.

Число возможных закладок в наборе записей не ограничивается.  Для создания закладки, определяющей запись, отличную от текущей записи, следует перейти на нужную запись, а затем присвоить значение свойства Bookmark строковой переменной, которая будет указывать на нужную запись.

Перед использованием свойства Bookmark следует проверить значение свойства Bookmarkable объекта Recordset, которое определяет, поддерживает ли данный набор записей использование закладок.  Если свойство Bookmarkable имеет значение False, объект Recordset не поддерживает закладки, и обращение к свойству Bookmark приведет к возникновению перехватываемой ошибки.

Если с помощью метода Clone создана копия объекта Recordset, то значения закладок для исходного объекта Recordset и его копии являются идентичными и допускают взаимную замену.  Однако нельзя использовать подобным образом закладки из других объектов Recordset, даже если они были созданы на основе одного объекта или с помощью одинаковой инструкции SQL.

При попытке задать для свойства Bookmark значение, представляющее удаленную запись, возникает перехватываемая ошибка.

Значение свойства Bookmark не идентично номеру записи.


Свойство Bookmarkable

Возвращает значение, показывающее, поддерживает ли объект Recordset закладки, которые устанавливаются с помощью свойства Bookmark.

Возвращаемые значения

Возвращаемое значение имеет тип Boolean и содержит значение True, если объект поддерживает использование закладок.

Дополнительные сведения

Значение свойства Bookmarkable следует проверить перед попыткой установить или прочитать значение свойства Bookmark.

Для объекта Recordset, созданного исключительно на основе таблиц ядра базы данных Microsoft Jet, свойство Bookmarkable имеет значение True, и допускается использование свойства Bookmark для объектов Recordset.  Например, не допускается использование закладок в любом объекте Recordset, созданном на основе присоединенной таблицы Paradox, в которой не определен ключ.


Свойство CacheSize

Задает или возвращает число записей, загруженных из источника данных ODBC, которых следует поместить в локальный буфер.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и должно находиться в пределах от 5 до 1200, но не превышать объем доступной памяти.  Типичным значением данного свойства является число 100.  Значение 0 отключает буфер.

Дополнительные сведения

Помещение данных в локальный буфер повышает быстродействие при использовании объектов Recordset для загрузки данных с удаленного сервера.  Буфером называется область локальной памяти, содержащая данные, которые были получены с сервера во время последних обращений.  Данные заносятся в локальный буфер в предположении, что во время выполнения приложения потребуется повторное обращение к этим данным.  Во время обращения к данным ядро базы данных Microsoft Jet сначала проверяет наличие данных в локальном буфере вместо обращения к серверу, которое занимает намного больше времени.  В локальном буфере сохраняются только данные, поступающие из источника данных ODBC.

Любой источник данных ODBC, подключенный к ядру Microsoft Jet, такой как присоединенная таблица, может иметь собственный локальный буфер.  Для создания локального буфера следует открыть объект Recordset на основе удаленного источника данных, задать значения свойств CacheSize и CacheStart, а затем вызвать метод FillCache или осуществить переходы по записям с помощью методов группы Move.

Для источника данных ODBCDirect также поддерживается использование локального буфера. Для создания буфера следует определить свойство CacheSize объекта QueryDef.  Для объекта Relation свойство CacheSize доступно только для чтения и определяется значением свойства CacheSize объекта QueryDef.  В рабочей области ODBCDirect невозможно использовать свойство CacheStart в методе FillCache.

Выбор значения свойства CacheSize основывается на числе записей, с которыми приложение может работать одновременно.  Например, если объект Recordset используется как источник данных для вывода на экран, удобно задать для свойства CacheSize значение 20 для сохранения в буфере 20 одновременно выводимых на экран записей.

Записи, которые помещены в локальный буфер, принимаются ядром базы данных Microsoft Jet непосредственно из буфера, а записи вне этого диапазона загружаются с сервера.

Записи, полученные из локального буфера, не отражают изменений, внесенных в источник данных другими пользователями со времени записи данных в буфер.

Для принудительного обновления содержимого локального буфера следует задать значение 0 для свойства CacheSize объекта Recordset, а затем восстановить первоначальное значение размера буфера и вызвать метод FillCache.


Свойство Clustered

Задает или возвращает значение, указывающее, представляет ли объект Index кластерный индекс таблицы (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Boolean и содержит значение True, если объект Index представляет кластерный индекс.

Дополнительные сведения

Кластерные индексы используются в некоторых форматах настольных СУБД IISAM.  Кластерный индекс состоит из одного или нескольких неключевых полей, которые, взятые вместе, позволяют расположить все записи таблицы в заранее определенном порядке.  Кластерный индекс предоставляет возможность эффективного доступа к записям таблицы, в которой значения индекса могут не быть уникальными.

Свойство Clustered доступно для чтения/записи для нового объекта Index, еще не добавленного в семейство, и доступно только для чтения для объекта Index, включенного в семейство Indexes.

Примечания

•	Значение свойства Clustered игнорируется для баз данных Microsoft Jet, поскольку ядро Microsoft Jet не поддерживает кластерные индексы.

•	Для источников данных ODBC свойство Clustered всегда возвращает значение False; это свойство не позволяет определить, имеет ли база данных ODBC кластерные индексы.


Свойство CollatingOrder

Возвращает значение, указывающее порядок символов, используемый при сравнении текстовых строк или при определении порядка сортировки (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение является значением типа Long или одной из следующих констант.

Константа	Язык, определяющий порядок сортировки
dbSortGeneral	Общий порядок символов (английский, французский, немецкий, португальский, итальянский и современный испанский)
dbSortArabic	Арабский
dbSortChineseSimplified	Упрощенный китайский
dbSortChineseTraditional	Традиционный китайский
dbSortCyrillic	Русский
dbSortCzech	Чешский
dbSortDutch	Голландский
dbSortGreek	Греческий
dbSortHebrew	Иврит
dbSortHungarian	Венгерский
dbSortIcelandic	Исландский
dbSortJapanese	Японский
dbSortKorean	Корейский
dbSortNeutral	Нейтральный (независимый от языка)
dbSortNorwDan	Норвежский или датский
dbSortPDXIntl	Международный набор символов Paradox
dbSortPDXNor	Норвежский или датский набор символов Paradox
dbSortPDXSwe	Шведский или финский набор символов Paradox
dbSortPolish	Польский
dbSortSlovenian	Словенский
dbSortSpanish	Испанский
dbSortSwedFin	Шведский или финский
dbSortThai	Тайский
dbSortTurkish	Турецкий
dbSortUndefined	Порядок символов не определен или неизвестен.
Дополнительные сведения

Использование свойства CollatingOrder зависит от того, какой из объектов содержит семейство Fields, как показано в следующей таблице.

Вмещающий объект	Доступ к свойству CollatingOrder
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Только чтение
Значение свойства CollatingOrder совпадает со значением аргумента порядок, которое было указано в методе CreateDatabase при создании базы данных или в методе CompactDatabase при последнем сжатии базы данных.

Значение свойства CollatingOrder объектов Database или Field проверяют для определения метода сравнения строк, указанного для базы данных или для отдельного поля. С  помощью свойства CollatingOrder нового, еще не добавленного в семейство объекта Field можно указать использование в поле порядка символов, отличного от общего порядка символов, использующегося во вмещающем данное поле объекте Database.

Значения свойств CollatingOrder и Attributes объекта Field, входящего в семейство Fields объекта Index, определяют порядок символов при сравнении строк и порядок сортировки в индексе.  Однако невозможно указать особый порядок  для отдельного индекса.  Порядок задается сразу для всей таблицы.


Свойство ConflictTable

Возвращает имя таблицы конфликтов, содержащей записи базы данных, ставшие причиной конфликта при синхронизации двух реплик (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение имеет тип String и содержит пустую строку, если таблицы конфликтов нет или база данных не является репликой.

Дополнительные сведения

Если два пользователя, работающие с отдельными репликами, вносят изменения в одну и ту же запись, то изменения, сделанные одним пользователем, не будут приняты второй репликой.  Как следствие, пользователь, которому не удалось занести изменения в базу данных, должен выполнить действия, необходимые для разрешения конфликта.

Конфликт возникает на уровне записи, а не на уровне полей.  Например, если один пользователь изменяет значение поля "Адрес", а другой значение поля "Телефон" в одной и той же записи, то одно из изменений отвергается.  Поскольку конфликт возникает на уровне записи, вполне вероятной является ситуация, когда принятое изменение и отвергнутое изменение, в действительности, не противоречат друг другу.

Для разрешения конфликта механизм синхронизации создает таблицы конфликтов, в которые заносятся данные, которые были бы занесены в основные таблицы при успешном выполнении изменений.  Пользователь, создающий программы для объектов доступа к данным, имеет возможность просмотреть таблицы конфликтов и выбрать из них подходящие данные.

Все таблицы конфликтов получают имена вида "таблица_conflict", где прототип таблица представляет имя исходной таблицы, сокращенное, чтобы в результате не превысить максимально возможной длины имени таблицы.


Свойство Connect

Задает или возвращает значение, содержащее сведения об источнике открытого подключения, открытой базе данных, базе данных, используемой в запросе к серверу или присоединенной таблице.  Для объектов Database, новых объектов Connection, присоединенных таблиц и объектов TableDef, еще не добавленных в семейство, значение данного свойства доступно для чтения/записи.  Для объектов QueryDef и основных таблиц, данное свойство доступно только для чтения.

Синтаксис

объект.Connect = типБазыДанных;параметры;

Синтаксис свойства Connect содержит следующие элементы.

Элемент	Описание
объект	Объектное выражение, значением которого является один из объектов, перечисленных в списке "Применение".
типБазыДанных	Необязательный.  Выражение типа String, определяющее тип базы данных.  Для баз данных Microsoft Jet этот аргумент следует исключить; если при этом задается аргумент параметры, то вместо аргумента типБазыДанных следует подставить точку с запятой (;).
параметры	Необязательный.  Выражение типа String, определяющее дополнительные параметры, передаваемые драйверу ODBC или устанавливаемым драйверам ISAM.  Отдельные параметры разделяются точкой с запятой.
Значения

Значением свойства Connect (подключение) является строка, образуемая из указателя типа базы данных и произвольного числа параметров, разделяемых точкой с запятой.  Свойство Connect используется для передачи дополнительной информации драйверу ODBC и некоторым устанавливаемым драйверам ISAM.

Для выполнения запроса к серверу SQL по таблице, присоединенной к файлу базы данных Microsoft Jet (.mdb), необходимо сначала задать в свойстве Connect базы данных присоединенной таблицы допустимую строку подключения ODBC.

Для объекта TableDef, представляющего присоединенную таблицу, значение свойства Connect может состоять из одного или двух компонентов (указателя типа базы данных и пути к базе данных), каждый из которых должен заканчиваться точкой  запятой.

Путь, как показано в следующей таблице, задает полный путь к каталогу, содержащему файлы базы данных, и должен начинаться с идентификатора DATABASE=.  В некоторых случаях (для Microsoft Excel и баз данных Microsoft Jet), имя файла необходимо включать в аргумент пути.

В следующей таблице перечислены допустимые типы баз данных, а также соответствующие значения указателя базы данных и формат задания пути к базе данных, которые следует использовать при определении свойства Connect.  Можно также указать адрес «FTP://путь/etc.» или «HTTP://путь/etc».  В рабочей области ODBCDirect можно использовать только идентификатор "ODBC".

Тип	Указатель базы данных	Пример
База данных Microsoft Jet	[базаДанных];	диск:\путь\имяФайла.mdb
dBASE III	dBASE III;	диск:\путь
dBASE IV	dBASE IV;	диск:\путь
dBASE 5	dBASE 5.0;	диск:\путь
Paradox 3.x	Paradox 3.x;	диск:\путь
Paradox 4.x	Paradox 4.x;	диск:\путь
Paradox 5.x	Paradox 5.x;	диск:\путь
FoxPro 2.0	FoxPro 2.0;	диск:\путь
FoxPro 2.5	FoxPro 2.5;	диск:\путь
FoxPro 2.6	FoxPro 2.6;	диск:\путь
Excel 3.0	Excel 3.0;	диск:\путь\файл.xls
Excel 4.0	Excel 4.0;	диск:\путь\файл.xls
Excel 5.0 или Excel 95	Excel 5.0;	диск:\путь\файл.xls
Excel 97	Excel 8.0;	диск:\путь\файл.xls
HTML Import	HTML Import;	диск:\путь\файл
HTML Export	HTML Export;	диск:\путь
Текстовая	Text;	диск:\путь
ODBC	ODBC; DATABASE=базаДанных; UID=пользователь;  PWD=пароль; DSN= имяИсточника; [LOGINTIMEOUT=секунды;]	Не используется
Exchange	Exchange;  MAPILEVEL=путьПапки; [TABLETYPE={ 0 | 1 }];[PROFILE=профиль;] [PWD=пароль;] [DATABASE=базаДанных;]	диск:\путь\имяФайла.mdb
Дополнительные сведения

Если в качестве указателя задать только строку "ODBC;", то драйвер ODBC выводит на экран диалоговое окно со списком имен всех зарегистрированных источников данных ODBC, из которых пользователь сможет выбрать нужную базу данных.

Если для подключения к базе данных требуется пароль, но он не указан в строке значения свойства Connect, то диалоговое окно входа будет выводиться на экран при первом обращении к таблице с помощью драйвера ODBC, а также, если подключение было закрыто и открывается заново.

Для данных Microsoft Exchange в разделе MAPILEVEL должен быть задан полный путь к папке (например, "Mailbox - Pat SmithIAlpha/Today").  Этот путь не включает имя папки, открываемой в виде таблицы; имя этой папки должно задаваться в аргументе имя метода CreateTable.  В разделе TABLETYPE должно задаваться значение "0" для открытия папки по умолчанию или значение "1" для открытия адресной книги.  В разделе PROFILE по умолчанию используется текущий профиль.

Для основных таблиц в базе данных Micorosoft Jet (.mdb) значением Connect является пустая строка ("").

Значение свойства Connect объекта Database может быть задано с помощью аргумента источник в методе OpenDatabase.  Проверка значения данного свойства позволяет определить тип, путь, код пользователя, пароль или источник данных ODBC базы данных.

Для объекта QueryDef в рабочей области Microsoft Jet свойство Connect вместе со свойством ReturnsRecords используют для создания запроса к серверу SQL по протоколу ODBC.  Компонент типБазыДанных в строке подключения имеет вид "ODBC;", а в остальной части строки содержится информация, необходимая драйверу ODBC для доступа к данным на удаленном сервере.  За более подробным описанием следует обращаться к документации конкретного драйвера.

Примечания

•	Значение свойства Connect необходимо задавать до значения свойства ReturnsRecords.

•	Необходимо иметь разрешения на доступ к компьютеру, на котором находится сервер базы данных, к которому требуется подключиться.


Свойство Container

Возвращает имя объекта Container, в котором находится объект Document (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение имеет тип String.


Свойство Count

Возвращает число объектов в семействе.

Возвращаемые значения

Возвращаемое значение имеет тип Integer.

Дополнительные сведения

Поскольку нумерация объектов в семействе начинается с 0, циклы в программах также всегда надо начинать с 0, а заканчивать значением свойства Count минус 1.  Если требуется выполнить цикл по всем компонентам семейства без использования свойства Count, можно использовать конструкцию For Each...Next.

Свойство Count никогда не имеет пустого (Null) значения.  При отсутствии объектов в семействе это свойство имеет значение 0.


Свойство DataUpdatable

Возвращает значение, показывающее, допускается ли обновление данных в поле, которое представляет объект Field.

Возвращаемые значения

Возвращаемое значение имеет тип Boolean и содержит значение True, если данные в поле являются обновляемыми.

Дополнительные сведения

Данное свойство используют для проверки возможности изменения значения свойства Value объекта Field.  Данное свойство всегда имеет значение False для объекта Field, у которого в свойстве Attributes задан тип поля счетчика dbAutoIncrField.

Свойство DataUpdatable применимо к объектам Field, добавленным в семейства Fields объектов QueryDef, Recordset или Relation, но неприменимо для семейств Fields объектов Index или TableDef.


Свойства DateCreated, LastUpdated

•	DateCreated — возвращает дату и время создания объекта или основной таблицы для объекта Recordset типа таблицы (только в рабочей области Microsoft Jet).

•	LastUpdated — возвращает дату и время последнего изменения объекта или основной таблицы для объекта Recordset типа таблицы (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение имеет тип Variant (подтип Date/Time).

Дополнительные сведения

Для объектов Recordset типа таблицы дата и время определяются по системным часам компьютера, на котором была создана или последний раз обновлена основная таблица. Для объектов других типов данных свойства DateCreated и LastUpdated возвращают дату и время создания или последнего обновления объекта.  В многопользовательской среде разные пользователи во избежание разночтений должны загружать значения данных свойств непосредственно с одного сервера файлов.


Свойства DefaultUser, DefaultPassword

•	DefaultUser — задает имя пользователя, используемое для создания стандартного объекта Workspace при инициализации.

•	DefaultPassword — задает пароль, используемый для создания стандартного объекта Workspace при инициализации.

Значения

Значение свойства DefaultUser имеет тип String.  Имя пользователя может содержать 1–20 символов в рабочей области Microsoft Jet и любое количество символов в рабочей области ODBCDirect, включая буквы, цифры, пробелы и другие символы за исключением следующих: " (прямые кавычки), / (косая), \ (обратная косая), [ ] (прямые скобки), : (двоеточие), | (вертикальная черта), < (символ "меньше"), > (символ "больше"), + (знак плюс), = (знак равенства), ; (точка с запятой), , (запятая), ? (вопросительный знак), * (звездочка), пробелы в начале слова и управляющие символы (с кодами от ASCII 00 до ASCII 31).

Значение свойства DefaultPassword имеет тип String.  Пароль может иметь длину до 14 символов в базах данных Microsoft Jet и любую длину для подключений ODBCDirect.  Пароль может содержать любые символы, за исключением символа с нулевым кодом ASCII 0.

Свойство DefaultUser по умолчанию получает значение "admin", а свойство DefaultPassword значение пустой строки ("").

Дополнительные сведения

Имена пользователей обычно задаются без учета регистра; однако, при воссоздании учетной записи пользователя, которая была удалена или создана в другой рабочей группе, необходимо указать имя пользователя, совпадающее с исходным именем с учетом регистра символов.  Пароли являются чувствительными к регистру.

Обычно, метод CreateWorkspace используется для создания объекта Workspace с конкретным именем пользователя и паролем.  Однако для совместимости с предыдущими версиями, а также для удобства работы с защищенными базами данных ядро базы данных Microsoft Jet при необходимости автоматически создает стандартный объект Workspace, если такой объект еще не открыт.  В этом случае свойства DefaultUser и DefaultPassword определяют имя пользователя и пароль для стандартного объекта Workspace.

Для использования данных свойств необходимо задать их значения до вызова любого метода объектов доступа к данным (DAO).


Свойство DefaultValue

Задает или возвращает значение по умолчанию для объекта Field.  Для объекта Field, еще не добавленного в семейство Fields, данной свойство доступно для чтения/записи (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип String и может содержать до 255 символов, образующих текстовое значение или выражение.  Если значением свойства является выражение, то оно не может содержать определяемые пользователем функции, статистические функции SQL ядра базы данных Microsoft Jet, а также ссылки на запросы, формы или другие объекты Field.

Примечание.   Имеется также возможность присвоить свойству DefaultValue объекта Field из объекта TableDef специальное значение "GenUniqueID( )".  Это позволяет при добавлении или создании новой записи присваивать полю случайное число, служащее уникальным идентификатором записи.  Свойство Type поля должно задавать тип Long.

Дополнительные сведения

Использование данного свойства зависит от того, какой из объектов содержит семейство Fields, как показано в следующей таблице:

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Чтение/запись
При создании новой записи значение свойства DefaultValue автоматически задает значение поля.  Изменить заданное по умолчанию значение поля позволяет свойство Value объекта-поля.

Свойство DefaultValue неприменимо к полям с типами данных AutoNumber и Long Binary.


Свойство Description

Возвращает строковое значение, которое содержит описание ошибки.

Возвращаемые значения

Возвращаемое значение имеет тип String и содержит краткое описание ошибки.

Дополнительные сведения

Значением свойства Description является краткое описание ошибки.  Данное свойство используют для вывода уведомлений об ошибке, которую нельзя или не нужно обрабатывать.


Свойство DistinctCount

Возвращает значение, показывающее количество уникальных значений в объекте Index, являющемся частью присоединенной таблицы (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение имеет тип Long.

Дополнительные сведения

Свойство DistinctCount позволяет определить количество уникальных значений, т.е. ключей, в индексе.  Любой ключ подсчитывается только один раз, несмотря на возможность наличия повторяющихся значений в индексе, не являющемся уникальным.  Данные сведения оказываются полезными в приложениях, в которых делается попытка оптимизировать доступ к данным с помощью информации, содержащейся в индексе.  Число уникальных значений иногда называют мощностью или кардинальным числом объекта Index.

Значение свойства DistinctCount не всегда отражает реальное количество ключей, существующих в конкретный момент времени.  Например, изменения этого значения, вызванные отменой транзакции, могут быть не сразу отражены в значении этого свойства.  Кроме того, свойство DistinctCount может не отражать результаты удаления записей, содержащих уникальные ключи.  Точное значение будет получено сразу после применения метода CreateIndex.


Свойство EditMode

Возвращает значение, показывающее состояние редактирования текущей записи.

Возвращаемые значения

Возвращаемое значение имеет тип Long и представляет текущее состояние редактирования с помощью констант, перечисленных в следующей таблице:

Константа	Описание
dbEditNone	Операция редактирования в данный момент не выполняется.
DbEditInProgress	Был вызван метод Edit, и текущая запись помещена в буфер копирования.
dbEditAdd	Был вызван метод AddNew, и текущая запись, помещенная в буфер копирования, является новой записью, которая еще не сохранена в базе данных.
Дополнительные сведения

Свойство EditMode особенно полезно, если процесс редактирования прерван, например, из-за нарушения условий на значение.  Пользователь имеет возможность использовать свойство EditMode, чтобы определить, следует ли вызывать метод Update или CancelUpdate.

Кроме того, проверка, имеет ли свойство LockEdits значение True, а свойство EditMode значение dbEditInProgress, позволяет определить, является ли текущая страница данных заблокированной.


Свойство Filter

Задает или возвращает значение, определяющее записи, которые будут включены в открываемый объект Recordset (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип String и содержит предложение WHERE инструкции SQL без зарезервированного слова WHERE.

Дополнительные сведения

Свойство Filter позволяет применить фильтр к объекту Recordset типа динамического набора записей, статического набора записей или статического набора записей с последовательным доступом.

Свойство Filter позволяет определить условие отбора записей, которые будут выведены в новом объекте Recordset, открытом на базе существующего объекта Recordset.

Во многих случае можно быстрее открыть новый объект Recordset с помощью инструкции SQL, содержащей предложение WHERE.

При отборе записей по значениям полей даты следует использовать американский формат даты (месяц-день-год), даже при использовании локализованной версии ядра базы данных Microsoft Jet (в последнем случае следует собирать значения даты путем слияния строк, например, strМесяц & "-" & strДень & "-" & strГод).  В противном случае могут возникнуть непредсказуемые результаты.

Если значение свойства задается путем слияния строки с нецелым числом, а в системной настройке задано использование десятичного разделителя, отличного от десятичной точки (например, запятой, как в следующем примере: strFilter = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке открыть следующий объект Recordset возникнет ошибка.  Причина заключается в том, что при слиянии строк число преобразуется в строковое значение с использованием текущего системного десятичного разделителя, а в языке Microsoft Jet SQL распознается только американский символ десятичного разделителя (точка).


Свойство Foreign

Возвращает значение, показывающее, представляет ли объект Index внешний ключ таблицы (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение имеет тип Boolean и содержит значение True, если объект Index представляет внешний ключ.

Дополнительные сведения

Внешний ключ состоит из одного или нескольких полей внешней таблицы, которые однозначно определяют все записи в главной таблице.

Объект Index автоматически создается ядром базы данных Microsoft Jet для внешней таблицы с ключом.  Значение свойства Foreign задается при создании связи, для которой задан режим обеспечения  целостности данных.


Свойство ForeignName

Задает или возвращает значение, представляющее для связи имя объекта Field внешней таблицы, соответствующего полю в главной таблице (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип String и содержит имя объекта Field в семействе Fields соответствующего объекта TableDef.

Если объект Relation еще не добавлен в объект Database, а объект Field уже добавлен в объект Relation, то свойство ForeignName доступно для чтения/записи.  После добавления объекта Relation в базу данных свойство ForeignName становится доступным только для чтения.

Дополнительные сведения

Свойство ForeignName поддерживается только объектами Field, принадлежащими к семейству Fields, которое содержится в объекте Relation.

Значения свойств Name и ForeignName объекта Field указывают имена связываемых полей в главной и внешней таблице связи.  Значения свойств Table и ForeignTable объекта Relation задают имена главной и внешней таблицы связи.

Например, если в поле "КодДетали" таблицы "Детали" содержатся уникальные коды запасных частей, то можно определить связь с таблицей "Заказы" таким образом, чтобы в таблицу "Заказы" можно было вводить только значения кодов, уже существующих в таблице "Детали".  В этом случае попытка ввести значение, отсутствующее в таблице "Детали", приведет к перехватываемой ошибке, если только не задано с помощью константы dbRelationDontEnforce принудительное выполнение условий целостности данных с помощью свойства Attributes объекта Relation.

В этом примере таблица "Детали" является внешней таблицей с ключом, поэтому значением свойства ForeignTable объекта Relation должно быть имя таблицы "Детали", а значением свойства Table объекта Relation должно быть имя таблицы "Заказы".  Свойства Name и ForeignName объекта Field в семействе Fields объекта Relation должны иметь значение "Код детали".

Описанную выше связь иллюстрирует следующий рисунок.


Свойство ForeignTable

Задает или возвращает имя внешней таблицы в связи (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип String и содержит имя таблицы, входящей в семейство TableDefs объекта Database.  Данное свойство доступно для чтения/записи для нового объекта Relation, еще не добавленного в семейство, и только для чтения для существующего объекта Relation в семействе Relations.

Дополнительные сведения

Значение свойства ForeignTable объекта Relation равно значению свойства Name объекта TableDef или QueryDef, представляющего внешнюю таблицу или запрос.  Значением свойства Table является значение свойства Name объекта TableDef или QueryDef, представляющего главную таблицу или запрос.

Например, если в поле "КодДетали" таблицы "Детали" содержатся уникальные коды запасных частей, то можно определить связь с таблицей "Заказы" таким образом, чтобы в таблицу "Заказы" можно было вводить только значения кодов, уже существующих в таблице "Детали".  В этом случае попытка ввести значение, отсутствующее в таблице "Детали", приведет к перехватываемой ошибке, если только не задано с помощью константы dbRelationDontEnforce принудительное выполнение условий целостности данных с помощью свойства Attributes объекта Relation.

В этом примере таблица "Детали" является внешней таблицей с ключом, поэтому значением свойства ForeignTable объекта Relation должно быть имя таблицы "Детали", а значением свойства Table объекта Relation должно быть имя таблицы "Заказы".  Свойства Name и ForeignName объекта Field в семействе Fields объекта Relation должны иметь значение "Код детали".

Описанную выше связь иллюстрирует следующий рисунок.


Свойства HelpContext, HelpFile

•	HelpContext — возвращает контекстный идентификатор, в виде переменной типа Long, для раздела файла справки Microsoft Windows.

•	HelpFile — возвращает значение типа String, представляющее полный путь к файлу справки.

Дополнительные сведения

В справочной системе Microsoft Windows значения свойств HelpFile и HelpContext определяют автоматически выводящийся раздел справочной системы.

Примечание.   Для обработки типичных ошибок разработчик приложения обычно создает специальные процедуры.  При программировании объекта использование раздела файла справки, относящегося к объекту, позволяет улучшить процедуру обработки ошибок или вывести сообщение для пользователей приложения в случае, когда ошибка является критической.


Свойство IgnoreNulls

Задает или возвращает значение, показывающее, являются ли компонентами индекса записи, имеющие пустые (Null) значения в полях индекса (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип Boolean и содержит значение True, если поля со значениями Null не являются компонентами индекса.  Данное свойство доступно для чтения/записи для нового объекта Index, еще не добавленного в семейство, и только для чтения для существующего объекта Index в семействе Indexes.

Дополнительные сведения

Для ускорения поиска записей по значению поля можно создать индекс для данного поля.  Если в индексированном поле допускается наличие пустых значений (Null), и если ожидается наличие большого числа пустых значений, то задание значения True для свойства IgnoreNulls объекта Index позволяет уменьшить размер индекса.

Значение свойства IgnoreNulls вместе со значением свойства Required определяет, будут ли содержаться в индексе сведения о записях с пустыми значениями.

IgnoreNulls	Required	Пустые значения в индексе
True	False	Значения Null допускаются, но не заносятся в индекс.
False	False	Значения Null допускаются и заносятся в индекс.
True или False	True	Значения Null не допускаются и не заносятся в индекс.


Свойство Index

Задает или возвращает значение, указывающее имя текущего объекта Index в объекте Recordset типа таблицы (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства представляет выражение типа String, значением которого является имя объекта Index в семействе Indexes объекта Tabledef или базового объекта TableDef, соответствующего объекту Recordset типа таблицы.

Дополнительные сведения

Записи в основных таблицах не хранятся в каком-либо определенном порядке.  Значения свойства Index изменяют только порядок записей, возвращаемых из базы данных; это свойство не влияет на порядок расположения записей в таблице.

Указанный объект Index должен уже существовать.  Если в значении свойства Index указан несуществующий объект Index или если значение свойства Index не задано, то при вызове метода Seek возникает перехватываемая ошибка.

Просмотр семейства Indexes объекта TableDef позволяет определить, какие объекты Index являются допустимыми для объекта Recordset типа таблицы, созданного на основе объекта TableDef.

Для создания нового индекса таблицы следует создать новый объект Index, задать его свойства, добавить его в семейство Indexes базового объекта TableDef, а затем заново открыть объект Recordset.

Записи, возвращаемые в объекте Recordset типа таблицы, можно упорядочить только с помощью индексов, определенных для базового объекта TableDef.  Для сортировки записей в каком-либо другом порядке следует открыть объект Recordset типа динамического набора записей, статического набора записей или статического набора записей с последовательным доступом с помощью инструкции SQL с заданным предложением ORDER BY.

Примечания

•	Пользователь не обязан создавать индексы для таблиц, однако, в больших неиндексированных таблицах доступ к конкретной записи или создание объекта Recordset может занять много времени.  С другой стороны, создание слишком большого числа индексов замедляет операции обновления, добавления и удаления, поскольку при этих операциях автоматически обновляются все индексы.

•	Записи, считываемые из неиндексированных таблиц, возвращаются в произвольном порядке.

•	Свойство Attributes каждого объекта Field в объекте Index определяет порядок записей и, соответственно, приемы, необходимые при использовании данного индекса.

•	Уникальный индекс позволяет оптимизировать процесс поиска записей.

•	Индексы не влияют на физический порядок записей в основной таблице — индексы изменяет только способ доступа к конкретным записям в объекте Recordset типа таблицы при выборе конкретного индекса или при открытии объекта Recordset.


Свойство Inherit

Задает или возвращает значение, определяющее, будут ли  новые объекты Document наследовать задающиеся по умолчанию значения свойства Permissions (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип Boolean.  При значении True объект Document наследует задающиеся по умолчанию значения свойства Permissions.

Дополнительные сведения

Свойство Inherit вместе со свойством Permissions указывает, какие разрешения автоматически определяются для новых документов при их создании.  Если задать для свойства Inherit значение True, а затем определить разрешения для контейнера, то каждый новый документ, созданный в этом контейнере, автоматически наследует разрешения, определенные для контейнера. Такой прием определения разрешений часто используется при создании новых документов.

Изменение значения свойства Inherit, а также определение новых разрешений не влияет на существующие документы в контейнере — невозможно изменить все разрешения для всех существующих в контейнере документов, задавая новое значение свойства Inherit.  Значение этого свойства затрагивает только новые документы, которые будут созданы после изменения свойства Inherit.


Свойство Inherited

Возвращает значение, показывающее является ли объект Property  (свойство) унаследованным от базового объекта.

Возвращаемые значения

Возвращаемое значение имеет тип Boolean и содержит значение True, если объект Property является унаследованным.  Для встроенных объектов Property, описывающих предопределенные свойства, единственным возможным значением является False.  Данное свойство всегда имеет значение False в рабочей области ODBCDirect.

Дополнительные сведения

Свойство Inherited позволяет выяснить, было ли определяемое пользователем свойство создано специально для объекта, с которым оно связано, или это свойство было создано для другого объекта.  Предположим, что пользователь создал новый объект Property для объекта QueryDef, а затем открыл объект Recordset на основе объекта QueryDef.  Новый объект Property будет включен в семейство Properties объекта Recordset, а свойство Inherited получит значение True, поскольку свойство было создано для объекта QueryDef, а не для объекта Recordset.


Свойство IniPath

Задает или возвращает сведения о записи реестра Windows, в которой содержатся параметры ядра базы данных Microsoft Jet (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение определяются с помощью выражения типа String, которое указывает на определяемые пользователем компоненты записи в реестре Windows, содержащей настройки ядра базы данных Microsoft Jet или параметры, необходимые для баз устанавливаемых драйверов ISAM.

Дополнительные сведения

Конфигурация ядра Microsoft Jet может быть задана с помощью реестра Windows.  Реестр используется также для указания таких параметров как библиотеки динамической компоновки, требуемые устанавливаемым драйвером ISAM.

Для того чтобы эти параметры вступили в действие, необходимо задать значение параметра IniPath до вызова любых других программ объектов доступа к данным (DAO) в приложении пользователя.  Область определения значения данного свойства ограничивается текущим приложением и не может быть изменена до нового запуска приложения.

Реестр позволяет указать параметры инициализации некоторых устанавливаемых драйверов баз данных ISAM.  Например, такие настройки требуется указать в параметре IniPath для работы с Paradox версии 4.0.

Это свойство распознает любую из записей HKEY_LOCAL_MACHINE или HKEY_LOCAL_USER.  Если корневая запись не задана, по умолчанию используется HKEY_LOCAL_MACHINE.

В Microsoft Jet версии 2.5 или более ранних параметры инициализации записывались в файлах .ini.


Свойство IsolateODBCTrans

Задает или возвращает значение, указывающее, являются ли независимыми множественные транзакции, использующие общий источник данных ODBC, подключенный к ядру Microsoft Jet (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение данного свойства имеет тип Boolean и содержит значение True при изоляции транзакций, использующих общее подключение ODBC.  Значение False (по умолчанию) указывает, что такие транзакции не являются независимыми.

Дополнительные сведения

В некоторых ситуациях возникает необходимо одновременно выполнить несколько транзакций для одного подключения ODBC.  В этом случае следует открыть для каждой транзакции отдельный объект Workspace (рабочая область).  Хотя для каждого объекта Workspace допускается собственное подключение к базе данных ODBC, это замедляет выполнение операций в базе данных.  Поскольку разделение транзакций обычно не требуется, подключения к источникам ODBC из разных объектов Workspace, открытых одним пользователем, по умолчанию являются общими.

Некоторые серверы ODBC, такие как Microsoft SQL Server, не допускают одновременные транзакции при одном подключении.  Если требуется одновременно выполнить несколько независимых транзакций для такой базы данных, следует задать значение True для свойства IsolateODBCTrans каждого объекта Workspace при его открытии.  Это автоматически приведет к независимому подключению ODBC для каждого объекта Workspace.


Свойство LastModified

Возвращает закладку, указывающую запись, которая была добавлена или изменена последней.

Возвращаемые значения

Возвращаемое значение является массивом типа Variant элементов типа Byte.

Дополнительные сведения

Свойство LastModified позволяет найти последнюю измененную или добавленную запись.  Данное свойство используется с табличными и динамическими объектами Recordset.  Чтобы свойство LastModified имело значение, запись должна быть изменена в самом объекте Recordset.


Свойство LockEdits

Задает или возвращает значение, определяющее режим блокировки, который будет действовать при изменении записей.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean, указывающим режим блокировки, описание которого приведено в следующей таблице.

Значение	Описание
True	По умолчанию.  Определяет режим жесткой блокировки.  Страница размером 2 Кбайт, содержащая изменяемую запись, будет заблокирована сразу после вызова метода Edit.
False	Определяет режим нежесткой блокировки.  Содержащая запись страница размером 2 Кбайт не будет заблокирована до вызова метод Update.
Дополнительные сведения

Свойство LockEdits применимо к обновляемым объектам Recordset.

Если страница заблокирована, то ни один из других пользователей не сможет изменять записи на этой странице.  Если для свойства LockEdits задано значение True, и другой пользователь уже заблокировал страницу, то при вызове метода Edit возникает ошибка.  Другим пользователям разрешается чтение данных с блокированных страниц.

Если для свойства LockEdits задано значение False, то ошибка возникает при вызове метода Update для страницы, заблокированной другим пользователем.  Для просмотра изменений, внесенных в запись другим пользователем, следует вызвать метод Move с аргументом 0.  Однако в этом случае все внесенные вами в запись изменения будут потеряны.

При работе с источниками данных ODBC, подключенными к ядру Microsoft Jet, свойство LockEdits всегда получает значение False, т.е. устанавливается режим нежесткой блокировки.  В ядре базы данных Microsoft Jet отсутствуют средства контроля над механизмами блокировки, используемыми на серверах внешних баз данных

Примечание.   Пользователь имеет возможность установить значение свойства LockEdits при первом открытии объекта Recordset с помощью аргумента блокировки метода OpenRecordset.  Указанная в аргументе блокировки константа dbPessimistic задает для свойства LockEdits значение True, а любое другое значение аргумента блокировки устанавливает для свойства LockEdits значение False.


Свойство LoginTimeout

Задает или возвращает величину промежутка времени в секундах, по истечении которого возникает ошибка при попытке подключения к базе данных ODBC.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Integer, представляющим величину интервала ожидания в секундах, по истечении которого возникает ошибка подключения.  По умолчанию в свойстве LoginTimeout задается интервал 20 секунд.  При заданном в свойстве LoginTimeout значении 0 ошибка превышения предельного времени подключения не возникает.

Дополнительные сведения

Попытка подключения к базе данных ODBC, такой как Microsoft SQL Server, может оказаться неудачной в результате ошибок сети или в случае, когда сервер не работает.  Вместо того чтобы ожидать подключения стандартные 20 секунд, можно указать величину времени ожидания, после которого возникает ошибка.  Подключение к удаленному серверу может производиться неявно в результате выполнения ряда действий, таких как выполнение запроса к базе данных на сервере.

Свойство LoginTimeout можно применять для объекта DBEngine как в рабочей области Microsoft Jet, так и в рабочей области ODBCDirect.  Для объекта Workspace свойство LoginTimeout является применимым только в рабочей области ODBCDirect.  Задание значения -1 для данного свойства объекта Workspace задает использование в качестве значения по умолчанию текущего значения свойства DBEngine.LoginTimeout.  Пользователь имеет возможность изменить значение данного свойства в объекте Workspace в любое время.  Новая настройка вступит в силу при следующем открытии объекта Connection или Database.

Значение по умолчанию определяется драйвером ODBC. В рабочей области Microsoft Jet для замены стандартной настройки драйвера следует создать новую запись «ODBC» на пути реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Jet\3.5\, создать в этой записи параметр LoginTimeout и задать для него требуемое значение.


Свойство LogMessages

Задает или возвращает значение, определяющее, будут ли сообщения, поступающие из источника данных ODBC, подключенного к ядру Microsoft Jet регистрироваться в таблице сообщений (только в рабочей области Microsoft Jet).

Примечание.   Перед тем как задать или прочитать значение свойства LogMessages, необходимо создать это свойство с помощью метода CreateProperty и добавить его в семейство Properties объекта QueryDef.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean, содержащим значение True, если задана регистрация сообщений, генерируемых источником данных ODBC.

Дополнительные сведения

Некоторые запросы к серверу могут возвращать не только данные, но и сообщения.  Если для свойства запроса LogMessages задано значение True, то ядро базы данных Microsoft Jet создает в текущей базе данных специальную таблицу, в которую помещаются возвращаемые сообщения.  Таблицам сообщений присваивается имя пользователя, к которому добавляется дефис (-) и порядковые номера, начинающиеся с 00.  Например, если по умолчанию используется имя пользователя "Admin", то таблицы с возвращаемыми сообщениями получат имена "Admin-00", "Admin-01" и т.д.

Если ожидается поступление сообщений в запросе, следует создать определяемое пользователем свойство LogMessages, добавить его в семейство объекта QueryDef, установить тип данных Boolean и задать значение True.

После того как данные в этих таблицах будут обработаны, можно удалить временные таблицы из базы данных вместе с запросом, в результате которого они были созданы.


Свойство Name

Задает или возвращает определяемое пользователем имя объекта доступа к данным (DAO).  Для объекта, не добавленного в семейство, это свойство доступно для чтения/записи.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, указывающим имя объекта. Имя объекта должно начинаться с буквы. Максимальный размер (в символах) значения свойства Name определяется типом объекта, как показано в разделе "Дополнительные сведения".  Имя может содержать цифры и символы подчеркивания ( _ ), но не должно содержать знаки препинания.

Дополнительные сведения

Объект TableDef, QueryDef, Field, Index, User и Group не может иметь имя, совпадающее с именем другого объекта в том же семействе.

Значением свойства Name объекта Recordset, открытого с помощью инструкции SQL, становятся первые 256 символов инструкции SQL.

Допускается использование свойства Name в инструкциях Dim в программах Visual Basic для приложений (VBA) для создания новых экземпляров объекта.

Примечание.   Для многих объектов доступа к данным (DAO) свойство Name отражает имя, зарегистрированное в объекте Database.  Это же относится к объектам TableDef, Field или QueryDef.  Прямой связи между именем объекта и именем используемой для ссылок на объект базы данных объектной переменной не существует.

Использование для чтения/записи свойства Name при доступе к объекту определяется типом объекта, к которому относится свойство, а также тем, был ли объект добавлен в семейство.  В рабочей области ODBCDirect свойство Name добавленного объекта всегда доступно только для чтения.  В следующей таблице показано, в каких случаях свойство Name в рабочей области Microsoft Jet доступно для чтения записи или только для чтения для объекта, добавленного в семейство (если иное не указано).  Для случая, когда свойство допускает чтение/запись, приведена максимальная длина значения (в символах).

Объект	Применение	Длина
Container	Только чтение
Connection	Только чтение
Database	Только чтение
Document	Только чтение
Field
Не добавлен	Чтение/запись	64
Добавлен в Index	Только чтение
Добавлен в QueryDef	Только чтение
Добавлен в Recordset	Только чтение
Добавлен в TableDef    (таблица в базе данных)	Чтение/запись	64
Добавлен в TableDef    (присоединенная таблица )	Только чтение
Добавлен в Relation	Только чтение
Group
Не добавлен	Чтение/запись	20
Добавлено	Только чтение
Index
Не добавлен	Чтение/запись	64
Добавлено	Только чтение
Parameter	Только чтение
Property
Не добавлен	Чтение/запись	64
Добавлено	Только чтение
Встроенный	Только чтение
QueryDef
Не добавлен	Чтение/запись	64
Временный	Только чтение
Добавлено	Чтение/запись	64
Recordset	Только чтение
Relation
Не добавлен	Чтение/запись	64
Добавлено	Только чтение
TableDef	Чтение/запись	64
User
Не добавлен	Чтение/запись	20
Добавлено	Только чтение
Workspace
Не добавлен	Чтение/запись	20
Добавлено	Только чтение


Свойство NoMatch

Показывает, была ли найдена нужная запись в результате вызова метода Seek или одного из методов группы Find (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение имеет тип Boolean и содержит значение True, нужная запись не найдена.  При открытии или создании объекта Recordset его свойство NoMatch получает значение False.

Дополнительные сведения

Для поиска определенной записи следует вызвать метод Seek для объекта Recordset типа таблицы или один из методов группы Find для объекта Recordset типа динамического или статического набора записей.  После вызова этих методов значение свойства NoMatch позволяет определить, была ли найдена нужная запись.

Если поиск с помощью метода Seek или одного из методов Find оказался неудачным и свойство NoMatch имеет значение True, то текущая запись набора становится неопределенной.  Если впоследствии может возникнуть необходимость вернуться к текущей записи, то перед вызовом методов поиска следует запомнить положение текущей записи с помощью закладки.

Примечание.   Вызов любого из методов группы Move для объекта Recordset не влияет на значение свойства NoMatch этого объекта.


Свойство Number

Возвращает числовой код ошибки.  Свойство Number является используемым по умолчанию свойством объекта Error.

Возвращаемые значения

Возвращаемое значение имеет тип Long и содержит код ошибки.

Дополнительные сведения

Свойство Number используют для определения причины ошибки.  Значение данного свойства равняется уникальному номеру перехватываемой ошибки, соответствующему условию ошибки.  Полный список номеров перехватываемых ошибок см. в разделе Перехватываемые ошибки Microsoft Jet и объектов доступа к данным.


Свойство ODBCTimeout

Задает или возвращает в секундах интервал ожидания при выполнении объекта QueryDef (запроса) к базе данных ODBC.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Integer, представляющим время в секундах, после которого возникает ошибка превышения интервала ожидания

Когда для свойства ODBCTimeout задается значение -1, интервал ожидания по умолчанию получает текущее значение свойства QueryTimeout объекта Connection или Database, в котором содержится объект QueryDef.  Если задать для свойства ODBCTimeout значение 0, ошибка при превышении времени ожидания не возникает.

Дополнительные сведения

В процессе работы с базой данных ODBC, такой как Microsoft SQL Server, могут возникнуть задержки из-за сильной нагрузки на сеть или интенсивного использования сервера ODBC.  Вместо бесконечного ожидания можно задать интервал ожидания, по истечении которого будет генерироваться ошибка.

Значение свойства ODBCTimeout объекта QueryDef имеет приоритет над значением, заданным в  свойстве QueryTimeout объекта Connection или Database, в котором содержится объект QueryDef (но только для этого объекта QueryDef).

Примечание.   В рабочей области ODBCDirect после явного задания значения свойства ODBCTimeout допускается его сброс к значению по умолчанию (т.е. -1), но сделать это можно только один раз за время жизни объекта QueryDef.  В противном случае возникает ошибка.


Свойство OrdinalPosition

Задает или возвращает значение, определяющее относительное положение объекта Field в семействе Fields.  Для объекта, еще не добавленного в семейство Fields, это свойство доступно для чтения/записи.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Integer, определяющим порядковый номер поля.  Значение данного свойства по умолчанию равняется 0.

Дополнительные сведения

Использование свойства OrdinalPosition зависит от того, какой из объектов содержит семейство Fields, как показано в следующей таблице.

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Чтение/запись
Как правило, порядковый номер объекта в семействе определяется порядком, в котором объекты были добавлены в семейство.  Первый добавленный объект будет являться первым объектом в семействе (с порядковым номером 0), второй добавленный объект получит порядковый номер 1 и так далее.  Последний добавленный объект имеет порядковый номер числоОбъектов - 1, где числоОбъектов представляет полное число объектов в семействе, равное значению свойства Count семейства.

Свойство OrdinalPosition позволяет указать порядок расположения новых объектов Field, отличный от порядка, в котором объекты были добавлены в семейство.  Данное свойство позволяет указать порядок полей для таблиц, запросов или наборов записей при их использовании в приложении.  Например, порядок, в котором поля возвращаются в запросе на выборку с инструкцией SELECT * будет определяться текущими значениями свойства OrdinalPosition.

Пользователь имеет возможность изменять постоянный порядок, в котором поля возвращаются в наборах записей, задавая для свойства OrdinalPosition любые целые положительные значения.

Два или несколько объектов Field, входящих в одно семейство, могут иметь одинаковые значения свойства OrdinalPosition.  В этом случае такие поля размещаются в алфавитном порядке.  Например, если указать значение 4 для поля "Фамилия" и одновременно значение 4 для поля "Имя", то поле "Фамилия" будет возвращаться после поля "Имя".

Допускается указание значения данного свойства, превышающего число полей минус 1.  Положение полей, в действительности, определяется относительными значениями данного свойства.  Например, если имеется 5 полей, и для свойства OrdinalPosition трех полей заданы значения 10, 20 и 30, то поле с номером 20 возвращается между полями с номерами 10 и 30.

Примечание.   Даже если обновление семейства Fields объекта TableDef не было выполнено, порядок полей в объекте Recordset открытом для объекта TableDef будет соответствовать значениям свойства OrdinalPosition объекта TableDef.  Объект Recordset получит те же значения свойства OrdinalPosition, что и в базовой таблице, а объекты Recordset получат новые значения свойства OrdinalPosition (начиная с 0), соответствующие порядку полей, который определяется свойствами OrdinalPosition полей в объекте TableDef.


Свойство Owner

Задает или возвращает значение, указывающее владельца объекта (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, значением которого является либо имя объекта  User в семействе Users, либо имя объекта Group в семействе Groups.

Дополнительные сведения

Владелец объекта имеет особые привилегии, которыми не обладают другие пользователи.  Значение свойства Owner (владелец) может быть изменено в любой момент времени с помощью любой учетной записи пользователя (представляемой объектом User) или учетной записи группы (представляемой объектом Group), для которых определены соответствующие разрешения.


Свойство Password

Определяет пароль для учетной записи пользователя (только в рабочей области Microsoft Jet).

Значения

Данное значение имеет тип String и может содержать строку длиной до 14 символов, включая любые символы кроме символа ASCII с кодом 0 (пустого).  Значение данного свойства доступно только для записи для новых объектов, еще не добавленных в семейство, и недоступно для существующих объектов.

Дополнительные сведения

При создании нового объекта User значение свойства Password задается вместе со значением свойства PID.

Метод NewPassword позволяет изменить значение свойства Password для существующего объекта User.  Для удаления пароля следует указать в аргументе новыйПароль метода NewPassword пустую строку ("").

Пароли определяются с учетом регистра.

Примечание.   Пользователь, не имеющий разрешения на доступ, не может изменить пароль, определенный другим пользователем.


Свойство PercentPosition

Задает или возвращает значение, указывающее примерное положение текущей записи в объекте Recordset, измеряемое в процентах от общего числа записей объекта Recordset.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Single, содержащим число в диапазоне от 0,0 до 100,00.

Дополнительные сведения

Для определения или изменения приблизительного положения текущей записи в объекте Recordset можно проверить или задать значение свойства PercentPosition.  При работе с объектами Recordset типа динамического или статического набора записей, открытыми непосредственно для основной таблицы, перед обращением к этому свойству необходимо предварительно заполнить объект.  Для этого следует переместиться на последнюю запись набора.  Если обратиться к свойству PercentPosition до окончательного заполнения объекта Recordset, то перемещение будет определяться текущим значением свойства RecordCount.  Перейти на последнюю запись позволяет метод MoveLast.

Примечание.   Не рекомендуется использовать свойство PercentPosition для перемещения текущей записи на конкретную позицию в наборе записей — для этого удобнее использовать свойство Bookmark.

После указания значения свойства PercentPosition текущей записью становится запись, положение которой ближе всего соответствует указанному приблизительному значению, а значение свойства PercentPosition изменяется в соответствии с положением текущей записи.  Например, если объект Recordset содержит всего пять записей, и для свойства PercentPosition задано значение 77, то значением данного свойства станет число 80, а не 77.

Свойство PercentPosition применимо ко всем типам объектов Recordset кроме объектов Recordset типа статического набора записей с последовательным доступом и объектов Recordset, открытых с помощью запросов к серверу удаленной базы данных.

Свойство PercentPosition используют при работе с полосой прокрутки формы или поля для указания положения текущей записи в объекте Recordset.


Свойство Permissions

Задает или возвращает значение, устанавливающее разрешения для пользователя или группы, определяемых свойством UserName объекта Container или Document (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является константой типа Long, определяющей разрешения.  Ниже перечислены допустимые константы, определяющие значения свойства Permissions различных объектов доступа к данным.  Если не указано иное, все константы, приведенные в таблицах, являются допустимыми для объектов Document.

В следующей таблице перечислены допустимые значения для объектов Container, отличных от таблиц и баз данных.

Константа	Описание
dbSecNoAccess	Пользователь не имеет доступа к объекту (неприменимо к объектам Document).
dbSecFullAccess	Пользователь имеет полный доступ к объекту.
dbSecDelete	Пользователь может удалить объект.
dbSecReadSec	Пользователь может прочитать сведения о защите объекта.
dbSecWriteSec	Пользователь может изменить разрешения на доступ.
dbSecWriteOwner	Пользователь может изменить значение свойства Owner.
В следующей таблице перечислены задаваемые и возвращаемые значения для контейнеров, являющихся таблицами.

Константа	Описание
dbSecCreate	Пользователь может создавать новые документы (неприменимо к объектам Document).
dbSecReadDef	Пользователь может читать описание таблицы, включая сведения о столбцах и индексах.
dbSecWriteDef	Пользователь может изменять или удалять описание таблицы, включая сведения о столбцах и индексах.
dbSecRetrieveData	Пользователь может загружать данные из объекта Document.
dbSecInsertData	Пользователь может добавлять записи.
dbSecReplaceData	Пользователь может изменять записи.
dbSecDeleteData	Пользователь может удалять записи.
В следующей таблице перечислены задаваемые и возвращаемые значения для контейнеров, являющихся базами данных.

Константа	Описание
dbSecDBAdmin	Пользователь может выполнять репликацию базы данных и изменять пароль базы данных (неприменимо к объектам Document).
dbSecDBCreate	Пользователь может создавать новые базы данных.  Данный параметр применим только для контейнера Databases, входящего в системную базу данных (Systen.mdw).  Эта константа неприменима к объектам Document.
dbSecDBExclusive	Пользователь имеет монопольный доступ к базе данных.
dbSecDBOpen	Пользователь может открывать базу данных.
Дополнительные сведения

Данное свойство применяется для указания или проверки разрешений на чтение/запись, которые пользователь имеет для объектов Container или Document.

Объект Document наследует разрешения, определенные в его объекте Container, если в свойстве Inherit объекта Container указаны пользователи или группы, к которым принадлежат пользователи.  В дальнейшем можно усовершенствовать управление объектом Document, задавая для него значения свойств Permissions и UserName.

Если требуется задать или возвратить все разрешения, имеющиеся у пользователя, включая унаследованные от групп, к которым он принадлежит, следует использовать свойство AllPermissions.


Свойство PID

Определяет код (PID) учетной записи группы или учетной записи пользователя (только в рабочей области Microsoft Jet).

Значения

Значение данного свойства определяется выражением типа String, содержащим строку длиной от 4 до 20 букв или цифр.  Значение данного свойства доступно только для записи для новых объектов, еще не добавленных в семейство, и недоступно для существующих объектов.

Дополнительные сведения

Значение свойства PID задается вместе со значением свойства при создании нового объекта Group.  При создании нового объекта User значение свойства PID задается вместе со значениями свойств Name и Password.


Свойство Primary

Задает или возвращает значение, указывающее, описывает ли объект Index первичный индекс таблицы (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean и содержит значение True, если объект Index представляет первичный индекс.

Значение свойства Primary доступно для чтения и записи для нового объекта Index, еще не добавленного в семейство, и только для чтения для существующего объекта Index в семействе Indexes.  Если объект Index добавлен в объект TableDef, а объект TableDef еще не добавлен в семейство TableDefs, свойство Index доступно для чтения-записи.

Дополнительные сведения

Первичный индекс состоит из одного или нескольких полей, которые однозначно определяют порядок расположения всех записей таблицы.  Поскольку первичный индекс должен быть уникальным, свойство Unique объекта Index получает значение True.  Если первичный индекс состоит из нескольких полей, то каждое из полей может содержать повторяющиеся значения, но каждая комбинация значений всех полей индекса должна быть уникальной. Первичный индекс может являться ключом таблицы и обычно содержит те же поля, что и ключ.

Примечание.   Создание индексов для таблицы не является обязательным, однако доступ к отдельной записи в больших таблицах без определенного индекса может занимать достаточно много времени.  Значения свойства Attributes каждого из объектов Field объекта Index определяют порядок записей и, соответственно, способ доступа к данным с использованием этого индекса.  При создании новой таблицы полезно создать индекс по одному или нескольким полям, однозначно определяющим каждую запись, а затем задать для свойства Primary объекта Index значение True.

Когда задается ключ таблицы, этот ключ автоматически становится первичным индексом таблицы.


Свойство QueryTimeout

Задает или возвращает в секундах интервал ожидания, после которого возникает ошибка превышения времени ожидания при выполнении запроса к источнику данных ODBC.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Integer, которое представляет интервал ожидания в секундах.  Значением по умолчанию является 60.

Дополнительные сведения

В процессе работы с базой данных ODBC, такой как Microsoft SQL Server, могут возникнуть задержки из-за сильной нагрузки на сеть или интенсивного использования сервера ODBC.  Вместо бесконечного ожидания можно указать конечный интервал ожидания.

При использовании свойства QueryTimeout с объектом Connection или Database задает глобальное значение времени ожидания для всех запросов конкретной базы данных.  Пользователь имеет возможность указать для конкретного запроса другое значение с помощью свойства ODBCTimeout соответствующего объекта QueryDef.

Для того чтобы указать в рабочей области Microsoft Jet значение, отличное от значения по умолчанию, следует создать новую запись «ODBC» на пути реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Jet\3.5\, создать параметр QueryTimeout и задать для него нужное значение.


Свойство RecordCount

Возвращает число записей, к которым был осуществлен доступ в объекте Recordset, или полное число записей в табличном объекте Recordset или объекте TableDef.

Возвращаемые значения

Возвращаемое значение имеет тип Long.

Дополнительные сведения

Свойство RecordCount используется для определения числа записей объекта Recordset или TableDef, к которым проводилось обращение.  Свойство RecordCount не показывает, сколько записей содержится в динамическом или статическом объекте Recordset до обращения ко всем записям.  После обращения к последней записи набора значение свойства RecordCount становится равным полному числу неудаленных записей в объекте Recordset или TableDef.  Для принудительного обращения к последней записи следует вызвать для объекта Recordset метод MoveLast.  Кроме того, определить примерное число записей, которые будут возвращены в запросе, позволяет функция Count языка SQL.

Примечание.   Заполнение с помощью метода MoveLast объекта Recordset при его открытии отрицательно сказывается на быстродействии.  Если точное определение значения свойства RecordCount не требуется сразу после открытия объекта Recordset, рекомендуется подождать, пока объект Recordset будет заполнен в результате выполнения остальной программа, а уже потом обращаться к свойству RecordCount.

По мере удаления записей из динамического набора в процессе работы приложения значение свойства RecordCount уменьшается.  Однако удаление записей другими пользователями не отражается на значении данного свойства до тех пор, пока указатель текущей записи не будет установлен на одну из удаленных записей.  Если выполняется транзакция, изменяющая значение свойства RecordCount, а затем эта транзакция свертывается, значение свойства RecordCount не будет отражать реальное число оставшихся записей.

Изменения, вносимые в базовые таблицы, не влияют на значение свойства RecordCount объекта Recordset типа статического набора записей или статического набора записей с последовательным доступом.

Для объектов Recordset или TableDef, не содержащих записей, свойство RecordCount всегда имеет значение 0.

Для присоединенных объектов TableDef свойство RecordCount всегда имеет значение –1.

При вызове метода Requery для объекта Recordset значение свойства RecordCount изменяется так же, как и при повторном выполнении запроса.


Свойство RecordsAffected

Возвращает число записей, которые были использованы при последнем вызове метода Execute.

Возвращаемые значения

Возвращаемое значение имеет тип Long и лежит в интервале от 0 до числа записей, которые были использованы при последнем вызове метода Execute для объекта Database или QueryDef.

Дополнительные сведения

При вызове метода Execute для запуска запроса на изменение из объекта QueryDef, значением свойства RecordsAffected становится число записей, которые были удалены, обновлены или вставлены.

В рабочей области ODBCDirect свойство RecordsAffected не возвращает разумное значение в запросе SQL на удаление таблицы (DROP TABLE).


Свойство Required

Задает или возвращает значение, указывающее, требует ли объект Field непустого (не Null) значения, или требует ли объект Index обязательного заполнения всех полей.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean и содержит значение True, если в поле не допускаются значения Null.

Для объекта, еще не добавленного в семейство, это свойство доступно для чтения/записи.  Для объекта Index значение данного свойства доступно только для чтения, если объект добавлен в семейство Indexes объекта Recordset или TableDef.

Дополнительные сведения

Доступ к свойству Required зависит от объекта, который содержит семейство Fields, как показано в следующей таблице.

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Чтение/запись
Для объекта Field свойство Required используют вместе со свойствами AllowZeroLength, ValidateOnSet или ValidationRule для определения того, является ли допустимым значение свойства Value данного объекта Field.  Если свойство Required имеет значение False, то поле может содержать значения Null, а также любые значения, удовлетворяющие значениям свойств AllowZeroLength и ValidationRule.

Примечание.   Если значение данного свойства можно задать как для объекта Index, так и для объекта Field, то рекомендуется задавать значение данного свойства для объекта Field.  Условие на значение объекта Field проверяется раньше, чем аналогичное свойство объекта Index.


Свойство Restartable

Возвращает значение, определяющее возможность применения к объекту Recordset метода Requery, который повторно выполняет запрос, лежащий в основе объекта Recordset.

Возвращаемые значения

Возвращаемое значение имеет тип Boolean и содержит значение True, если объект Recordset поддерживает метод Requery.  Для табличных объектов Recordset всегда возвращается значение False.

Дополнительные сведения

Значение свойства Restartable проверяют перед вызовом метода Requery для объекта Recordset.  Если данное свойство имеет значение False, то для повторного выполнения запроса следует вызвать метод OpenRecordset для базового объекта QueryDef.


Свойство ReturnsRecords

Задает или возвращает значение, указывающее, возвращает ли записи запрос к серверу SQL внешней базы данных.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean и имеет значение True (по умолчанию), если запрос к серверу возвращает записи.

Дополнительные сведения

Не все запросы к серверу SQL внешней базы данных возвращают записи.  Например, инструкция SQL UPDATE обновляет записи и не возвращает записей, в то время как инструкция SQL SELECT возвращает записи.  Если запрос возвращает записи, то для свойства ReturnsRecords необходимо задать значение True; если запрос не возвращает записей, следует задать для свойства ReturnsRecords значение False.

Примечание.   Значение свойства Connect должно быть задано до указания значения свойства ReturnsRecords.


Свойство Size

Задает или возвращает значение, определяющее максимальный размер в байтах объекта Field.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является константой, указывающей максимальный размер объекта Field.  Для объекта, еще не добавленного в семейство Fields, данное свойство доступно для чтения/записи.  Возможные значения определяются значением свойства Type объекта Field, как показано ниже в разделе "Дополнительные сведения".

Дополнительные сведения

Для полей, содержащих символьные данные (кроме полей Memo), свойство Size указывает максимальное число символов, которое может содержать поле.  Для числовых полей свойство Size задает размер сохраняемого значения в байтах.

Использование свойства Size зависит от того, какой из объектов содержит семейство Fields, в которое добавлен объект Field, как показано в следующей таблице.

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Только чтение
При создании объекта Field с любым типом данных, кроме текстового, значение свойства Size автоматически определяется значением свойства Type, и задавать значение свойства Size не требуется.  Для объекта Field с текстовым типом данных в качестве значения свойства Size можно задать любое целое число от 1 до максимального допустимого размера (в базах данных с ядром Microsoft Jet максимальный размер равен 255 символам). Если размер не задан пользователем, то допускается любой размер поля вплоть до максимального размера, определяемого типом базы данных.

Для объектов Field типа Long Binary и Memo свойство Size всегда получает значение 0.  Чтобы определить размеры полей в конкретных записях, следует использовать метод FieldSize.  Максимальные размеры полей типа Long Binary или Memo ограничиваются только ресурсами компьютера или максимальными размерами, которые поддерживает база данных.


Свойство Sort

Задает или возвращает порядок сортировки записей в объекте Recordset (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, содержащим предложение ORDER BY инструкции SQL без зарезервированных слов ORDER BY.

Дополнительные сведения

Свойство Sort используют с объектами Recordset типа динамического и статического набора записей.

После задания значения свойства Sort для объекта этот порядок сортировки будет использован при создании следующего объекта Recordset на основе данного объекта.  Значение свойства Sort имеет приоритет над любым порядком сортировки, заданным для объекта QueryDef.

По умолчанию задается сортировка по возрастанию (от "А" до "Я" и от 0 до 100).

Свойство Sort нельзя применять к объектам Recordset типа таблицы или статического набора записей с последовательным доступом.  Для сортировки записей в табличном объекте Recordset следует использовать свойство Index.

Примечание.   Во многих случаях быстрее открыть новый объект Recordset с помощью инструкции SQL, включающей условие сортировки.


Свойство Source

Возвращает имя объекта или приложения, ставшего источником ошибки.

Возвращаемые значения

Возвращаемое значение является выражением типа String, представляющим объект или приложение, ставшее источником ошибки.

Дополнительные сведения

Свойство Source обычно представляет имя класса объекта или его программный идентификатор.  Свойство Source позволяет вывести для пользователей информацию в тех случаях, когда программа не может обработать ошибку, возникшую в объекте в другом приложении.

Например, если при обращении к Microsoft Excel возникает ошибка деления на нуль, то Microsoft Excel задает значение свойства Error.Number, равное коду этой ошибки Microsoft Excel, и указывает в свойстве Source источник ошибки Excel.Application.  Отметим, что если ошибка возникает в другом объекте, который вызывается из Microsoft Excel, то Microsoft Excel перехватывает ошибку и задает значение Error.Number, равное собственному коду ошибки деления на нуль.  Однако другие свойства объекта Error (в том числе Source) получают значения от объекта, в котором возникла ошибка.  Свойство Source всегда содержит имя объекта, ставшего источником ошибки.

Используя документацию ошибок, пользователь имеет возможность написать программу обработки ошибок.  Если обработка ошибки оказывается неудачной, информация объекта Error позволяет вывести для пользователя имя объекта, описание ошибки и т.д. с помощью свойства Source и других свойств объекта Error.

Примечание.   Для обработки ошибок, возникающим при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next, а не конструкцию On Error GoTo.  Проверка свойств объекта Error после каждого обращения к внешнему объекту позволяет устранить неопределенность в том, какой из объектов стал источником ошибки. Таким образом, пользователь будет знать, какой из объектов поместил код ошибки в значение свойства Error.Number, а также какой из объектов стал источником ошибки (этот объект указывается в свойстве Error.Source).


Свойства SourceField, SourceTable

•	SourceField — возвращает значение, указывающее имя поля, которое является источником данных объекта  Field.

•	SourceTable — возвращает значение, указывающее имя таблицы, которая является источником данных объекта Field.

Возвращаемые значения

Возвращаемое значение является выражением типа String, указывающим имя поля или таблицы, являющихся источником данных.

Дополнительные сведения

Использование свойств SourceField и SourceTable зависит от того, какой из объектов содержит семейство Fields, в которое добавлен объект Field, как показано в следующей таблице.

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Только чтение
Данные свойства определяют имена исходных поля и таблицы, с которыми связан объект Field.  Например, эти свойства можно применить для определения имени источника данных для поля запроса, имя которого не связано с именем поля основной таблицы.

Примечание.   Свойство SourceTable не возвращает осмысленное значение для объекта Field в семействе Fields табличного объекта Recordset.


Свойство SourceTableName

Задает или возвращает значение, которое определяет имя присоединенной таблицы или имя основной таблицы (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, указывающим имя таблицы.  Для основной таблицы значением данного свойства является пустая строка ("").  Значение данного свойства доступно только для чтения для основной таблицы и для чтения/записи для присоединенной таблицы, а также для объекта, не добавленного в семейство.


Свойство SQL

Задает или возвращает инструкцию SQL, которая определяет запрос, выполняемый объектом QueryDef.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, содержащим инструкцию SQL.

Дополнительные сведения

Свойство SQL содержит инструкцию SQL, которая определяет отбор, группировку и упорядочивание записей при выполнении запроса.  Запросы можно использовать для отбора записей, которые следует включить в объект Recordset.  Кроме того, существуют запросы на изменение записей, позволяющие изменять данные без возвращения записей.

Синтаксис инструкций SQL, используемый в запросе, должен отвечать версии языка SQL, используемой ядром запросов, что в свою очередь зависит от типа рабочей области.  В рабочей области Microsoft Jet следует использовать версии языка SQL ядра Microsoft Jet, за исключением запросов к серверу SQL.  В последнем случае следует использовать версию SQL, которую поддерживает сервер.  В рабочей области ODBCDirect также следует использовать версию SQL, поддерживаемую сервером.

Примечание.   Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL. Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню. При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.

Если инструкция SQL включает параметры запроса, пользователь должен задать значения этих параметров до выполнения запроса.  До явного изменения значений параметров эти же значения будут применяться при каждом новом запуске запроса.

В рабочей области ODBCDirect свойство SQL используют также для выполнения инструкции, сохраненной на сервере.  Например, следующая строка, заданная в свойстве SQL, вызовет выполнение на сервере Microsoft SQL Server сохраненной инструкции с именем «GetData» и одним параметром.

"{call GetData (?)}"

В рабочей области Microsoft Jet объекты QueryDef являются лучшим средством выполнения запросов к серверу SQL для источников данных ODBC, подключенных к ядру Microsoft Jet.  Указав в значении свойства Connect объекта QueryDef источник данных ODBC, пользователь имеет возможность применять в запросе, передаваемом на внешний сервер, диалект SQL, отличный от используемого ядром Microsoft Jet.  Например, для баз данных, использующих Microsoft SQL Server или Sybase SQL Server, допускается указание в аргументе значение инструкций TRANSACT SQL, которые не обрабатываются ядром Microsoft Jet.

Примечание.   Если значение свойства задается путем слияния строки с нецелым числом, а в системной настройке задано использование десятичного разделителя, отличного от десятичной точки (например, запятой, как в следующем примере: strFilter = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке выполнить объект QueryDef в базе данных Microsoft Jet возникнет ошибка.  Причина заключается в том, что при слиянии строк число преобразуется в строковое значение с использованием текущего системного десятичного разделителя, а в языке Microsoft Jet SQL распознается только американский символ десятичного разделителя (точка).


Свойство Table

Задает или возвращает значение, указывающее имя главной таблицы связи, представленной объектом Relation.  Данное имя должно совпадать со значением свойства Name объекта TableDef или QueryDef (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, значением которого является имя таблицы, входящей в семейство TableDefs, или запроса из семейства QueryDefs.  Значение свойства Table доступно для чтения/записи для нового объекта Relation, еще не добавленного в семейство, и доступно только для чтения для существующего объекта Relation в семействе Relations.

Дополнительные сведения

Свойство Table применяется вместе со свойством ForeignTable (внешняя таблица с ключом) для определения объекта Relation, который представляет связь между полями из двух таблиц или запросов.  Значение свойства Table должно представлять значение свойства Name объекта TableDef или QueryDef, описывающего главную таблицу или главный запрос связи, а значение свойства ForeignTable должно представлять значение свойства Name объекта TableDef или QueryDef, описывающего внешнюю (адресующую) таблицу с ключом или запрос.  Тип связи между двумя объектами определяется значением свойства Attributes.

Например, если имеется список кодов запасных частей (в поле "КодДетали"), сохраненный в таблице "Детали", то можно определить связь с отношением "один-ко-многим" с таблицей "Заказы" таким образом, чтобы в таблицу "Заказы" можно было вводить только значения кодов, уже существующих в таблице "Детали". В этом случае попытка ввести значение, отсутствующее в таблице "Детали", приведет к перехватываемой ошибке, если только не задано принудительное выполнение условий целостности данных с помощью значения dbRelationDontEnforce свойства Attributes объекта Relation.

В этом примере таблица "Детали" является главной таблицей, поэтому значением свойства Table объекта Relation должно быть имя таблицы "Детали", а значением свойства ForeignTable объекта Relation должно быть имя "Заказы".  Свойства Name и ForeignName объекта Field из семейства Fields объекта Relation должны иметь значение "КодДетали".

Следующий рисунок иллюстрирует данную связь.


Свойство Transactions

Возвращает значение, указывающее, поддерживает ли данный объект транзакции.

Возвращаемые значения

Возвращаемое значение является выражением типа Boolean и имеет значение True, если объект поддерживает транзакции.

Дополнительные сведения

В рабочей области ODBCDirect свойство Transactions является доступным для объектов Connection и Database.  Оно указывает, поддерживает ли транзакции используемый драйвер ODBC.

В рабочей области Microsoft Jet свойство Transactions используется также с объектами Recordset типа динамического набора записей. Объекты Recordset типа статического набора записей и статического набора записей с последовательным доступом всегда возвращают значение False.

Если объект Recordset типа таблицы или динамического набора записей создан на основе таблицы из базы данных с ядром Microsoft Jet, то свойство Transactions получает значение True, и использование транзакций возможно.  Другие ядра баз данных могут не поддерживать транзакции.  Например, нельзя использовать транзакции с динамическими наборами записей, созданными на основе таблице из базы данных Paradox.

Значение свойства Transactions следует проверить перед вызовом метода BeginTrans для объекта Workspace, соответствующего объекту Recordset, чтобы убедиться, что транзакции поддерживаются.  Вызовы методов BeginTrans, CommitTrans или Rollback для объектов, не поддерживающих транзакции, не имеют последствий.


Свойство Type

Задает или возвращает значение, указывающее тип объекта или тип данных объекта.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является константой, указывающей тип объекта или тип данных объекта.  Для объектов Field или Property данное свойство доступно для чтения/записи до добавления объекта в семейство или в другой объект, после этого свойство становится доступным только для чтения.  Для объектов QueryDef, Recordset или Workspace это свойство доступно только для чтения.  Для объектов Parameter в рабочей области Microsoft Jet это свойство доступно только для чтения.  В рабочей области ODBCDirect это свойство всегда доступно для чтения/записи.

Для объектов Field, Parameter или Property задаваемые или возвращаемые значения свойства определяются с помощью следующих констант:

Константа	Тип
dbBigInt	Big Integer
dbBinary	Binary
dbBoolean	Boolean
dbByte	Byte
dbChar	Char
dbCurrency	Currency
dbDate	Date/Time
dbDecimal	Decimal
dbDouble	Double
dbFloat	Float
dbGUID	GUID
dbInteger	Integer
dbLong	Long
dbLongBinary	Long Binary (OLE Object)
dbMemo	Memo
dbNumeric	Numeric
dbSingle	Single
dbText	Text
dbTime	Time
dbTimeStamp	Time Stamp
dbVarBinary	VarBinary
Для объекта QueryDef следующие константы определяют тип запроса:

Константа	Тип запроса
dbQAction	Запрос на изменение
dbQAppend	Запрос на добавление записей
dbQCompound	Составной запрос
dbQCrosstab	Перекрестный запрос
dbQDDL	Управляющий запрос
dbQDelete	Запрос на удаление
dbQMakeTable	Запрос на создание таблицы
dbQProcedure	Процедурный запрос (только в рабочей области ODBCDirect)
dbQSelect	Запрос на выборку
dbQSetOperation	Запрос на объединение
dbQSPTBulk	Используется вместе с константой dbQSQLPassThrough для указания запроса, не возвращающего записи (только в рабочей области Microsoft Jet).
dbQSQLPassThrough	Запрос к серверу (только в рабочей области Microsoft Jet).
dbQUpdate	Запрос на обновление
Примечание.   Для того чтобы создать запрос к серверу SQL в рабочей области Microsoft Jet, нет необходимости явно задавать в свойстве Type константу dbQSQLPassThrough.  Этот тип задается ядром базы данных Microsoft Jet автоматически при создании объекта QueryDef и определении его свойства Connect.

Следующие константы определяют тип объекта Recordset:

Константа	Тип объекта Recordset
dbOpenTable	Таблица (только в рабочей области Microsoft Jet).
dbOpenDynamic	Объект Recordset динамического типа (только в рабочей области ODBCDirect)
dbOpenDynaset	Динамический набор записей
dbOpenSnapshot	Статический набор записей
dbOpenForwardOnly	Статический набор записей с последовательным доступом
Следующие константы определяют тип объекта Workspace.

Константа	Тип объекта Workspace
dbUseJet	Объект Workspace подключен к ядру базы данных Microsoft Jet.
dbUseODBC	Объект Workspace подключен к источнику данных ODBC.
Дополнительные сведения

При добавлении нового объекта Field, Parameter или Property в соответствующее семейство объекта Index, QueryDef, Recordset или TableDef возникает ошибка, если содержащая этот объект база данных не поддерживает тип данных, указанный для нового объекта.


Свойство Unique

Задает или возвращает значение, определяющее, представляет ли объект Index уникальный (ключевой) индекс таблицы (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean, содержащим значение True, если объект Index представляет уникальный индекс.  Для объекта Index данное свойство доступно для чтения/записи до добавления объекта в семейство, после чего допускается только чтение.

Дополнительные сведения

Уникальный индекс состоит из одного или нескольких полей, которые позволяют расположить все записи таблицы в однозначно определенном порядке.  Если индекс состоит из одного поля, то значения данного поля должны быть уникальными.  Если индекс содержит несколько полей, то каждое из полей может содержать совпадающие значения, но каждая комбинация значений всех полей индекса должна быть уникальной.

Если оба свойства Unique и Primary объекта Index имеют значение True, индекс является уникальным и первичным.  Это означает, что индекс однозначно определяет порядок расположения всех записей таблицы.  Если свойство Primary имеет значение False, индекс является вторичным индексом.  Вторичные индексы (ключевые и неключевые) также позволяют расположить записи таблицы в определенном порядке, но не служат указателями записей таблицы.

Примечания

•	Создание индексов для таблиц не является обязательным, однако доступ к отдельной записи в больших таблицах без определенного индекса может занимать достаточно много времени.

•	Записи, загруженные из неиндексированных таблиц, возвращаются в произвольном порядке.

•	Значения свойства Attributes каждого объекта Field, входящего в объект Index, определяют порядок записей и, соответственно, способ доступа к данным с использованием этого индекса.

•	Уникальный индекс позволяет оптимизировать поиск записей.

•	Индексы не влияют на физический порядок записей в основной таблице.  Выбор конкретного индекса влияет только на порядок доступа к записям объекта Recordset типа таблицы, а также на создание объекта Recordset ядром базы данных Microsoft Jet.


Свойство Updatable

Возвращает значение, определяющее возможность изменения объекта доступа к данным (DAO).

Возвращаемые значения

Возвращаемое значение является выражением типа Boolean.  Значение True указывает, что допускается изменение или обновление объекта. (Объекты Recordset типа статического набора записей и статического набора записей с последовательным доступом всегда возвращают значение False).

Дополнительные сведения

В зависимости от вида объекта, если свойство Updatable имеет значение True, верным является следующее утверждение.

Объект	Описание
Database	Допускается изменение объекта.
QueryDef	Допускается изменение описания запроса.
Recordset	Допускается обновление записей.
TableDef	Допускается изменение описания таблицы.
Свойство Updatable всегда имеет значение True для только что созданного объекта TableDef и значение False для присоединенного объекта TableDef.  Новый объект TableDef можно добавить в базу данных только в том случае, если текущий пользователь имеет разрешение на запись для базы данных.

Многие типы объектов могут содержать поля, значения которых нельзя обновить.  Например, можно создать объект Recordset типа динамического набора записей, в котором изменения допускаются только для некоторых из полей.  Неизменяемые поля могут содержать постоянные данные или данные с автоприращением.  Кроме того, динамический набор записей может быть создан на основе запроса, объединяющего обновляемые и неизменяемые таблицы.

Если объект содержит поля, доступные только для чтения, свойство Updatable имеет значение False.  Если одно или несколько полей являются обновляемыми, это свойство имеет значение True.  Пользователь имеет возможность изменять значения только обновляемых полей.  При попытке присвоить новое значение полю, доступному только для чтения, возникает перехватываемая ошибка.

Свойство Updatable объекта QueryDef получает значение True, если допускается обновление определения запроса, даже в том случае, когда результирующий объект Recordset является необновляемым.

Поскольку обновляемый объект может содержать отдельные поля, доступные только для чтения, перед внесением изменений в записи объекта Recordset следует проверить значение свойства DataUpdatable каждого из полей семейства Fields объекта Recordset.


Свойство UserName

Задает или возвращает значение, представляющее пользователя, группу пользователей или владельца объекта Workspace.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, значением которого является имя пользователя.  В рабочей области Microsoft Jet это значение представляет объект User из семейства Users или объект Group из семейства Groups.  Для объектов Microsoft Jet Container и Document данное свойство доступно для чтения/записи.  Для любых объектов Workspace это свойство доступно только для чтения.

Дополнительные сведения

В зависимости от типа объекта, значение свойства UserName представляет:

•	Владельца объекта Workspace.

•	Пользователя или группу пользователей при определении разрешений для объекта Container или объекта Document (только в рабочей области Microsoft Jet).

Для того чтобы прочитать или установить разрешения для конкретного пользователя или группы пользователей, следует сначала указать в свойстве UserName соответствующее имя пользователя или группы.  После этого следует проверить значение свойства Permissions, чтобы узнать, какие разрешения имеет пользователь или группа, или задать другие разрешения с помощью свойства Permissions.

Для объекта Workspace проверка значения свойства UserName позволяет определить владельца данной рабочей области.  Значение свойства UserName позволяет определить владельца данной рабочей области.  Значение свойства задается для указания владельца объекта Workspace перед добавлением объекта в семейство Workspaces.


Свойство V1xNullBehavior

Указывает, следует ли преобразовывать пустые строки (""), которые используются в программах для заполнения полей типа Text или Memo, в пустые значения (Null).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean, которое имеет значение True, если пустые строки преобразуются в пустые значения.

Дополнительные сведения

Данное свойство применимо к базам данных с ядром Microsoft Jet версии 1.x, преобразованным в формат ядра Microsoft Jet версии 2.0 или 3.0.

Примечание.   Это свойство автоматически создается ядром базы данных Microsoft Jet при преобразовании базы данных версии 1.x в базу данных версии 2.0 или 3.0.  База данных версии 2.0 сохранит это свойство после преобразования в базу данных версии 3.0.

После изменения значения этого свойства необходимо закрыть базу данных и снова открыть ее, чтобы внесенные изменения вступили в действие.

Для увеличения быстродействия измените в программах инструкции, задающие пустые строки в значениях текстовых полей и полей Memo, на инструкции, задающие значения Null, и удалите свойство V1xNullBehavior из семейства Properties.


Свойство ValidateOnSet

Задает или возвращает значение, определяющее режим проверки поля на соответствие заданным условиям на значение объекта Field при указании значения свойства Value объекта (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Boolean, которое может иметь одно из следующих значений.

Значение	Описание
True	Условие на значение, заданное в свойстве ValidationRule объекта Field, проверяются при задании значения свойства Value объекта.
False	(По умолчанию).  Проверка на соответствие условиям откладывается до тех пор, пока запись не будет обновлена.
Только объекты Field в объектах Recordset поддерживают свойство ValidateOnSet как доступное для чтения/записи.

Дополнительные сведения

Полезно задавать для свойства ValidateOnSet значение True при работе с записями, содержащими большие поля Memo.  Ожидание вызова метода Update для проверки данных на соответствие условиям на значение может привести к значительным потерям времени при записи содержимого полей Memo в базу данных, если окажется, что эти данные не принимаются из-за нарушения условий на значение в другом поле.


Свойство ValidationRule

Задает или возвращает значение, определяющее, какие данные являются допустимыми для поля при его изменении или добавлении в таблицу (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое и возвращаемое значение данного свойства определяется выражением типа String, которое задает условие сравнения в виде предложения WHERE инструкции SQL, но без ключевого слова WHERE.  Для объекта, еще не добавленного в семейство Fields, данное свойство доступно для чтения/записи.  Более подробное описание характеристик чтения/записи данного свойства см. в разделе "Дополнительные сведения".

Дополнительные сведения

Свойство ValidationRule определяет, проводится ли проверка условий на значение в указанном поле.  Попытка ввести данные, не удовлетворяющие условиям на значение, приводит  к перехватываемой ошибке.  При этом возвращается сообщение об ошибке, текст которого задается в свойстве ValidationText, а если значение этого свойства не задано, то текст выражения, заданного в свойстве ValidationRule.

Для объекта Field использование свойства ValidationRule зависит от того, какой из объектов содержит семейство Fields, как показано в следующей таблице:

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Чтение/запись
Для объекта Recordset свойство ValidationRule доступно только для чтения.  Для объекта TableDef использование свойства ValidationRule определяется типом объекта TableDef, как показано в следующей таблице:

Тип объекта TableDef	Доступ
Основная таблица	Чтение/запись
Присоединенная таблица	Только чтение
Условия на значение поддерживаются только в базах данных, использующих ядро Microsoft Jet.

В строковом выражение, определяющем свойство ValidationRule объекта Field, допускаются ссылки только на это поле.  Данное выражение не может содержать ссылки на определяемые пользователем функции, статистические функции SQL или запросы.  Если свойство ValidateOnSet объекта Field имеет значение True, то для определения условий на значение поля выражение для свойства ValidationRule должно быть синтаксически верным (с именем поля в качестве подразумеваемого операнда) и возвращать значение True. Если для свойства поля ValidateOnSet задано значение False, свойство ValidationRule игнорируется.

Выражение для свойства ValidationRule объекта Recordset или TableDef может содержать ссылки на любые поля этого объекта, в остальном действуют ограничения, перечисленные выше для объектов Field.

Для объекта Recordset типа таблицы свойство ValidationRule автоматически наследует значение свойства ValidationRule объекта TableDef, на основе которого создан объект Recordset.

Для объекта TableDef, созданного на основе присоединенной таблицы, свойство ValidationRule наследует значение соответствующего свойства базовой основной таблицы.  Если базовая основная таблица не поддерживает условия на значения, то значением свойства ValidationRule становится пустая строка ("").

Примечание.   Если значение свойства задается путем слияния строки с нецелым числом, а в системной настройке задано использование десятичного разделителя, отличного от десятичной точки (например, запятой, как в следующем примере: strFilter = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке проверить условия на значение возникнет ошибка.  Причина заключается в том, что при слиянии строк число преобразуется в строковое значение с использованием текущего системного десятичного разделителя, а в языке Microsoft Jet SQL распознается только американский символ десятичного разделителя (точка).


Свойство ValidationText

Задает или возвращает значение, указывающее текст сообщения, которое выводится на экран в том случае, если значение объекта Field не соответствует условию на значение, заданному в свойстве ValidationRule (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа String, в котором задается текст сообщения, выводящегося при попытке ввести недопустимое значение.  Для объекта, еще не добавленного в семейство, данное свойство доступно для чтения/записи.  Для объекта Recordset это свойство доступно только для чтения.  Для объекта TableDef данное свойство доступно только для чтения для присоединенной таблицы и допускает чтение/запись для основной таблицы.

Дополнительные сведения

Для объекта Field использование свойства ValidationText зависит от того, какой из объектов содержит семейство Fields, в которое добавлен объект Field, как показано в следующей таблице:

Вмещающий объект	Доступ
Index	Не поддерживается
QueryDef	Только чтение
Recordset	Только чтение
Relation	Не поддерживается
TableDef	Чтение/запись


Свойство Value

Задает или возвращает значение объекта.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение является выражением типа Variant, значение которого принадлежит к типу данных, определенному в свойстве Type объекта.

Дополнительные сведения

Обычно, свойство Value используют для загрузки и изменения данных в объектах Recordset.

Свойство Value является используемым по умолчанию свойством объектов Field, Parameter и Property.  Таким образом, чтобы задать или возвратить значение одного из этих объектов, достаточно сослаться на сам объект без явной ссылки на свойство Value.

Попытка задать значение свойства Value в неподходящем контексте (например, свойство Value объекта Field в семействе Fields объекта TableDef) приведет к перехватываемой ошибке.

Примечания

•	В рабочей области ODBCDirect нельзя прочитать или задать значение свойства Value объекта Recordset больше одного раза без обновления текущей записи.  Например, чтобы прочитать, а затем задать значение свойства Value, следует сначала прочитать это свойство, затем с помощью инструкции Move 0 обновить текущую запись, а затем записать новое значение.

•	Десятичные значения, прочитанные из базы данных Microsoft SQL Server, форматируются в экспоненциальной нотации в рабочей области Microsoft Jet, но снова отображаются как обычные десятичные значения в рабочей области ODBCDirect.


Свойство Version

•	В рабочей области Microsoft Jet для объекта DBEngine возвращает используемую версию объектов доступа к данным (DAO). Для объекта Database возвращает версию ядра базы данных Microsoft Jet, в которой был создан файл .mdb.

•	В рабочей области ODBCDirect для объекта DBEngine возвращает используемую версию объектов доступа к данным.  Для объекта Database возвращает версию используемого драйвера ODBC.

Возвращаемые значения

Возвращаемое значение является выражением типа String, значением которого является номер версии в следующем формате.

•	В рабочей области Microsoft Jet — номер версии представляется в виде "номер.выпуск", например, "3.0".  Номер версии любого продукта состоит из номера основной версии (3), точки и номера выпуска (0).

•	В рабочей области ODBCDirect — представляется номер версии объектов доступа к данным (DAO) в виде "номер.выпуск" или номер версии драйвера ODBC в виде "основной.дополнительный.выпуск".  Например, значение «3.5» свойства DBEngine.Version указывает версию DAO 3.5.  Значение "2.50.1032" свойства Version объекта Database указывает, что текущий экземпляр DAO подключен к драйверу ODBC версии 2.5 выпуска 1032.

Дополнительные сведения

В рабочей области Microsoft Jet значение свойства Version объекта Database соответствует версии ядра базы данных Microsoft Jet и может при этом не совпадать с номером версии продукта Microsoft, включающего ядро базы данных.  Например, свойство Version объекта Database, созданного в Microsoft Visual Basic 3.0, будет иметь значение 1.1, а не 3.0.

В следующей таблице показано, какая версия ядра базы данных включена в разные версии продуктов Microsoft:

Microsoft Jet (год выпуска)	Microsoft Access	Visual Basic	Microsoft Excel	Visual C++
1.0 (1992)	1.0	Нет	Нет	Нет
1.1 (1993)	1.1	3.0	Нет	Нет
2.0 (1994)	2.0	Нет	Нет	Нет
2.5 (1995)	Нет	4.0 (16-бит)	Нет	Нет
3.0 (1995)	‘95 (7.0)	4.0 (32-бит)	‘95 (7.0)	4.x
3.5 (1996)	‘97 (8.0)	5.0	‘97 (8.0)	5.0


Свойство DesignMasterID

Задает или возвращает 16-байтовое значение, однозначно определяющее основную реплику в наборе реплик (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение содержит идентификатор GUID, однозначно определяющий основную реплику набора.

Дополнительные сведения

Свойство DesignMasterID необходимо определять только в том случае, если требуется указать в наборе другую основную реплику.  Задание значение данного свойства делает основной репликой конкретную реплику из набора реплик.

Внимание!   Ни в коем случае не создавайте в наборе вторую основную реплику.  Наличие двух основных реплик может привести к потере данных.

В некоторых обстоятельствах — например, если основная реплика уничтожена или повреждена — данное свойство можно определить для текущей реплики.  Однако определение данного свойства для реплики при наличии в наборе другой основной реплики может привести разделение набора на два несогласованных набора, что сделает невозможной дальнейшую синхронизацию данных.

Если решено сделать реплику новой основной репликой, следует перед определением для нее свойства DesignMasterID выполнить синхронизацию этой реплики со всеми остальными репликами набора.  Превратить реплику в основную можно только в том случае, если она открыта для монопольного доступа.

Если основной репликой назначается реплика, доступная только для чтения, то доступными для чтения будут как новая, так и старая основные реплики.

Значение свойства DesignMasterID хранится в системной таблице "MSysRepInfo".


Свойство KeepLocal

Задает  или возвращает для таблицы, запроса, формы, отчета, макроса или модуля значение, показывающее, что объект не является реплицируемым при репликации базы данных (только в рабочей области Microsoft Jet).

Примечание.   Прежде чем задавать или читать значение свойства KeepLocal для объектов TableDef или QueryDef, необходимо создать данное свойство с помощью метода CreateProperty и добавить его в семейство Properties объекта.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Text.  Чтобы объект остался локальным при репликации базы данных, следует присвоить ему строковое значение "T".  Свойство KeepLocal неприменимо к объектам, которые уже сделаны реплицируемыми.

Дополнительные сведения

После определения свойства KeepLocal это свойство включается в семейство Properties объекта Document, представляющего главный объект.

Перед заданием свойства KeepLocal следует проверить значение свойства Replicable.

После преобразования базы данных в реплицируемую все новые объекты, создаваемые в основной реплике или в любой другой реплике набора, являются локальными объектами.  Локальные объекты остаются в реплике, в которой они были созданы, и не копируются в другие реплики набора.  При создании каждой новой реплики в наборе все реплицируемые объекты исходной реплики включаются в новую реплику, а локальные объекты не включаются.

Если в реплике создается новый объект, который требуется преобразовать из локального в реплицируемый, чтобы сделать его доступным для других пользователей, следует либо создать объект в основной реплике, либо импортировать его в основную реплику.  При этом следует удалить локальный объект из всех реплик, в противном случае возникнет структурная ошибка.  После включения объекта в основную реплику, следует задать для свойства Replicable объекта значение True.

Объект, для которого определяется свойство KeepLocal, мог уже унаследовать это свойство от другого объекта, что, однако, не повлияет на его поведение, поскольку для каждого объекта значение этого свойства должно быть задано явно.


Свойство Replicable

Задает или возвращает значение, которое определяет, можно ли сделать базу данных или объект базы данных реплицируемым (только в рабочей области Microsoft Jet).

Примечание.   Прежде чем задавать или читать значение свойства Replicable для объектов Database, TableDef или QueryDef, необходимо создать данное свойство с помощью метода CreateProperty и добавить его в семейство Properties объекта.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Text.

Если этому свойству объекта Database будет присвоено строковое значение "T", база данных станет реплицируемой.  Значение "T" этого свойства не может быть изменено; при присвоении этому свойству значения "F" (или любого другого значения, отличного от "T") приведет к возникновению ошибки.

Если этому свойству объекта базы данных будет присвоено строковое значение "T", реплицируемым станет данный объект (и все его последующие изменения) во всех репликах в наборе реплик.  Задать значение этого свойства можно также в окне свойств этого объекта в Microsoft Access.

Примечание.   В версии 3.5 ядра базы данных Microsoft Jet поддерживается также свойство ReplicableBool со значениями типа Boolean.  Его функциональные характеристики идентичны свойству Replicable, с тем лишь исключением, что значения имеют тип Boolean.  Заданное для свойства ReplicableBool значение True делает объект реплицируемым.

Дополнительные сведения

Перед тем как определять свойство Replicable для базы данных, создайте резервную копию базы данных.  Если операция определения свойства Replicable не была успешно завершена, необходимо удалить частично реплицированную базу данных, создать новую резервную копию и повторить попытку.

При задании данного свойства для объекта Database ядро Microsoft Jet добавляет поля, таблицы и свойства в объекты базы данных.  Эти поля, таблицы и свойства используются ядром Microsoft Jet для синхронизации объектов базы данных.  Например, во все существующие таблицы добавляются три новых поля, позволяющие идентифицировать измененные записи.  Добавление этих полей и других объектов приводит к увеличению размера базы данных.

Для форм, отчетов, макросов и модулей, созданных в главном приложении (например, в Microsoft Access), пользователь должен задать это свойство для объекта, определенного в главном приложение с помощью интерфейса пользователя главного приложения.  После определения свойства KeepLocal это свойство включается в семейство Properties объекта Document, представляющего главный объект.

Если свойство Replicable было задано для объекта путем установки флажка реплицируемого объекта в окне свойств объекта, определение свойства Replicable в программе становится невозможным.

При создании в реплике нового объекта — таблицы, запроса, формы, отчета, макроса или модуля — он считается локальным и хранится только в этой реплике.  Чтобы сделать объект доступным для пользователей, работающих с другими репликами, необходимо сделать его реплицируемым.  Для этого следует создать этот объект в основной реплике или импортировать его в нее, а затем присвоить значение "T" свойству Replicable объекта.

Объект, для которого задается свойство Replicable, может уже иметь это свойство, унаследованное от другого объекта.  Однако значение этого свойства, заданное для другого объекта, не влияет на текущий объект.  Для каждого объекта значение этого свойства должно быть задано явно.


Свойство ReplicaID

Возвращает 16-байтовое значение, однозначно определяющее реплику базы данных (только в рабочей области Microsoft Jet).

Возвращаемые значения

Возвращаемое значение является значением типа GUID, однозначно определяющим реплику или основную реплику.

Дополнительные сведения

Данное значение автоматически создается ядром базы данных Microsoft Jet при создании новой реплики.

Значение свойства ReplicaID каждой реплики (и основной реплики) сохраняется в системной таблице "MSysReplicas".


Свойство SystemDB

Задает или возвращает путь к текущему каталогу, содержащему файл системной базы данных (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение определяется выражением типа String, описывающим полный путь к файлу системной базы данных.

Дополнительные сведения

Ядро базы данных Microsoft Jet позволяет определить рабочую группу и установить различные разрешения на доступ к каждому объекту в базе данных для каждого пользователя, входящего в рабочую группу.  Рабочая группа определяется в файле системной базы данных, обычно имеющем имя "system.mda".  Для того чтобы пользователи получили доступ к защищенным объектам базы данных, объекты доступа к данным (DAO) должны иметь информацию о положении этого файла системной базы данных.  Положение этого файла определяется для механизма DAO либо по записям в реестре Windows, либо по значению свойства SystemDB.  При установке это свойство получает значение по умолчанию "system.mda" без указания пути.

Чтобы изменение настройки по умолчанию вступило в силу, значение свойства SystemDB должно быть задано до инициализации объекта DBEngine (т.е. до создания экземпляра любого другого объекта доступа к данным).  Область определения этого значения ограничена текущим приложением и не может быть изменена без повторного запуска приложения.


Свойство PartialReplica

Задает или возвращает значение для объекта Relation, указывающее, должна ли учитываться представляемая объектом связь при заполнении частичной реплики из полной реплики (только в базах данных Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение принадлежит к типу Boolean и имеет значение True, когда при синхронизации задается учет связи.

Дополнительные сведения

Данное свойство позволяет выполнять репликацию данных из полной реплики в частичную реплику с учетом связей, установленных между таблицами.  Свойство PartialReplica используют в тех случаях, когда одного свойства ReplicaFilter недостаточно для однозначного указания данных, помещаемых в частичную реплику.  Например, предположим, что имеется база данных, в которой для таблицы "Клиенты" установлена связь с отношением "один-ко-многим" с таблицей "Заказы", и требуется задать такую настройку частичной реплики, чтобы в нее помещались только заказы клиентов из города Тверь (а не все заказы).  Невозможно задать в свойстве ReplicaFilter таблицы "Заказы" условие Город = 'Тверь', поскольку поле "Город" находится в таблице "Клиенты", а не в таблице "Заказы".

Для репликации всех заказов из города Тверь, необходимо указать, что связь между таблицами "Заказы" и "Клиенты" является активной при репликации.  После создания частичной реплики для ее заполнения заказами из Твери требуются следующие действия:

1	Задайте в свойстве ReplicaFilter объекта TableDef "Клиенты" условие "Город = 'Тверь'".

2	Задайте значение True свойства PartialReplica объекта Relation, соответствующего связи между таблицами "Заказы" и "Клиенты".

3	Вызовите метод PopulatePartial.

Внимание!   При определении фильтра или связи для реплики необходимо помнить, что записи частичной реплики, не удовлетворяющие условию отбора, будут удалены из частичной реплики, но не из полной реплики.  Например, предположим, что в свойстве ReplicaFilter объекта TableDef "Клиенты" для частичной реплики задано условие "Город = 'Тверь'", и требуется снова заполнить базу данных.  Это приведет к вставке или обновлению всех записей для клиентов из Твери.  Если после этого изменить условие фильтра ReplicaFilter на "Город = 'Тула'" и снова заполнить базу данных, все записи для клиентов из Твери в частичной реплике будут удалены, а все записи для клиентов из Тулы вставлены из полной реплики.  В полной реплике не будет удалена ни одна из записей.

Полезным приемом перед заданием значения свойства ReplicaFilter или PartialReplica является синхронизация частичной реплики, для которой задаются эти свойства, с полной репликой.  Это обеспечит передачу изменений из частичной реплики в полную реплику перед удалением любых записей из частичной реплики.


Свойство ReplicaFilter

Задает или возвращает значение для объекта TableDef в частичной реплике, показывающее, какое подмножество записей этой таблицы отбирается при репликации из полной реплики (только в базах данных Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение принадлежит к типу String или Boolean; оно указывает, какое подмножество записей этой таблицы отбирается при репликации, как показано ниже:

Значение	Описание
Строка	Условие, которому должны удовлетворять записи таблицы, отбираемые при репликации из полной реплики.
True	Реплицируются все записи.
False	(По умолчанию).  Ни одна из записей не реплицируется.
Дополнительные сведения

Данное свойство аналогично предложению WHERE инструкции SQL (без ключевого слова WHERE), но в нем не допускается использование подчиненных запросов, статистических функций (таких как Count) или определяемых пользователем функций при указании условий отбора.

Синхронизация частичной реплики возможна только с полной репликой.  Не допускается синхронизация данных в двух частичных репликах.  Кроме того, при создании частичной реплики имеется возможность указать условия отбора записей, но нельзя указать поля, участвующие в репликации.

Обычно сброс фильтра реплики осуществляется в том случае, когда требуется поместить в частичную реплику новый набор записей.  Например, если сотрудник временно принимает регион, обслуживаемый другим сотрудником, приложение базы данных может выполнить временную репликацию данных из двух регионов, а затем восстановить предыдущий фильтр.  В таком сценарии приложение изменяет значение свойства ReplicaFilter, а затем снова заполняет частичную реплику.

При изменении фильтра реплики в приложении необходимо выполнить следующие действия:

1	Вызовите метод Synchronize для синхронизации полной реплики с частичной репликой, у которой изменяется фильтр.

2	С помощью свойства ReplicaFilter внесите требуемые изменения в фильтр реплики.

3	Вызовите метод PopulatePartial для удаления всех записей из частичной реплики и передачи в нее всех записей из полной реплики, удовлетворяющих условию нового фильтра.

Для удаления фильтра следует задать для свойства ReplicaFilter значение False.  Если удалить все фильтры и вызвать метод PopulatePartial, в реплицированные таблицы в частичной реплике не будет помещена ни одна запись.

Примечание.   Если после изменения фильтра реплики метод Synchronize вызывается без предварительного вызова метода PopulatePartial, возникает перехватываемая ошибка.


Свойство BatchCollisionCount

Возвращает число записей, которые не были обновлены в последней операции пакетного обновления (только в рабочей области ODBCDirect).

Возвращаемое значение

Возвращаемое значение имеет тип данных Long и указывает число записей, которые не были обновлены, или 0, если были успешно обновлены все записи.

Дополнительные сведения

Данное свойство показывает, для какого количества записей возникали конфликты обновления или другие причины, не позволившие обновить записи, во время последней попытки пакетного обновления.  Значение данного свойства соответствует числу закладок, указанному в свойстве BatchCollisions.

Если задать в свойстве Bookmark рабочего объекта Recordset значения закладок из массива BatchCollisions, то можно будет перейти на каждую запись, которая не была обновлена во время последней пакетной операции Update.

После исправления записей, испытавших конфликты обновления, можно снова вызвать метод Update в пакетном режиме.  В этот момент механизм DAO предпримет новую попытку пакетного обновления, а свойство BatchCollisions снова будет определять набор записей, которые не были обновлены во второй попытке.  Любые записи, успешно обновленные в предыдущей попытке, не будут участвовать в новой попытке, поскольку теперь их свойство RecordStatus будет определяться константой dbRecordUnmodified.  Этот процесс может продолжаться и далее, пока не будут разрешены все возникающие конфликты, или до отказа пользователя от попыток обновления и закрытия результирующего набора записей.


Свойство BatchCollisions

Возвращает массив закладок, указывающий строки, в которых возникли конфликты обновления при последней операции пакетного обновления (только в рабочей области ODBCDirect).

Возвращаемое значение

Возвращаемое значение является выражением типа Variant, содержащим массив закладок.

Дополнительные сведения

Данное свойство содержит массив закладок для строк, в которых возникли конфликты обновления в последней пакетной операции Update.  Число элементов массива возвращается в свойстве BatchCollisionCount.

Если задать в свойстве Bookmark рабочего объекта Recordset значения закладок из массива BatchCollisions, то можно будет перейти на каждую запись, которая не была обновлена во время последней пакетной операции Update.

После исправления записей, испытавших конфликты обновления, можно снова вызвать метод Update в пакетном режиме.  В этот момент механизм DAO предпримет новую попытку пакетного обновления, а свойство BatchCollisions снова будет определять набор записей, которые не были обновлены во второй попытке.  Любые записи, успешно обновленные в предыдущей попытке, не будут участвовать в новой попытке, поскольку теперь их свойство RecordStatus будет определяться константой dbRecordUnmodified.  Этот процесс может продолжаться и далее, пока не будут разрешены все возникающие конфликты, или до отказа пользователя от попыток обновления и закрытия результирующего набора записей.

Данный массив создается заново при каждом вызове метода Update в пакетном режиме.


Свойство BatchSize

Задает или возвращает число инструкций, посылаемых на сервер в каждом пакете (только в рабочей области ODBCDirect).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и указывает число инструкций в пакете, посылаемых на сервер в одной операции пакетного обновления.  Значением по умолчанию является 15.

Дополнительные сведения

Свойство BatchSize определяет размер пакета, используемый при передаче инструкций на сервер в операции пакетного обновления.  Значение данного свойства задает число инструкций, посылаемых на сервер в одном командном буфере.  По умолчанию в каждом пакете на сервер посылается 15 инструкций.  Значение этого свойства может быть  изменено в любое время.  Если сервер базы данных не поддерживает пакетную передачу инструкций, можно задать для этого свойства значение 1, приводящее к отправке каждой инструкции по отдельности.


Свойство CacheStart

Задает или возвращает значение, определяющее закладку первой записи в объекте Recordset типа динамического набора записей, который содержит данные из источника данных ODBC, помещаемые в локальный буфер (только в рабочей области Microsoft Jet).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных String и определяет закладку.

Дополнительные сведения

Помещение данных в локальный буфер повышает быстродействие при использовании объектов Recordset для загрузки данных с удаленного сервера.  Буфером называется область локальной памяти, содержащая данные, которые были получены с сервера во время последних обращений.  Данные заносятся в локальный буфер в предположении, что во время выполнения приложения потребуется повторное обращение к этим данным.  Во время обращения к данным ядро базы данных Microsoft Jet сначала проверяет наличие данных в локальном буфере вместо обращения к серверу, которое занимает намного больше времени.  В локальном буфере сохраняются только данные, поступающие из источника данных ODBC.

Любой источник данных ODBC, подключенный к ядру Microsoft Jet, такой как присоединенная таблица, может иметь собственный локальный буфер.  Для создания локального буфера следует открыть объект Recordset на основе удаленного источника данных, задать значения свойств CacheSize и CacheStart, а затем вызвать метод FillCache или осуществить переходы по записям с помощью методов группы Move.

Значением свойства CacheStart является закладка первой записи объекта Recordset, помещаемой в локальный буфер.  Чтобы задать свойство CacheStart, можно использовать закладку любой записи.  Запись, с которой должен начинаться временный буфер, следует сделать текущей записью, а затем задать для свойства CacheStart значение свойства Bookmark.

Записи, которые помещены в локальный буфер, принимаются ядром базы данных Microsoft Jet непосредственно из буфера, а записи вне этого диапазона загружаются с сервера.

Записи, полученные из локального буфера, не отражают изменений, внесенных в источник данных другими пользователями со времени записи данных в буфер.

Для принудительного обновления содержимого локального буфера следует задать значение 0 для свойства CacheSize объекта Recordset, а затем восстановить первоначальное значение размера буфера и вызвать метод FillCache.


Свойство Connection

Для объекта Database возвращает объект Connection, соответствующий базе данных (только в рабочей области ODBCDirect).

Для объекта Recordset возвращает объект Connection, которому принадлежит объект Recordset (только в рабочей области ODBCDirect).

Задаваемые и возвращаемые значения

Возвращаемое значение является объектной переменной, представляющей объект Connection.  Для объекта Database свойство Connection доступно только для чтения, а для объекта Recordset это свойство доступно для чтения/записи.

Дополнительные сведения

Для объекта Database свойство Connection позволяет получить ссылку на объект Connection, соответствующий объекту Database.  В механизме объектов доступа к данным (DAO) объект Connection и соответствующий ему объект Database являются просто двумя различными объектными переменными, содержащими ссылку на один объект.  Свойство Database объекта Connection и свойство Connection объекта Database позволяют изменить способ подключения к источнику данных ODBC через ядро базы данных Microsoft Jet на подключение по механизму ODBCDirect.


Свойство Database

Возвращает объект Database, соответствующий подключению (только в рабочей области ODBCDirect).

Возвращаемые значения

Возвращаемое значение является объектной переменной, представляющей объект Database.

Дополнительные сведения

Для объекта Connection свойство Database позволяет получить ссылку на объект Database, соответствующий объекту Connection.  В механизме объектов доступа к данным (DAO) объект Connection и соответствующий ему объект Database являются просто двумя различными объектными переменными, содержащими ссылку на один объект.  Свойство Database объекта Connection и свойство Connection объекта Database позволяют изменить способ подключения к источнику данных ODBC через ядро базы данных Microsoft Jet на подключение по механизму ODBCDirect.


Свойство DefaultCursorDriver

Задает или возвращает тип драйвера указателя набора записей, используемого в подключении, созданном с помощью метода OpenConnection или OpenDatabase (только в рабочей области ODBCDirect).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и определяется одной из следующих констант:

Константа	Описание
dbUseDefaultCursor	(По умолчанию).  Используются указатели набора записей на стороне сервера, если они поддерживаются; в противном случае, используются библиотеки указателей ODBC.
dbUseODBCCursor	Всегда используются библиотеки указателей ODBC.  Данный параметр обеспечивает более высокое быстродействие для небольших наборов записей, но быстродействие быстро ухудшается при повышении размеров наборов записей.
dbUseServerCursor	Всегда используются указатели набора записей на стороне сервера.  Для большинства операций с большими наборами записей этот параметр обеспечивает более высокое быстродействие, но при этом возрастает нагрузка на сеть.
dbUseClientBatchCursor	Всегда используется библиотека пакетных указателей набора записей клиента.  Этот параметр является обязательным для операций пакетного обновления.
dbUseNoCursor	Открывает все указатели набора записей (т.е. объекты Recordset) для последовательного доступа только для чтения с размером набора записей 1.  Используется также термин "запросы без указателя".
Дополнительные сведения

Значение данного свойства затрагивает только подключения, устанавливаемые после определения этого значения.  На существующие подключения значение свойства DefaultCursorDriver не влияет.


Свойство DefaultType

Задает или возвращает значение, указывающее тип рабочей области (Microsoft Jet или ODBCDirect), который будет использоваться при создании следующего объекта Workspace.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и определяется одной из следующих констант:

Константа	Описание
dbUseJet	Создание объекта Workspace, связанного с ядром базы данных Microsoft Jet.
dbUseODBC	Создание объекта Workspace, связанного с источником данных ODBC.
Дополнительные сведения

Приоритет над данным значением при создании конкретного объекта Workspace имеет значение аргумента тип метода CreateWorkspace.


Свойство Direction

Задает или возвращает значение, указывающее, представляет ли объект Parameter входной параметр, выходной параметр, и то, и другое, или значение, возвращаемое из процедуры (только в рабочей области ODBCDirect).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и определяется одной из следующих констант:

Константа	Описание
dbParamInput	(По умолчанию).  Передача данных в процедуру.
dbParamInputOutput	Передача данных в процедуру и из процедуры.
dbParamOutput	Возвращение данных из процедуры, аналогично выходному параметру в инструкции SQL.
dbParamReturnValue	Возвращение данных из процедуры.
Дополнительные сведения

Свойство Direction позволяет определить, является ли параметр входным параметром, выходным параметром, и тем, и другим, или представляет значение, возвращаемое из процедуры.  Некоторые драйверы ODBC не обеспечивают передачу сведений о типе параметров в инструкцию SELECT или при вызове процедуры.  В этих случаях необходимо указывать тип параметра до выполнения запроса.

Например, следующая процедура возвращает значение из сохраненной процедуры с именем "get_employees":

{? = call get_employees}

При данном вызове образуется один параметр — возвращаемое значение.  Тип этого параметра должен быть задан с помощью константы dbParamOutput или dbParamReturnValue до выполнения объекта QueryDef.

Для всех параметров, за исключением параметра с типом dbParamInput, тип параметра должен быть определен до доступа к значению или задания его свойства, а также до выполнения объекта QueryDef.

Для возвращаемых значений необходимо задавать тип dbParamReturnValue, а в случаях, когда этот тип не поддерживается, можно использовать константу dbParamOutput.

Примечание.   Драйвер Microsoft SQL Server 6.0 автоматически задает значение свойства Direction для всех параметров процедур.  Не все драйверы ODBC обеспечивают передачу сведений о типе параметров.  В этих случаях необходимо указывать тип параметра до выполнения запроса.


Свойство FieldSize

Возвращает размер, используемый в базе данных (а не в памяти), для объекта Field типа Memo или Long Binary, входящего в семейство Fields объекта Recordset.

Возвращаемые значения

Возвращаемое значение имеет тип данных Long и указывает число символов (для поля Memo) или размер в байтах (для поля типа Long Binary).

Дополнительные сведения

Свойство FieldSize используют вместе с методами AppendChunk и GetChunk при работе с большими полями.

Поскольку размеры полей типа Long Binary или Memo могут превышать 64 Кбайт, значение, возвращаемое в свойстве FieldSize, следует присваивать переменной, способной сохранять значение типа Long.

Для определения размеров объектов Field, типы которых отличаются от типов Memo и Long Binary, используют свойство Size.

Примечание.   В рабочей области ODBCDirect свойство FieldSize является недоступным в следующих ситуациях:

•	Сервер базы данных или драйвер ODBC не поддерживает указатели на стороне сервера.

•	При использовании библиотеки указателей ODBC (т.е. при задании в свойстве DefaultCursorDriver константы dbUseODBC, а также константы dbUseDefault, когда сервер не поддерживает указатели на стороне сервера).

•	При использовании запроса без указателя (т.е. при задании в свойстве DefaultCursorDriver константы dbUseNoCursor).

Например, Microsoft SQL Server версии 4.21 не поддерживает указатели на стороне сервера, поэтому свойство FieldSize является недоступным.


Свойство MaxRecords

Задает или возвращает максимальное число записей, возвращаемых в запросе.

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long, представляющее число возвращаемых записей.  Значение по умолчанию 0 указывает, что число записей не ограничивается.

Дополнительные сведения

Если в свойстве MaxRecords указано максимальное число строк, возвращаемых в приложении в объекте Recordset, процессор запроса прекращает возвращение записей в объекте Recordset, даже если имеются еще записи, подходящие для включения в набор записей.  Данное свойство полезно в ситуациях, когда ограниченные ресурсы клиента не позволяют обрабатывать большое число записей.


Свойство OriginalValue

Возвращает значение объекта Field, которое существовало в базе данных к моменту начала последней операции пакетного обновления (только в рабочей области ODBCDirect).

Возвращаемые значения

Возвращаемое значение является выражением типа Variant.

Дополнительные сведения

Во время операции пакетного обновления с нежесткой блокировкой может возникнуть конфликт обновления, когда второй клиент изменяет поле и запись в промежуток времени между выполняемыми первым клиентом загрузкой данных и их обновлением.  В свойстве OriginalValue сохраняется значение, которое поле имело перед началом последней операции Update в пакетном режиме.  Если это значение не совпадает со значением, реально существующим в базе данных во время попытки записи в операции обновления, возникает конфликт обновления.  В таких условиях новое значение, существующее в базе данных, является доступным через свойство VisibleValue.


Свойство Prepare

Задает или возвращает значение, указывающее, должен ли запрос перед его выполнением быть подготовлен на сервере как временная сохраненная процедура с помощью функции SQLPrepare интерфейса API ODBC или выполняться непосредственно с помощью функции SQLExecDirect интерфейса API ODBC (только в рабочей области ODBCDirect).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и определяется с помощью одной из следующих констант:

Константа	Описание
dbQPrepare	(По умолчанию).  Инструкция подготавливается к выполнению (т.е. вызывается функция SQLPrepare API ODBC).
dbQUnprepare	Инструкция не подготавливается (т.е. вызывается функция SQLExecDirect API ODBC).
Дополнительные сведения

Свойство Prepare используют либо для указания создания на сервере из запроса временной сохраненной процедуры с ее последующим выполнением, либо для указания прямого выполнения запроса.  Свойство Prepare по умолчанию получает значение dbQPrepare.  Однако можно задать для этого свойства значение dbQUnprepare, исключающее предварительную подготовку запроса.  В последнем случае запрос выполняется с помощью функции SQLExecDirect программного интерфейса (API).

Создание сохраненной процедуры может замедлить выполнение первоначальной операции, но ускоряет выполнение всех последующих обращений к запросу.  Однако некоторые запросы невозможно выполнить в виде сохраненной процедуры.  В этом случае следует задавать для свойства Prepare значение dbQUnprepare.

Если в свойстве Prepare задан режим подготовки запроса dbQPrepare, эта настройка может быть преодолена при выполнении запроса путем указания значения dbExecDirect в аргументе параметры метода Execute.

Примечание.   Функция программного интерфейса ODBC SQLPrepare вызывается после задания значения свойства SQL объектов доступа к данным (DAO).  Таким образом, при необходимости повысить быстродействие за счет использования параметра dbQUnprepare необходимо задать значение свойства Prepare до задания значения свойства SQL.


Свойство RecordStatus

Возвращает значение, указывающее состояние обновления текущей записи, если эта запись участвует в операции пакетного обновления (только в рабочей области ODBCDirect).

Возвращаемые значения

Возвращаемое значение имеет тип данных Long и определяется с помощью одной из следующих констант:

Константа	Описание
dbRecordUnmodified	(По умолчанию).  Запись не была изменена или была успешно обновлена.
dbRecordModified	Запись была изменена, но не обновлена в базе данных.
dbRecordNew	Запись была вставлена с помощью метода AddNew, но еще не занесена в базу данных.
DbRecordDeleted	Запись была удалена, но еще не удалена из базы данных.
dbRecordDBDeleted	Запись была удалена и на локальном уровне, и в базе данных.
Дополнительные сведения

Свойство RecordStatus указывает состояние изменения текущей записи в последней операции пакетного обновления с нежесткой блокировкой.

Когда пользователь изменяет запись, свойство RecordStatus для этой записи автоматически получает значение dbRecordModified.  Аналогично, при добавлении или удалении записи свойство RecordStatus автоматически получает значение соответствующей константы.  При дальнейшем вызове метода Update в пакетном режиме, механизм DAO задает для каждой записи выполнение соответствующей операции на удаленном сервере, основываясь на свойстве RecordStatus этой записи.


Свойство StillExecuting

Указывает, закончено ли выполнение асинхронной операции (т.е. вызванной с параметром dbRunAsync).  (Только в рабочей области ODBCDirect).

Возвращаемые значения

Возвращаемое значение имеет тип данных Boolean и имеет значение True, если запрос еще выполняется, или False, если выполнение запроса завершено.

Дополнительные сведения

Свойство StillExecuting используют, чтобы определить, завершено ли выполнение последнего вызванного в асинхронном режиме метода Execute, MoveLast, OpenConnection или OpenRecordset (т.е. метода, вызванного с параметром dbRunAsync).  Если свойство StillExecuting имеет значение True, любой возвращаемый объект является недоступным.

В следующей таблице перечислены методы, которые проверяются при вызове свойства StillExecuting для объектов разного типа.

Объект	Проверяется асинхронный метод
Connection	Execute или OpenConnection
QueryDef	Execute
Recordset	MoveLast или OpenRecordset
Как только свойство StillExecuting для объекта Connection или Recordset возвращает значение False, становятся возможными последующие ссылки на этот объект Recordset или Connection при вызовах методов OpenConnection или OpenRecordset.  Пока свойство StillExecuting возвращает значение True, ссылки на объект допускаются только для чтения значения свойства StillExecuting.  При вызове метода NextRecordset для завершения обработки объекта Recordset свойство StillExecuting получает значение True во время загрузки следующего набора записей.

Для прекращения выполнения текущей задачи следует вызвать метод Cancel.


Свойство UpdateOptions

Задает или возвращает значение, указывающее, как конструируется предложение WHERE для каждой записи в операции пакетного обновления, а также следует ли в операции пакетного обновления использовать инструкцию UPDATE или инструкцию DELETE с последующей инструкцией INSERT (только в рабочей области ODBCDirect).

Задаваемые и возвращаемые значения

Задаваемое или возвращаемое значение имеет тип данных Long и определяется с помощью следующих констант:

Константа	Описание
dbCriteriaKey	(По умолчанию). Использование в предложении WHERE только ключевого столбца (столбцов).
dbCriteriaModValues	Использование в предложении WHERE ключевого столбца (столбцов) и всех обновляемых столбцов.
dbCriteriaAllCols	Использование в предложении WHERE ключевого столбца (столбцов) и всех столбцов.
dbCriteriaTimeStamp	Использование только столбца штампа времени, если имеется (если столбец штампа времени отсутствует в результирующем наборе записей, возникает ошибка выполнения).
dbCriteriaDeleteInsert	Использование набора инструкций DELETE и INSERT для каждого изменяемого столбца.
dbCriteriaUpdate	(По умолчанию).  Использование инструкции UPDATE для каждого изменяемого столбца.
Дополнительные сведения

При выполнении метода Update в пакетном режиме механизм объектов доступа к данным (DAO) и библиотека пакетных указателей клиента создают для выполнения требуемых изменений набор инструкций UPDATE языка SQL.  Для каждого обновления создается предложение WHERE, чтобы изолировать записи, которые отмечены как измененные с помощью свойства RecordStatus.  Поскольку некоторые удаленные серверы используют триггеры или другие средства обеспечения целостности данных, часто важно ограничить обновляемые поля только теми, которые затрагиваются изменениями.  Для этого следует задать в свойстве UpdateOptions одну из следующих констант: dbCriteriaKey, dbCriteriaModValues, dbCriteriaAllCols или dbCriteriaTimeStamp.  Это обеспечивает выполнение абсолютно минимального количества программ триггеров.  В результате, операция обновления выполняется быстрее с потенциально меньшим количеством ошибок.

Допускается также комбинирование этих констант с константой dbCriteriaDeleteInsert или dbCriteriaUpdate.  Последние определяют для каждого обновления либо использование пары инструкций SQL DELETE и INSERT, либо инструкции UPDATE при отправке пакета обновлений на сервер.  В первом случае для обновления записи требуются две отдельные операции.  В некоторых случаях, в особенности при реализации на удаленной системе триггеров DELETE, INSERT и UPDATE, выбор правильного параметра UpdateOptions позволяет существенно повысить быстродействие.

Если пользователь не задал ни одну из констант, по умолчанию используются константы dbCriteriaUpdate и dbCriteriaKey.

Для новых добавленных записей всегда генерируются инструкции INSERT, а при удалении записей всегда генерируются инструкции DELETE, поэтому данное свойство влияет только на обновления измененных записей библиотекой указателей.


Свойство VisibleValue

Возвращает в случае возникновения конфликта при пакетном обновлении новое значение в базе данных относительно исходного значения (т.е. значения свойства OriginalValue) (только в рабочей области ODBCDirect).

Возвращаемые значения

Возвращаемое значение является выражением типа Variant.

Дополнительные сведения

Данное свойство содержит текущее значение поля в базе данных на сервере.  Во время операции пакетного обновления с нежесткой блокировкой может возникнуть конфликт обновления, когда второй клиент изменяет поле и запись в промежуток времени между выполняемыми первым клиентом загрузкой данных и их обновлением.  В этой ситуации данное свойство обеспечивает доступ к значению, заданному вторым клиентом.


Константы доступа к данным

В механизме объектов доступа к данным (DAO) определены встроенные константы, используемые с методами и свойствами.  Имена всех таких констант начинаются с букв db; эти константы документируются в описаниях методов и свойств, в которых они применяются.

Обозначения:

Только чтение

Чтение/запись

Константы свойства AllPermissions (все [image])

Для любого объекта Container или Document:

Константа	Описание
dbSecReadDef	Допускается чтение описания таблицы, в том числе сведений о столбцах и индексах.
dbSecWriteDef	Допускается изменение и удаление описания таблицы, в том числе сведений о столбцах и индексах.
dbSecRetrieveData	Допускается загрузка данных из объекта Document.
dbSecInsertData	Допускается добавление записей.
dbSecReplaceData	Допускается изменение записей.
dbSecDeleteData	Допускается удаление записей.
Для контейнера Databases, а также для любого объекта Document из семейства Documents, возможно включение следующих констант:

Константа	Описание
dbSecDeleteData	Допускается удаление записей.
dbSecDBAdmin	Допускается репликация базы данных и изменение пароля базы данных.
dbSecDBCreate	Допускается создание новой базы данных.  Поддерживается только для контейнера семейства база данных в системной базе данных (System.mdw).
dbSecDBExclusive	Монопольный доступ к базе данных.
dbSecDBOpen	Допускается открытие базы данных.
Константы свойства Attributes

Для любого объекта Field при определении свойства Attributes могут использоваться следующие константы:

Константа	Описание
dbFixedField	Поле имеет постоянный размер (задается по умолчанию для числовых полей).
dbVariableField	Поле имеет переменный размер (только для текстовых полей).
dbAutoIncrField	Значение поля в новой записи автоматически увеличивается на уникальное значение типа Long (в рабочей области Microsoft Jet поддерживается только для TableDef открытых из файлов .mdb).
dbUpdatableField	Значение поля можно изменять.
dbDescending	Поле сортируется по убыванию (только в рабочей области Microsoft Jet)
dbHyperlinkField	Поле содержит сведения о гиперссылке (только для полей Memo в рабочей области Microsoft Jet)
dbSystemField	Поле является полем репликации  (только для объектов TableDef в базах данных Microsoft Jet)
Для любого объекта Relation при определении свойства Attributes могут использоваться следующие константы:

Константа	Описание
dbRelationUnique	Связь имеет тип отношения "один-к-одному"
dbRelationDontEnforce	Для связи отключается режим обеспечения целостности данных
dbRelationInherited	Связь существует в базе данных, содержащей две присоединенные таблицы.
dbRelationUpdateCascade	Режим каскадного обновления.
dbRelationDeleteCascade	Режим каскадного удаления.
Для любого объекта TableDef при определении свойства Attributes могут использоваться следующие константы:

Константа	Описание
dbAttachExclusive	Открывает присоединенную  таблицу ядра базы данных Microsoft Jet для монопольного доступа.
dbAttachSavePWD	Сохраняет код пользователя и пароль доступа к удаленной присоединенной таблице.
dbSystemObject	Системная таблица.
dbHiddenObject	Скрытая таблица (для временного использования).
dbAttachedTable	Присоединенная таблица из базы данных, не являющейся источником данных ODBC.
dbAttachedODBC	Присоединенная таблица из базы данных ODBC.
Константы свойства CollatingOrder (все [image])

Константа	Язык
dbSortArabic	Арабский
dbSortChineseSimplified	Упрощенный китайский
dbSortChineseTraditional	Традиционный китайский
dbSortCyrillic	Русский
dbSortCzech	Чешский
dbSortDutch	Голландский
dbSortGeneral	Английский, французский, немецкий и португальский
dbSortGreek	Греческий
dbSortHebrew	Иврит
dbSortHungarian	Венгерский
dbSortIcelandic	Исландский
dbSortJapanese	Японский
dbSortKorean	Корейский
dbSortNeutral	Нейтральный (независимый от языка)
dbSortNorw	Норвежский или датский
dbSortPDXIntl	Международный набор символов Paradox
dbSortPDXNor	Норвежский или датский набор символов Paradox
dbSortPDXSwe	Шведский или финский набор символов Paradox
dbSortPolish	Польский
dbSortSlovenian	Словенский
dbSortSpanish	Испанский
dbSortSwedFin	Шведский или финский
dbSortThai	Тайский
dbSortTurkish	Турецкий
dbSortUndefined	Порядок символов не определен или неизвестен.
Константы свойства DefaultCursorDriver (все [image])

Константа	Описание
dbUseDefaultCursor	(По умолчанию).  Используются указатели на стороне сервера, если они поддерживаются; в противном случае, используются библиотеки указателей ODBC.
dbUseODBCCursor	Всегда используются библиотеки указателей набора записей ODBC.  Данный параметр обеспечивает более высокое быстродействие для небольших наборов записей, но быстродействие быстро ухудшается при повышении размеров наборов записей.
dbUseServerCursor	Всегда используются указатели на стороне сервера.  Для большинства операций с большими наборами записей этот параметр обеспечивает более высокое быстродействие, но при этом возрастает нагрузка на сеть.
dbUseClientBatchCursor	Всегда используется библиотека пакетных указателей набора записей клиента.  Этот параметр является обязательным для операций пакетного обновления.
dbUseNoCursor	Открывает все указатели набора записей (т.е. объекты Recordset) для последовательного доступа только для чтения с размером набора записей 1.  Используется также термин "запросы без указателя".
Константы свойства Direction (все [image])

Константа	Описание
dbParamInput	(По умолчанию).  Передача данных в процедуру.
dbParamInputOutput	Передача данных в процедуру и из процедуры.
dbParamOutput	Возвращение данных из процедуры, аналогично выходному параметру в инструкции SQL.
dbParamReturnValue	Возвращение данных из процедуры.
Константы свойства EditMode (все [image])

Константа	Описание
dbEditNone	Операция редактирования в данный момент не выполняется.
dbEditInProgress	Был вызван метод Edit.
dbEditAdd	Был вызван метод AddNew.
Константы свойства Permissions (все [image])

Для любого объекта Container при определении свойства Permissions могут использоваться следующие константы:

Константа	Описание
dbSecNoAccess	Пользователь не имеет доступа к объекту.
dbSecFullAccess	Пользователь имеет полный доступ к объекту.
dbSecDelete	Пользователь может удалить объект.
dbSecReadSec	Пользователь может прочитать сведения о защите объект.
dbSecWriteSec	Пользователь может изменить разрешения на доступ.
dbSecWriteOwner	Пользователь может изменить значение свойства Owner.
Для любого объекта Container в базе данных в свойстве Permissions может использоваться любая из следующих констант (все [image]):

Константа	Описание
dbSecDBAdmin	Пользователь может выполнять репликацию и изменять пароль базы данных.
dbSecDBCreate	Пользователь может создавать новые базы данных.  Данный параметр применим только для объекта Container баз данных в системной базе данных).
dbSecDBOpen	Пользователь может открывать базу данных.
dbSecDBExclusive	Пользователь имеет монопольный доступ к базе данных.
Для любого объекта Container таблиц в свойстве Permissions может использоваться любая из следующих констант (все [image]):

Константа	Описание
dbSecCreate	Пользователь может создавать новые таблицы (применяется только к объектам Container, представляющим таблицы, или к объекту Container баз данных в системной базе данных).
dbSecReadDef	Пользователь может читать описание таблицы, включая сведения о столбцах и индексах.
dbSecWriteDef	Пользователь может изменять или удалять описание таблицы, включая сведения о столбцах и индексах.
dbSecRetrieveData	Пользователь может загружать данные из объекта Document.
dbSecInsertData	Пользователь может добавлять записи.
dbSecReplaceData	Пользователь может изменять записи.
dbSecDeleteData	Пользователь может удалять записи.
Для любого объекта Document при определении свойства Permissions может использоваться любая из следующих констант (все [image]):

Константа	Описание
dbSecCreate	Пользователь может создавать новые документы (применяется только к объектам Container, представляющим таблицы).
DbSecDBCreate	Пользователь может создавать новые базы данных (применяется только к объекту Container баз данных в системной базе данных).
dbSecDBOpen	Пользователь может открывать базу данных.
dbSecDBExclusive	Пользователь имеет монопольный доступ к базе данных.
dbSecDelete	Пользователь может удалить объект.
dbSecDeleteData	Пользователь может удалять записи.
dbSecFullAccess	Пользователь имеет полный доступ к объекту.
dbSecInsertData	Пользователь может добавлять записи.
dbSecReadDef	Пользователь может читать описание таблицы, включая сведения о столбцах и индексах.
dbSecReadSec	Пользователь может прочитать сведения о защите объекта.
dbSecReplaceData	Пользователь может изменять записи.
dbSecRetrieveData	Пользователь может загружать данные из объекта Document.
dbSecWriteDef	Пользователь может изменять или удалять описание таблицы, включая сведения о столбцах и индексах.
dbSecWriteSec	Пользователь может изменить разрешения на доступ.
dbSecWriteOwner	Пользователь может изменить значение свойства Owner.
Константы свойства Prepare (все [image])

Константа	Описание
dbQPrepare	(По умолчанию).  Инструкция подготавливается к выполнению (т.е. вызывается функция SQLPrepare API ODBC).
dbQUnprepare	Инструкция не подготавливается (т.е. вызывается функция SQLExecDirect API ODBC).
Константы свойства RecordStatus (все [image])

Константа	Описание
dbDBDeleted	Запись была удалена и на локальном уровне, и в базе данных.
dbDeleted	Запись была удалена, но еще не удалена из базы данных.
dbRecordModified	Запись была изменена, но не обновлена в базе данных.
dbRecordNew	Запись была вставлена с помощью метода AddNew, но еще не занесена в базу данных.
dbRecordUnmodified	(По умолчанию).  Запись не была изменена или была успешно обновлена.
Константы свойства Type

Для любого объекта Field, Parameter или Property при определении свойства Type может использоваться любая из следующих констант (все [image]):

Константа	Тип
dbBigInt	Big Integer (только для ODBCDirect)
dbBinary	Binary
dbBoolean	Boolean (True/False)
dbByte	Byte (8-bit)
dbChar	Character (только для ODBCDirect)
dbCurrency	Currency
dbDate	Значение даты
dbDecimal	Decimal (только для ODBCDirect)
dbDouble	С плавающей точкой двойной точности
dbFloat	С плавающей точкой (только для ODBCDirect)
dbGUID	GUID
dbInteger	Integer
dbLong	Long Integer
dbLongBinary	Binary (bitmap)
dbMemo	Memo (большой текст)
dbNumeric	Numeric (только для ODBCDirect)
dbSingle	С плавающей точкой обычной точности
dbText	Текст (переменной длины)
dbTime	Даты в формате времени (только для ODBCDirect)
dbTimeStamp	Даты в формате даты и времени (только для ODBCDirect)
dbVarBinary	Variable Binary (только для ODBCDirect)
Для любого объекта QueryDef при определении свойства Type может использоваться любая из следующих констант (все [image]):

Константа	Описание
dbQAction	Запрос на изменение
dbQAppend	Запрос на добавление записей
dbQCompound	Составной запрос (только в рабочей области ODBCDirect)
dbQCrosstab	Перекрестный запрос
dbQDDL	Управляющий запрос
dbQDelete	Запрос на удаление
dbQMakeTable	Запрос на создание таблицы
dbQProcedure	Процедура SQL, выполняющая сохраненную процедуру (только в рабочей области ODBCDirect)
dbQSelect	Запрос на выборку
dbQSetOperation	Запрос на операцию Set
dbQSPTBulk	Запрос, не возвращающий записи.
dbQSQLPassThrough	Запрос к серверу SQL
dbQUpdate	Запрос на обновление
Для любого объекта Recordset при определении свойства Type может использоваться любая из следующих констант (все [image]):

Константа	Тип объекта Recordset
dbOpenDynamic	Объект Recordset динамического типа (только в рабочей области ODBCDirect)
dbOpenDynaset	Динамический набор записей.
dbOpenForwardOnly	Статический набор записей с последовательным доступом.
dbOpenSnapshot	Статический набор записей.
dbOpenTable	Таблица (только в рабочей области Microsoft Jet).
Константы свойства UpdateOptions (все [image])

Константа	Описание
dbCriteriaKey	(По умолчанию). Использование в предложении WHERE только ключевого столбца (столбцов).
dbCriteriaModValues	Использование в предложении WHERE ключевого столбца (столбцов) и всех обновляемых столбцов.
dbCriteriaAllCols	Использование в предложении WHERE ключевого столбца (столбцов) и всех столбцов.
dbCriteriaTimeStamp	Использование только столбца штампа времени, если имеется (если столбец штампа времени отсутствует в результирующем наборе записей, возникает ошибка выполнения).
dbCriteriaDeleteInsert	Использование набора инструкций DELETE и INSERT для каждого изменяемого столбца.
dbCriteriaUpdate	(По умолчанию).  Использование инструкции UPDATE для каждого изменяемого столбца.
Константы аргумента порядок методов CompactDatabase и CreateDatabase (все [image])

Константа	Язык
dbLangGeneral	Английский, немецкий, французский, португальский, итальянский и современный испанский.
DbLangArabic	Арабский.
dbLangChineseSimplified	Упрощенный китайский.
DbLangChineseTraditional	Традиционный китайский.
dbLangCyrillic	Русский.
dbLangCzech	Чешский.
dbLangDutch	Голландский.
dbLangGreek	Греческий.
dbLangHebrew	Иврит.
dbLangHungarian	Венгерский.
dbLangIcelandic	Исландский.
dbLangJapanese	Японский.
dbLangKorean	Корейский.
dbLangNordic	Скандинавские языки.
DbLangNorwdan	Норвежский и датский.
DbLangPolish	Польский.
dbLangSlovenian	Словенский.
dbLangSpanish	Традиционный испанский.
dbLangSwedfin	Шведский и финский.
dbLangThai	Тайский.
dbLangTurkish	Турецкий
Константы аргумента параметры метода CompactDatabase (все [image])

Константа	Описание
dbDecrypt	Дешифрование базы данных при сжатии.
dbEncrypt	Шифрование базы данных при сжатии.
dbVersion10	Используется формат файла ядра базы данных Microsoft Jet версии 1.0.
dbVersion11	Формат файла ядра базы данных Microsoft Jet версии 1.1.
dbVersion20	Формат файла ядра базы данных Microsoft Jet версии 2.0.
dbVersion30	Формат файла ядра базы данных Microsoft Jet версии 3.0.
Константы аргумента параметры метода CreateDatabase (все [image])

Константа	Описание
dbEncrypt	Шифрование базы данных.
dbVersion10	Используется формат файла ядра базы данных Microsoft Jet версии 1.0.
dbVersion11	Формат файла ядра базы данных Microsoft Jet версии 1.1.
dbVersion20	Формат файла ядра базы данных Microsoft Jet версии 2.0.
dbVersion30	Формат файла ядра базы данных Microsoft Jet версии 3.0.
Константы аргумента тип метода CreateWorkspace

Для свойства Type любого объекта Workspace и свойства DefaultType объекта DBEngine используются следующие константы: (все [image])

Константа	Описание
dbUseODBC	Следующая рабочая область будет использовать механизм ODBCDirect.
dbUseJet	Следующая рабочая область будет использовать ядро Microsoft Jet.
Константы аргумента параметры метода Execute (все [image])

Константа	Описание
dbDenyWrite	Отказ в разрешении на запись для других пользователей (только в рабочей области Microsoft Jet).
dbInconsistent	Выполнение несогласованных обновлений (только в рабочей области Microsoft Jet).
dbConsistent	Выполнение согласованных обновлений (только в рабочей области Microsoft Jet).
dbSQLPassThrough	Выполнение запроса к серверу SQL.  Инструкция SQL передается для обработки на базу данных ODBC (только в рабочей области Microsoft Jet).
dbFailOnError	Отмена всех внесенных изменений при возникновении ошибки (только в рабочей области Microsoft Jet).
dbSeeChanges	Возникновение ошибки выполнения, если во время сеансе редактирования данные изменены другим пользователем (только в рабочей области Microsoft Jet).
dbRunAsync	Асинхронное выполнение запроса (только в рабочей области ODBCDirect).
dbExecDirect	Выполнение инструкции без предварительного вызова функции API ODBC SQLPrepare (только в рабочей области ODBCDirect).
Константа для необязательного аргумента метода Idle ( [image])

Константа	Описание
dbRefreshCache	Принудительно выполняются все отложенные операции записи на диск и обновление памяти из текущих файлов на диске.
Константы для необязательного аргумента метода MakeReplica (все [image])

Константа	Описание
dbRepMakePartial	Создание частичной реплики.
dbRepMakeReadOnly	Запрет изменения пользователями реплицируемых объектов в новой реплике.
Константы аргумента параметры методов OpenConnection и OpenDatabase (все [image])

Константа	Описание
dbDriverNoPrompt	Диспетчер драйвера ODBC использует строку подключения, определяемую аргументом подключение.  Если этих данных недостаточно, возникает перехватываемая ошибка.
dbDriverPrompt	Диспетчер драйвера открывает диалоговое окно ODBC Data Sources.  Строка подключения образуется из имени источника данных, которое пользователь выбирает в диалоговых окнах.
dbDriverComplete	Если указанная строка подключения содержит ключевое слово DSN, диспетчер драйвера ODBC использует строку из аргумента подключение.  В противном случае выполняются действия, аналогичные задаваемым константой dbDriverPrompt.
dbDriverCompleteRequired	Выполняются действия, аналогичные задаваемым константой dbDriverComplete, с тем лишь исключением, что драйвер отключает вывод приглашений на ввод сведений, не являющихся необходимыми для подключения.
Константы аргумента тип метода OpenRecordset (все [image])

Константа	Описание
dbOpenDynamic	Открытие объекта Recordset динамического типа (только в рабочей области ODBCDirect).
dbOpenDynaset	Открытие объекта Recordset типа динамического набора записей.
dbOpenForwardOnly	Открытие объекта Recordset типа статического набора записей с последовательным доступом.
dbOpenSnapshot	Открытие объекта Recordset типа статического набора записей.
dbOpenTable	Открытие табличного объекта Recordset (только в рабочей области ядра Microsoft Jet).
Константы аргумента блокировки метода OpenRecordset (все [image])

Константа	Описание
dbPessimistic	Использование жесткой блокировки.  Указатель набора записей использует нижний уровень блокировки, достаточный для запрета на обновление записи.
dbReadOnly	Указатель набора записей допускает только чтение.  Обновление не допускается.
dbOptimistic	Нежесткая блокировка с использованием идентификаторов записи.  Указатель набора записей сравнивает идентификаторы старой и новой записи, чтобы определить, была ли запись изменена после последнего доступа.
dbOptimisticValue	Нежесткая блокировка с использованием значений записи.  Указатель набора записей сравнивает значения данных в старой и новой записи, чтобы определить, была ли запись изменена после последнего доступа. (только в рабочей области ODBCDirect).
dbOptimisticBatch	Включение режима пакетного обновления с нежесткой блокировкой (только в рабочей области ODBCDirect).
Константы аргумента параметры метода OpenRecordset (все [image])

Константа	Описание
dbDenyWrite	Запрет другим пользователям изменять или добавлять записи в объекте Recordset (только в рабочей области Microsoft Jet).
dbDenyRead	Запрет другим пользователям на чтение данных в таблице (только для объектов Recordset типа таблицы в рабочей области Microsoft Jet).
dbReadOnly	Открытие объекта Recordset только для чтения (только в рабочей области Microsoft Jet).
dbAppendOnly	Пользователям разрешается только добавление новых записей в динамический набор записей и запрещается изменение или удаление существующих записей (только для объектов Recordset типа динамического набора записей в рабочей области Microsoft Jet).
dbInconsistent	Обновление всех полей динамического набора записей, даже если при этом затрагиваются другие записи (только для объектов Recordset типа динамического или статического набора записей в рабочей области Microsoft Jet).
dbConsistent	Обновление только тех полей динамического набора записей, при котором не затрагиваются другие записи (только для объектов Recordset типа динамического или статического набора записей в рабочей области Microsoft Jet).
dbSQLPassThrough	Передача инструкции SQL в базу данных ODBC (только для объектов Recordset типа статического набора записей в рабочей области Microsoft Jet).
dbForwardOnly	Создание объекта Recordset типа статического набора записей с последовательным доступом (только для объектов Recordset типа статического набора записей в рабочей области Microsoft Jet).
dbSeeChanges	Генерация ошибки выполнения, если один пользователь изменил данные, редактируемые другим пользователем (только для объектов Recordset типа динамического набора записей в рабочей области Microsoft Jet).
dbRunAsync	Запуск асинхронного запроса (только в рабочей области ODBCDirect).
dbExecDirect	Запуск запроса без предварительного вызова функции SQLPrepare ODBC (только в рабочей области ODBCDirect).
Константы аргумента параметр метода SetOption (все [image])

Константа	Параметр реестра
dbPageTimeout	PageTimeout
dbSharedAsyncDelay	SharedAsyncDelay
dbExclusiveAsyncDelay	ExclusiveAsyncDelay
dbLockRetry	LockRetry
dbUserCommitSync	UserCommitSync
dbImplicitCommitSync	ImplicitCommitSync
dbMaxBufferSize	MaxBufferSize
dbMaxLocksPerFile	MaxLocksPerFile
dbLockDelay	LockDelay
dbRecycleLVs	RecycleLVs
dbFlushTransactionTimeout	FlushTransactionTimeout
Константы аргумента обмен метода Synchronize (все [image])

Константа	Описание
dbRepExportChanges	Передача изменений из текущей базы данных в базу данных-получатель.
dbRepImportChanges	Прием изменений из адресуемой базы данных.
dbRepImpExpChanges	Двухсторонний обмен данными.
dbRepSyncInternet	Обмен данными между двумя файлами, подключенными через путь Internet.
Константы аргумента тип метода Update (все [image])

Константа	Константа
dbUpdateRegular	По умолчанию.  Предстоящие изменения не помещаются в буфер и записываются на диск немедленно.
dbUpdateBatch	Запись на диск всех предстоящих изменений из буфера обновления.
dbUpdateCurrentRecord	Запись на диск только предстоящих изменений текущей записи.
Константы аргумента тип метода CancelUpdate (все [image])

Константа	Константа
dbUpdateRegular	По умолчанию.  Предстоящие изменения не помещаются в буфер и записываются на диск немедленно.
dbUpdateBatch	Запись на диск всех предстоящих изменений из буфера обновления.


Объект Container, семейство Containers, пример

В данном примере выводится перечень компонентов семейства Containers базы данных "Борей" и семейства Properties каждого объекта Container в семействе.

Sub ContainerObjectX()

Dim dbsNorthwind As Database

Dim ctrLoop As Container

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Перечисление компонентов семейства Containers.

For Each ctrLoop In .Containers

Debug.Print "Свойства контейнера " & ctrLoop.Name

' Перечисление компонентов семейства Properties каждого

' объекта Container.

For Each prpLoop In ctrLoop.Properties

Debug.Print "    " & prpLoop.Name _

& " = " prpLoop

Next prpLoop

Next ctrLoop

.Close

End With

End Sub


Объект DBEngine, пример

В данном примере выводится перечень семейств в объекте DBEngine.  Дополнительные примеры см. в разделах справки для свойств и методов объекта DBEngine.

Sub DBEngineX()

Dim wrkLoop As Workspace

Dim prpLoop As Property

With DBEngine

Debug.Print "Свойства объекта DBEngine"

' Перечисление компонентов семейства Properties объекта

' DBEngine. Перехват свойств, значения которых

' являются недопустимыми в данном контексте.

For Each prpLoop In .Properties

On Error Resume Next

Debug.Print "    " & prpLoop.Name & " = " _

& prpLoop

On Error GoTo 0

Next prpLoop

Debug.Print "Семейство Workspaces объекта DBEngine"

' Перечисление компонентов семейства Workspaces

' объекта DBEngine.

For Each wrkLoop In .Workspaces

Debug.Print "    " & wrkLoop.Name

' Перечисление компонентов семейства Properties каждого

' объекта Workspace. Перехват свойств, значения которых

' являются недопустимыми в данном контексте.

For Each prpLoop In wrkLoop.Properties

On Error Resume Next

Debug.Print "        " & prpLoop.Name & _

" = " & prpLoop

On Error GoTo 0

Next prpLoop

Next wrkLoop

End With

End Sub


Объект Recordset типа динамического набора записей, пример

В данном примере открывается объект Recordset типа динамического набора записей.  Демонстрируется возможность обновления полей объекта.

Sub dbOpenDynasetX()

Dim dbsNorthwind As Database

Dim rstInvoices As Recordset

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstInvoices = _

dbsNorthwind.OpenRecordset("Счета", dbOpenDynaset)

With rstInvoices

Debug.Print "Динамический набор записей: " & .Name

If .Updatable Then

Debug.Print "    Обновляемые поля:"

' Перечисление компонентов семейства Fields объекта

' Recordset типа динамического набора записей.

' Печатаются только обновляемые поля.

For Each fldLoop In .Fields

If fldLoop.DataUpdatable Then

Debug.Print "        " & fldLoop.Name

End If

Next fldLoop

End If

.Close

End With

dbsNorthwind.Close

End Sub


Объект Field, семейство Fields, пример

В данном примере демонстрируется, какие свойства являются допустимыми для объекта Field в зависимости от того, где находится объект Field (например, в семействе Fields объекта TableDef, в семействе Fields объекта QueryDef и т.д.).  Для выполнения данной процедуры необходима процедура FieldOutput.

Sub FieldX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim fldTableDef As Field

Dim fldQueryDef As Field

Dim fldRecordset As Field

Dim fldRelation As Field

Dim fldIndex As Field

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

' Присваивает объектным переменным объект Field

' из разных семейств Fields.

Set fldTableDef = _

dbsNorthwind.TableDefs(0).Fields(0)

Set fldQueryDef =dbsNorthwind.QueryDefs(0).Fields(0)

Set fldRecordset = rstEmployees.Fields(0)

Set fldRelation =dbsNorthwind.Relations(0).Fields(0)

Set fldIndex = _

dbsNorthwind.TableDefs(0).Indexes(0).Fields(0)

' Печатает отчет.

FieldOutput "TableDef", fldTableDef

FieldOutput "QueryDef", fldQueryDef

FieldOutput "Recordset", fldRecordset

FieldOutput "Relation", fldRelation

FieldOutput "Index", fldIndex

rstEmployees.Close

dbsNorthwind.Close

End Sub

Sub FieldOutput(strTemp As String, fldTemp As Field)

' Отчет для FieldX.

Dim prpLoop As Property

Debug.Print "Допустимые свойства объекта Field в " & strTemp

' Перечисление компонентов семейства Properties

' переданного объекта Field.

For Each prpLoop In fldTemp.Properties

' Некоторые свойства могут оказаться недопустимыми

' в определенном контексте (например, свойство Value

' семейства Fields объекта TableDef). Любая попытка

' использовать недопустимое свойство приведет

' к возникновению ошибки.

On Error Resume Next

Debug.Print "    " & prpLoop.Name & " = " & _

prpLoop.Value

On Error GoTo 0

Next prpLoop

End Sub


Объект Group, семейство Groups и объект User, семейство Users, пример

В данном примере иллюстрируется использование объектов Group и User, а также семейств Groups и Users.  Вначале новый объект User создается и добавляется в семейство Users стандартного объекта Workspace.  Затем новый объект Group создается и добавляется в семейство Groups стандартного объекта Workspace.  Далее в программе пользователь Иван Иванов добавляется в группу "Подследственные".  И наконец, выводится перечень компонентов семейств Users и Groups стандартного объекта Workspace.  Дополнительные примеры см. в разделах справки для свойств и методов объектов Group и User.

Sub GroupX()

Dim wrkDefault As Workspace

Dim usrNew As User

Dim usrLoop As User

Dim grpNew As Group

Dim grpLoop As Group

Dim grpMember As Group

Set wrkDefault = DBEngine.Workspaces(0)

With wrkDefault

' Создает и добавляет нового пользователя.

Set usrNew = .CreateUser("Иван Иванов", _

"abc123DEF456", "Пароль1")

.Users.Append usrNew

' Создает и добавляет новую группу.

Set grpNew = .CreateGroup("Подследственные", _

"UVW987xyz654")

.Groups.Append grpNew

' Включает пользователя Иван Иванов в группу

' "Подследственные" и добавляет соответствующий

' объект Group в семейство Groups пользователя.

' Тот же результат можно получить, если объект User,

' представляющий пользователя с именем Иван Иванов,

' добавляется в семейство Users группы  "Подследственные".

Set grpMember = usrNew.CreateGroup("Подследственные")

usrNew.Groups.Append grpMember

Debug.Print "Семейство Users:"

' Перечисление все объектов User в семействе

' Users стандартной рабочей области.

For Each usrLoop In .Users

Debug.Print "    " & usrLoop.Name

Debug.Print "        Принадлежит к группам:"

' Перечисление все объектов Group в каждом семействе

' Groups объекта User.

If usrLoop.Groups.Count <> 0 Then

For Each grpLoop In usrLoop.Groups

Debug.Print "            " & _

grpLoop.Name

Next grpLoop

Else

Debug.Print "            [Отсутствует]"

End If

Next usrLoop

Debug.Print "Семейство Groups:"

' Перечисление все объектов Group в семействе

' Groups стандартной рабочей области.

For Each grpLoop In .Groups

Debug.Print "    " & grpLoop.Name

Debug.Print "        Содержит членов:"

' Перечисление все объектов User в каждом семействе

' Users объекта Group.

If grpLoop.Users.Count <> 0 Then

For Each usrLoop In grpLoop.Users

Debug.Print "            " & _

usrLoop.Name

Next usrLoop

Else

Debug.Print "            [Отсутствует]"

End If

Next grpLoop

' Удаляет новые объекты User и Group,

' созданные только для демонстрации.

.Users.Delete "Иван Иванов"

.Groups.Delete "Подследственные"

End With

End Sub


Объект Index, семейство Indexes, пример

В данном примере новый объект Index создается и добавляется в семейство Indexes объекта TableDef "Сотрудники".  Далее выводится перечень компонентов семейства Indexes объекта TableDef.  И наконец, в программе выводится перечень объекта Recordset, сначала с использованием первичного индекса, а затем с использованием нового индекса.  Для выполнения данной процедуры необходима процедура IndexOutput.

Sub IndexObjectX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim idxNew As Index

Dim idxLoop As Index

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind!Сотрудники

With tdfEmployees

' Создает новый индекс, создает и добавляет

' объекты Field в семейство Fields индекса.

Set idxNew = .CreateIndex("НовыйИндекс")

With idxNew

.Fields.Append .CreateField("Страна")

.Fields.Append .CreateField("Фамилия")

.Fields.Append .CreateField("Имя")

End With

' Добавляет новый объект Index в семейство Indexes

' таблицы "Сотрудники".

.Indexes.Append idxNew

.Indexes.Refresh

Debug.Print .Indexes.Count & " Индексы в " & _

.Name & " TableDef"

' Перечисление компонентов семейства Indexes

' таблицы "Сотрудники".

For Each idxLoop In .Indexes

Debug.Print "    " & idxLoop.Name

Next idxLoop

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

' Печатает отчет с использованием старого и нового индексов.

IndexOutput rstEmployees, "PrimaryKey"

IndexOutput rstEmployees, idxNew.Name

rstEmployees.Close

' Удаляет новый объект Index,

' созданный только для демонстрации.

.Indexes.Delete idxNew.Name

End With

dbsNorthwind.Close

End Sub

Sub IndexOutput(rstTemp As Recordset, _

strIndex As String)

' Отчет для IndexObjectX.

With rstTemp

' Задает индекс.

.Index = strIndex

.MoveFirst

Debug.Print "Recordset = " & .Name & _

", Index = " & .Index

Debug.Print "    КодСотрудника - Страна - Name"

' Перебирает компоненты набора записей с использованием

' указанного индекса.

Do While Not .EOF

Debug.Print "    " & !КодСотрудника & " - " & _

!Страна & " - " & !Фамилия & ", " & !Имя

.MoveNext

Loop

End With

End Sub


Объект Parameter, семейство Parameters, пример

В данном примере демонстрируется объект Parameter и семейство Parameters.  Создается объект QueryDef и загружаются данные, зависящие от изменения семейства Parameters объекта QueryDef.  Для выполнения данной процедуры необходима процедура ParametersChange.

Sub ParameterX()

Dim dbsNorthwind As Database

Dim qdfReport As QueryDef

Dim prmBegin As Parameter

Dim prmEnd As Parameter

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает временный объект QueryDef с двумя

' параметрами.

Set qdfReport = dbsNorthwind.CreateQueryDef("", _

"PARAMETERS dteBegin DateTime, dteEnd DateTime; " & _

"SELECT КодСотрудника, COUNT(КодЗаказа) AS ЧислоЗаказов " & _

"FROM Заказы WHERE ДатаИсполнения BETWEEN " & _

"[dteBegin] AND [dteEnd] GROUP BY КодСотрудника " & _

"ORDER BY КодСотрудника")

Set prmBegin = qdfReport.Parameters!dteBegin

Set prmEnd = qdfReport.Parameters!dteEnd

' Печатает отчет с использованием указанных значений параметров.

ParametersChange qdfReport, prmBegin, #1/1/95#, _

prmEnd, #6/30/95#

ParametersChange qdfReport, prmBegin, #7/1/95#, _

prmEnd, #12/31/95#

dbsNorthwind.Close

End Sub

Sub ParametersChange(qdfTemp As QueryDef, _

prmFirst As Parameter, dteFirst As Date, _

prmLast As Parameter, dteLast As Date)

' Отчет для ParameterX.

Dim rstTemp As Recordset

Dim fldLoop As Field

' Задает значения параметров о открывает набор записей

' с использованием временного объекта QueryDef.

prmFirst = dteFirst

prmLast = dteLast

Set rstTemp = _

qdfTemp.OpenRecordset(dbOpenForwardOnly)

Debug.Print "От " & dteFirst & " до " & dteLast

' Перебирает компоненты набора записей.

Do While Not rstTemp.EOF

' Перечисление компонентов семейства Fields объекта Recordset.

For Each fldLoop In rstTemp.Fields

Debug.Print " - " & fldLoop.Name & " = " & fldLoop;

Next fldLoop

Debug.Print

rstTemp.MoveNext

Loop

rstTemp.Close

End Sub


Объект Property, семейство Properties, пример

В данном примере создается определяемое пользователем свойство текущей базы данных, для него определяются свойства Type и Value, после чего свойство добавляется в семейство Properties базы данных.  Далее в программе выводится перечень всех свойств базы данных.  Дополнительные примеры см. в разделах справки для свойств объекта

Sub PropertyX()

Dim dbsNorthwind As Database

Dim prpNew As Property

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Создает и добавляет определяемое пользователем свойство.

Set prpNew = .CreateProperty()

prpNew.Name = "ОпределяемоеПользователем"

prpNew.Type = dbText

prpNew.Value = "Это свойство определено пользователем."

.Properties.Append prpNew

' Выводит перечень всех свойств текущей базы данных.

Debug.Print "Свойства " & .Name

For Each prpLoop In .Properties

With prpLoop

Debug.Print "    " & .Name

Debug.Print "        Тип: " & .Type

Debug.Print "        Значение: " & .Value

Debug.Print "        Наследуемое: " & _

.Inherited

End With

Next prpLoop

' Удаляет новое свойство,

' созданное только для демонстрации.

.Properties.Delete "ОпределяемоеПользователем"

End With

End Sub


Объект QueryDef, семейство QueryDefs, пример

В данном примере новый объект QueryDef создается и добавляется в семейство QueryDefs объекта Database "Борей".  Далее в программе выводится перечень всех компонентов семейства QueryDefs и семейства Properties нового объекта QueryDef.

Sub QueryDefX()

Dim dbsNorthwind As Database

Dim qdfNew As QueryDef

Dim qdfLoop As QueryDef

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает новый объект QueryDef. Так как этот объект

' получает имя, оно автоматически добавляется

' в семейство QueryDefs.

Set qdfNew = dbsNorthwind.CreateQueryDef("НовыйЗапрос", _

"SELECT * FROM Типы")

With dbsNorthwind

Debug.Print .QueryDefs.Count & _

" Объекты QueryDefs в " & .Name

' Перечисление компонентов семейства QueryDefs.

For Each qdfLoop In .QueryDefs

Debug.Print "    " & qdfLoop.Name

Next qdfLoop

With qdfNew

Debug.Print "Свойства " & .Name

' Перечисление компонентов семейства Properties

' нового объекта QueryDef.

For Each prpLoop In .Properties

On Error Resume Next

Debug.Print "    " & prpLoop.Name & " - " & _

IIf(prpLoop = "", "[empty]", prpLoop)

On Error Goto 0

Next prpLoop

End With

' Удаляет новый объект QueryDef,

' созданный только для демонстрации.

.QueryDefs.Delete qdfNew.Name

.Close

End With

End Sub


Объект Recordset, семейство Recordsets, пример

В данном примере демонстрируется объект Recordset и семейство Recordsets.  Открываются объекты Recordsets разных типов, выводится перечень компонентов семейства Recordsets текущего объекта Database, а затем выводится перечень компонентов семейства Properties каждого объекта Recordset.

Sub RecordsetX()

Dim dbsNorthwind As Database

Dim rstTable As Recordset

Dim rstDynaset As Recordset

Dim rstSnapshot As Recordset

Dim rstForwardOnly As Recordset

Dim rstLoop As Recordset

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Открывает объекты Recordset разных типов.

Set rstTable = .OpenRecordset("Типы", _

dbOpenTable)

Set rstDynaset = .OpenRecordset("Сотрудники", _

dbOpenDynaset)

Set rstSnapshot = .OpenRecordset("Поставщики", _

dbOpenSnapshot)

Set rstForwardOnly = .OpenRecordset _

("Сотрудники", dbOpenForwardOnly)

Debug.Print "Объекты Recordset в семействе Recordsets " & _

"базы данных dbsNorthwind"

' Перечисление компонентов семейства Recordsets.

For Each rstLoop In .Recordsets

With rstLoop

Debug.Print "    " & .Name

' Перечисление компонентов семейства Properties

' каждого объекта Recordset. Перехват любых свойств,

' значения которых являются недопустимыми в данном

' контексте.

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print _

"        " & prpLoop.Name & _

" = " & prpLoop

On Error GoTo 0

Next prpLoop

End With

Next rstLoop

rstTable.Close

rstDynaset.Close

rstSnapshot.Close

rstForwardOnly.Close

.Close

End With

End Sub


Объект Relation, семейство Relations, пример

В данном примере демонстрируется управление вводом данных с помощью существующего объекта Relation.  В процедуре делается попытка добавления записи с заведомо неверным значением поля "КодТипа"; это приводит к запуску процедуры обработки ошибок.

Sub RelationX()

Dim dbsNorthwind As Database

Dim rstProducts As Recordset

Dim prpLoop As Property

Dim fldLoop As Field

Dim errLoop As Error

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstProducts = dbsNorthwind.OpenRecordset("Товары")

' Печатает отчет, демонстрирующий различные компоненты

' связи и место сохранения каждого компонента.

With dbsNorthwind.Relations!ТипыТовары

Debug.Print "Свойства связи " & .Name

Debug.Print "    Table = " & .Table

Debug.Print "    ForeignTable = " & .ForeignTable

Debug.Print "Связующие поля" & .Name &

With .Fields!КодТипа

Debug.Print "    " & .Name

Debug.Print "        Name = " & .Name

Debug.Print "        ForeignName = " & .ForeignName

End With

End With

' Попытка добавить запись, противоречащую связи.

With rstProducts

.AddNew

!ProductName = "Слеза комсомолки"

!КодТипа = 10

On Error GoTo Err_Relation

.Update

On Error GoTo 0

.Close

End With

dbsNorthwind.Close

Exit Sub

Err_Relation:

' Предупреждает пользователя об ошибке

' из-за недопустимых данных.

If DBEngine.Errors.Count > 0 Then

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & _

vbCr & errLoop.Description

Next errLoop

End If

Resume Next

End Sub


Статический объект Recordset, пример

В данном примере открывается объект Recordset типа статического набора записей, и демонстрируется, что он допускает только чтение.

Sub dbOpenSnapshotX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenSnapshot)

With rstEmployees

Debug.Print "Статический набор записей: " & _

.Name

' Перечисление компонентов семейства Properties

' статического объекта Recordset. Перехват любых свойств,

' значения которых являются недопустимыми в данном

' контексте.

For Each prpLoop In .Properties

On Error Resume Next

Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error Goto 0

Next prpLoop

.Close

End With

dbsNorthwind.Close

End Sub


Табличный объект Recordset, пример

В данном примере открывается табличный объект Recordset, для которого задается значение свойства Index и выводится перечень записей.

Sub dbOpenTableX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' dbOpenTable является значением по умолчанию.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

Debug.Print "Табличный объект Recordset: " & .Name

' Использует ранее определенный индекс.

.Index = "Фамилия"

Debug.Print "    Индекс = " & .Index

' Выводит перечень записей.

Do While Not .EOF

Debug.Print "        " & !Фамилия & ", " & _

!Имя

.MoveNext

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Объект TableDef, семейство TableDefs, пример

В данном примере новый объект TableDef создается и добавляется в семейство TableDefs объекта Database "Борей".  Далее в программе выводится перечень компонентов семейства TableDefs и семейства Properties нового объекта TableDef.

Sub TableDefX()

Dim dbsNorthwind As Database

Dim tdfNew As TableDef

Dim tdfLoop As TableDef

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает новый объект TableDef, добавляет объект Field

' в его семейство Fields, а затем добавляет объект TableDef

' в семейство TableDefs объекта Database.

Set tdfNew = dbsNorthwind.CreateTableDef("НовыйОбъектTableDef")

tdfNew.Fields.Append tdfNew.CreateField("Дата", dbDate)

dbsNorthwind.TableDefs.Append tdfNew

With dbsNorthwind

Debug.Print .TableDefs.Count & _

"Объекты TableDefs в " & .Name

' Перечисление компонентов семейства TableDefs.

For Each tdfLoop In .TableDefs

Debug.Print "    " & tdfLoop.Name

Next tdfLoop

With tdfNew

Debug.Print "Свойства " & .Name

' Перечисление компонентов семейства Properties нового

' объекта TableDef. Печатаются только свойства

' с непустыми значениями.

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " - " & _

IIf(prpLoop = "", "[empty]", prpLoop)

Next prpLoop

End With

' Удаляет новый объект TableDef,

' созданный только для демонстрации.

.TableDefs.Delete tdfNew.Name

.Close

End With

End Sub


Объект Connection, семейство Connections, пример

Следующая программа для демонстрации объекта Connection и семейства Connections открывает объект Database Microsoft Jet и два объекта Connection ODBCDirect, а затем печатает список свойств каждого объекта.

Sub ConnectionObjectX()

Dim wrkJet as Workspace

Dim dbsNorthwind As Database

Dim wrkODBC As Workspace

Dim conPubs As Connection

Dim conPubs2 As Connection

Dim conLoop As Connection

Dim prpLoop As Property

' Открывает объект Database Microsoft Jet.

Set wrkJet = CreateWorkspace("NewJetWorkspace", _

"admin", "", dbUseJet)

Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

' Создает объект Workspace ODBCDirect и открывает

' объекты Connection.

Set wrkODBC = CreateWorkspace("NewODBCWorkspace", _

"admin", "", dbUseODBC)

Set conPubs = wrkODBC.OpenConnection("Connection1", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

Set conPubs2 = wrkODBC.OpenConnection("Connection2", , _

True, "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

Debug.Print "Свойства объекта Database:"

With dbsNorthwind

' Отображает семейство Properties объекта Database.

For Each prpLoop In .Properties

On Error Resume Next

Debug.Print "    " & prpLoop.Name & " = " & _

prpLoop.Value

On Error GoTo 0

Next prpLoop

End With

' Отображает семейство Connections.

For Each conLoop In wrkODBC.Connections

Debug.Print "Свойства объекта Connection " & _

conLoop.Name & ":"

With conLoop

' Печатает значения свойств, вызывая явным образом

' каждый объект Property; объект Connection

' не поддерживает семейство Properties.

Debug.Print "    Connect = " & .Connect

' Свойство фактически возвращает объект Database.

Debug.Print "    Database[.Name] = " & _

.Database.Name

Debug.Print "    Name = " & .Name

Debug.Print "    QueryTimeout = " & .QueryTimeout

Debug.Print "    RecordsAffected = " & _

.RecordsAffected

Debug.Print "    StillExecuting = " & _

.StillExecuting

Debug.Print "    Transactions = " & .Transactions

Debug.Print "    Updatable = " & .Updatable

End With

Next conLoop

dbsNorthwind.Close

conPubs.Close

conPubs2.Close

wrkJet.Close

wrkODBC.Close

End Sub


Объект Database, семейство Databases, пример

Следующая программа создает объект Database и открывает существующий объект Database в стандартном объекте Workspace.  Затем печатается семейство Databases и семейство Properties каждого объекта Database.  Другие примеры см. в разделах справки для объекта Database.

Sub DatabaseObjectX()

Dim wrkJet As Workspace

Dim dbsNorthwind As Database

Dim dbsNew As Database

Dim dbsLoop As Database

Dim prpLoop As Property

Set wrkJet = CreateWorkspace("JetWorkspace", "admin", _

"", dbUseJet)

' Проверяет, что нет файла, имя которого совпадает с именем

' новой базы данных.

If Dir("NewDB.mdb") <> "" Then Kill "NewDB.mdb"

' Создает новую базу данных с указанной

' языковой настройкой.

Set dbsNew = wrkJet.CreateDatabase("NewDB.mdb", _

dbLangGeneral)

Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

' Отображает семейство Databases.

For Each dbsLoop In wrkJet.Databases

With dbsLoop

Debug.Print "Свойства " & .Name

' Отображает семейство Properties каждого

' объекта Database.

For Each prpLoop In .Properties

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

Next prpLoop

End With

Next dbsLoop

dbsNew.Close

dbsNorthwind.Close

wrkJet.Close

End Sub


Объект Document, семейство Documents, пример

Следующая программа печатает семейство Documents контейнера Tables, а затем печатает семейство Properties первого объекта Document в семействе.

Sub DocumentX()

Dim dbsNorthwind As Database

Dim docLoop As Document

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind.Containers!Tables

Debug.Print "Документы в контейнере " & .Name

' Отображает семейство Documents контейнера Tables.

For Each docLoop In .Documents

Debug.Print "    " & docLoop.Name

Next docLoop

With .Documents(0)

' Отображает семейство Properties первого

' объекта Document в контейнере Tables.

Debug.Print "Свойства документа " & .Name

On Error Resume Next

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " = " & _

prpLoop

Next prpLoop

On Error GoTo 0

End With

End With

dbsNorthwind.Close

End Sub


Объект Recordset динамического типа, пример

Следующая программа открывает объект Recordset динамического типа и просматривает все его записи.

Sub dbOpenDynamicX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim qdfTemp As QueryDef

Dim rstTemp As Recordset

Dim strSQL As String

Dim intLoop As Integer

' Создает рабочую область ODBC и открывает

' подключение к базе данных SQL Server.

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Открывает набор записей динамического типа.

Set rstTemp = _

conMain.OpenRecordset("authors", _

dbOpenDynamic)

With rstTemp

Debug.Print "Набор записей динамического типа: " & .Name

' Печатает записи.

Do While Not .EOF

Debug.Print "        " & !au_lname & ", " & _

!au_fname

.MoveNext

Loop

.Close

End With

conMain.Close

wrkMain.Close

End Sub


Объект Recordset с последовательным доступом, пример

Следующая программа открывает объект Recordset типа статического набора записей с последовательным доступом, демонстрирует его доступность только для чтения, а затем осуществляет проход по объекту Recordset с помощью метода MoveNext.

Sub dbOpenForwardOnlyX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Открывает набор записей с последовательным доступом.

' Для перемещения по этому объекту Recordset могут

' использоваться только методы MoveNext и Move.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenForwardOnly)

With rstEmployees

Debug.Print "Набора записей с последовательным доступом: " & _

.Name & ", Updatable = " & .Updatable

Debug.Print "    Field - DataUpdatable"

' Отображает семейство Fields, печатает свойства Name

' и DataUpdatable каждого объекта Field.

For Each fldLoop In .Fields

Debug.Print "        " & _

fldLoop.Name & " - " & fldLoop.DataUpdatable

Next fldLoop

Debug.Print "    Данные"

' Печатает данные из набора записей.

Do While Not .EOF

Debug.Print "        " & !Имя & " " & _

!Фамилия

.MoveNext

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Объект Workspace, семейство Workspaces, пример

Следующая программа создает новый объект Workspace Microsoft Jet и новый объект Workspace ODBCDirect, а затем добавляет их в семейство Workspaces.  Далее печатается семейство Workspaces и семейство Properties каждого объекта Workspace. Другие примеры см. в разделах справки для объекта Workspace и семейства Workspaces.

Sub WorkspaceX()

Dim wrkNewJet As Workspace

Dim wrkNewODBC As Workspace

Dim wrkLoop As Workspace

Dim prpLoop As Property

' Создает новую рабочую область Microsoft Jet.

Set wrkNewJet = CreateWorkspace("NewJetWorkspace", _

"admin", "", dbUseJet)

Workspaces.Append wrkNewJet

' Создает новую рабочую область ODBCDirect.

Set wrkNewODBC = CreateWorkspace("NewODBCWorkspace", _

"admin", "", dbUseODBC)

Workspaces.Append wrkNewODBC

' Отображает семейство Workspaces.

For Each wrkLoop In Workspaces

With wrkLoop

Debug.Print "Свойства " & .Name

' Отображает семейство Properties нового

' объекта Workspace.

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

End With

Next wrkLoop

wrkNewJet.Close

wrkNewODBC.Close

End Sub


Метод AddNew, пример

Следующая программа использует метод AddNew для создания новой записи с указанными данными.  Для выполнения этой процедуры требуется функция AddName.

Sub AddNewX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strFirstName As String

Dim strLastName As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", dbOpenDynaset)

' Принимает данные от пользователя.

strFirstName = Trim(InputBox( _

"Введите имя:"))

strLastName = Trim(InputBox( _

"Введите фамилию:"))

' Продолжает выполнение, только если пользователь ввел

' данные для имени и фамилии.

If strFirstName <> "" and strLastName <> "" Then

' Вызывает функцию, добавляющую запись.

AddName rstEmployees, strFirstName, strLastName

' Отображает добавленные данные.

With rstEmployees

Debug.Print "Новая запись: " & !Имя & _

" " & !Фамилия

' Удаляет новую запись, созданную только для демонстрации.

.Delete

End With

Else

Debug.Print _

"Необходимо ввести строки для имени и фамилии!"

End If

rstEmployees.Close

dbsNorthwind.Close

End Sub

Function AddName(rstTemp As Recordset, _

strFirst As String, strLast As String)

' Добавляет новую запись в объект Recordset, используя данные,

' переданные вызывающей процедурой. Затем новая запись

' делается текущей записью.

With rstTemp

.AddNew

!Имя = strFirst

!Фамилия = strLast

.Update

.Bookmark = .LastModified

End With

End Function


Методы Append и Delete, пример

В следующей программе метод Append или Delete используется для изменения семейства Fields объекта TableDef.  Для выполнения этой процедуры требуется процедура AppendDeleteField.

Sub AppendX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind.TableDefs!Сотрудники

' Добавляет три новых поля.

AppendDeleteField tdfEmployees, "APPEND", _

"E-mail", dbText, 50

AppendDeleteField tdfEmployees, "APPEND", _

"Http", dbText, 80

AppendDeleteField tdfEmployees, "APPEND", _

"Quota", dbInteger, 5

Debug.Print "Поля после вызова Append"

Debug.Print , "Тип", "Размер", "Имя"

' Перечисление семейства Fields, демонстрирующее новые поля.

For Each fldLoop In tdfEmployees.Fields

Debug.Print , fldLoop.Type, fldLoop.Size, fldLoop.Name

Next fldLoop

' Удаляет добавленные поля.

AppendDeleteField tdfEmployees, "DELETE", "E-mail"

AppendDeleteField tdfEmployees, "DELETE", "Http"

AppendDeleteField tdfEmployees, "DELETE", "Quota"

Debug.Print "Поля после вызова Delete"

Debug.Print , "Тип", "Размер", "Имя"

' Перечисление семейства Fields, демонстрирующее,

' что новые поля были удалены.

For Each fldLoop In tdfEmployees.Fields

Debug.Print , fldLoop.Type, fldLoop.Size, fldLoop.Name

Next fldLoop

dbsNorthwind.Close

End Sub

Sub AppendDeleteField(tdfTemp As TableDef, _

strCommand As String, strName As String, _

Optional varType, Optional varSize)

With tdfTemp

' Сначала проверяет, является ли объект TableDef

'  обновляемым. Если нет, управление возвращается

' в вызывающую процедуру.

If .Updatable = False Then

MsgBox "Необновляемый объект TableDef! " & _

"Выполнение задачи невозможно."

Exit Sub

End If

' В зависимости от переданных данных, добавляет

' или удаляет поле из семейства Fields указанного

' объекта TableDef.

If strCommand = "APPEND" Then

.Fields.Append .CreateField(strName, _

varType, varSize)

Else

If strCommand = "DELETE" Then .Fields.Delete _

strName

End If

End With

End Sub


Методы AppendChunk и GetChunk, пример

Следующая программа использует методы AppendChunk и GetChunk для заполнения поля объекта данными из другой записи, добавляемыми порциями по 32K.  В действующем приложении подобная процедура может использоваться для копирования записи о сотруднике (включая фотографию сотрудника) из одной таблицы в другую.  В данном примере запись просто копируется в ту же таблицу.  Отметим, что все действия с порциями данных выполняются в рамках одной последовательности AddNew-Update.

Sub AppendChunkX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim rstEmployees2 As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Открывает два набора записей для таблицы "Сотрудники".

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

Set rstEmployees2 = rstEmployees.Clone

' Добавляет новую запись в первый объект Recordset и

' копирует данные из записи во второй объект Recordset.

With rstEmployees

.AddNew

!Имя = rstEmployees2!Имя

!Фамилия = rstEmployees2!Фамилия

CopyLargeField rstEmployees2!Фотография, !Фотография

.Update

' Удаляет новую запись, созданную только для демонстрации.

.Bookmark = .LastModified

.Delete

.Close

End With

rstEmployees2.Close

dbsNorthwind.Close

End Sub

Function CopyLargeField(fldSource As Field, _

fldDestination As Field)

' Задает размер порции данных в байтах.

Const conChunkSize = 32768

Dim lngOffset As Long

Dim lngTotalSize As Long

Dim strChunk As String

' Копирует фото из одного объекта Recordset в другой

' порциями по 32K, пока не будет скопировано все поле.

lngTotalSize = fldSource.FieldSize

Do While lngOffset < lngTotalSize

strChunk = fldSource.GetChunk(lngOffset, conChunkSize)

fldDestination.AppendChunk strChunk

lngOffset = lngOffset + conChunkSize

Loop

End Function


Методы BeginTrans, CommitTrans и Rollback, пример

Следующая программа изменяет в таблице "Сотрудники" название должности всех коммерческих представителей.  После запуска с помощью метода BeginTrans транзакции, в которой выделяются все изменения, вносимые в таблицу "Сотрудники", метод CommitTrans вызывается для сохранения изменений.  Отметим, что метод Rollback позволяет отменить все изменения, занесенные с помощью метода Update.  Более того, главная транзакция является вложенной в другую транзакцию, которая автоматически отменяет любые изменения, внесенные пользователем при работе с данным примером.

Пока пользователь решает, стоит или нет сохранять изменения, одна или несколько страниц таблицы остаются заблокированными. Поэтому данный прием не может быть рекомендован для использования и приводится только для иллюстрации.

Sub BeginTransX()

Dim strName As String

Dim strMessage As String

Dim wrkDefault As Workspace

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

' Определяет стандартный объект Workspace.

Set wrkDefault = DBEngine.Workspaces(0)

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

' Запускает внешнюю транзакцию.

wrkDefault.BeginTrans

' Запускает главную транзакцию.

wrkDefault.BeginTrans

With rstEmployees

' Выполняет цикл по набору записей и спрашивает пользователя,

' следует ли изменять должность конкретного сотрудника.

Do Until .EOF

If !Должность = "Коммерческий представитель" Then

strName = !Фамилия & ", " & !Имя

strMessage = "Сотрудник: " & strName & vbCr & _

"Изменение должности"

' Изменяет должность указанного сотрудника.

If MsgBox(strMessage, vbYesNo) = vbYes Then

.Edit

!Должность = "Счетовод"

.Update

End If

End If

.MoveNext

Loop

' Запрашивает пользователя, следует ли занести

' все ранее сделанные изменения.

If MsgBox("Сохранить все изменения?", vbYesNo) = vbYes Then

wrkDefault.CommitTrans

Else

wrkDefault.Rollback

End If

' Печатает текущие данные из набора записей.

.MoveFirst

Do While Not .EOF

Debug.Print !Фамилия & ", " & !Имя & _

" - " & !Должность

.MoveNext

Loop

' Отменяет все изменения, внесенные пользователем,

' поскольку программа предназначена только для демонстрации.

wrkDefault.Rollback

.Close

End With

dbsNorthwind.Close

End Sub


Метод Clone, пример

Следующая программа использует метод Clone для создания копии объекта Recordset, после чего позволяет пользователю независимо установить указатель записи в каждой копии.

Sub CloneX()

Dim dbsNorthwind As Database

Dim arstProducts(1 To 3) As Recordset

Dim intLoop As Integer

Dim strMessage As String

Dim strFind As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Если предполагается часть использовать инструкцию SQL,

' создание постоянного объекта QueryDef позволит

' увеличить быстродействие.

Set arstProducts(1) = dbsNorthwind.OpenRecordset( _

"SELECT Марка FROM Товары " & _

"ORDER BY Марка", dbOpenSnapshot)

' Создает две копии исходного объекта Recordset.

Set arstProducts(2) = arstProducts(1).Clone

Set arstProducts(3) = arstProducts(1).Clone

Do While True

' Выполняет цикл по массиву, в котором на каждом

' проходе ищется другая копия того же объекта

' Recordset.

For intLoop = 1 To 3

' Приглашает ввести строку поиска, показывая положение

' указателя текущей записи для каждого объекта Recordset.

strMessage = _

"Объекты Recordset для таблицы 'Товары':" & vbCr & _

"  1 - Оригинал - Указатель записи на " & _

arstProducts(1)!Марка & vbCr & _

"  2 - Копия - Указатель записи на " & _

arstProducts(2)!Марка & vbCr & _

"  3 - Копия - Указатель записи на " & _

arstProducts(3)!Марка & vbCr & _

"Введите строку поиска для #" & intLoop & ":"

strFind = Trim(InputBox(strMessage))

If strFind = "" Then Exit Do

' Находит строку поиска; при отсутствии совпадения

' переходит на последнюю запись.

With arstProducts(intLoop)

.FindFirst "Марка >= '" & strFind & "'"

If .NoMatch Then .MoveLast

End With

Next intLoop

Loop

arstProducts(1).Close

arstProducts(2).Close

arstProducts(3).Close

dbsNorthwind.Close

End Sub


Метод Close, пример

Следующая программа использует метод Close для закрытия объектов Recordset и Database.  Демонстрируется также потеря несохраненных изменений при закрытии объекта Recordset.

Sub CloseX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

' Вносит изменения в запись, но закрывает набор записей

' до сохранения изменений.

With rstEmployees

Debug.Print "Исходные данные"

Debug.Print "    Имя - Телефон"

Debug.Print "    " & !Имя & " " & _

!Фамилия & " - " & !Телефон

.Edit

!Телефон = "9999"

.Close

End With

' Повторно открывает объект Recordset, чтобы показать,

' что данные не были изменены.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

Debug.Print "После вызова метода Close"

Debug.Print "    Имя - Телефон"

Debug.Print "    " & !Имя & " " & _

!Фамилия & " - " & !Телефон

.Close

End With

dbsNorthwind.Close

End Sub


Метод CompactDatabase, пример

Следующая программа использует метод CompactDatabase для изменения порядка символов, используемого при сравнении текстовых строк или при сортировке в базе данных.  Не допускается использование данной программы в модуле, принадлежащем базе данных Борей.mdb.

Sub CompactDatabaseX()

Dim dbsNorthwind As Database

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Отображает свойства исходной базы данных.

With dbsNorthwind

Debug.Print .Name & ", версия " & .Version

Debug.Print "    Порядок символов = " & .CollatingOrder

.Close

End With

' Проверяет наличие файла, имеющего имя, которое

' будет присвоено сжатой базе данных.

If Dir("БорейКорея.mdb") <> "" Then _

Kill "БорейКорея.mdb"

' Создает сжатую копию базы данных "Борей",

' в которой используется порядок символов

' корейского языка.

DBEngine.CompactDatabase "Борей.mdb", _

"БорейКорея.mdb", dbLangKorean

Set dbsNorthwind = OpenDatabase("БорейКорея.mdb")

' Отображает свойства сжатой базы данных.

With dbsNorthwind

Debug.Print .Name & ", версия " & .Version

Debug.Print "    Порядок символов = " & .CollatingOrder

.Close

End With

End Sub

Следующая программа использует метод CompactDatabase для изменения версии базы данных.  Для запуска этой программы необходимо иметь базу данных версии Microsoft Jet 1.1 с именем Nwind11.mdb.  Не допускается использование данной программы в модуле, принадлежащем базе данных Nwind11.mdb.

Sub CompactDatabaseX2()

Dim dbsNorthwind As Database

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Nwind11.mdb")

' Отображает свойства исходной базы данных.

With dbsNorthwind

Debug.Print .Name & ", версия " & .Version

Debug.Print "    Порядок символов = " & .CollatingOrder

.Close

End With

' Проверяет наличие файла, имеющего имя, которое

' будет присвоено сжатой базе данных.

If Dir("Nwind20.mdb") <> "" Then _

Kill "Nwind20.mdb"

' Создает сжатую и зашифрованную базу данных версии

' Microsoft Jet 2.0 из базы данных Microsoft Jet

' версии 1.1.

DBEngine.CompactDatabase "Nwind11.mdb", _

"Nwind20.mdb", , dbEncrypt + dbVersion20

Set dbsNorthwind = OpenDatabase("Nwind20.mdb")

' Отображает свойства сжатой базы данных.

With dbsNorthwind

Debug.Print .Name & ", версия " & .Version

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

.Close

End With

End Sub


Метод CreateDatabase, пример

Следующая программа с помощью метода CreateDatabase создает новый зашифрованный объект Database.

Sub CreateDatabaseX()

Dim wrkDefault As Workspace

Dim dbsNew As DATABASE

Dim prpLoop As Property

' Определяет стандартный объект Workspace.

Set wrkDefault = DBEngine.Workspaces(0)

' Проверяет наличие файла, имеющего имя, которое

' будет присвоено новой базе данных.

If Dir("NewDB.mdb") <> "" Then Kill "NewDB.mdb"

' Создает новую зашифрованную базу данных

' с указанным используемым порядком символов.

Set dbsNew = wrkDefault.CreateDatabase("NewDB.mdb", _

dbLangGeneral, dbEncrypt)

With dbsNew

Debug.Print "Свойства " & .Name

' Отображает семейство Properties нового

' объекта Database.

For Each prpLoop In .Properties

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

Next prpLoop

End With

dbsNew.Close

End Sub


Метод CreateField, пример

Следующая программа использует метод CreateField для создания трех объектов Field в новом объекте TableDef.  Далее отображаются свойства объектов Field, которые автоматически задаются в методе CreateField.  (Свойства, значения которых остаются пустыми при создании объектов Field, не отображаются).

Sub CreateFieldX()

Dim dbsNorthwind As Database

Dim tdfNew As TableDef

Dim fldLoop As Field

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfNew = dbsNorthwind.CreateTableDef("NewTableDef")

' Создает и добавляет новый объект Field

' в новый объект TableDef.

With tdfNew

' Метод CreateField задает стандартный размер для нового

' объекта Field, если размер не указан.

.Fields.Append .CreateField("ТекстовоеПоле", dbText)

.Fields.Append .CreateField("ЦелоеПоле", dbInteger)

.Fields.Append .CreateField("ПолеДаты", dbDate)

End With

dbsNorthwind.TableDefs.Append tdfNew

Debug.Print "Свойства новых полей в " & tdfNew.Name

' Отображает семейство Fields, чтобы показать свойства

' новых объектов Field.

For Each fldLoop In tdfNew.Fields

Debug.Print "    " & fldLoop.Name

For Each prpLoop In fldLoop.Properties

' Свойства, недопустимые в контексте семейства

' TableDefs вызовут ошибку при попытке

' прочитать их значения.

On Error Resume Next

Debug.Print "        " & prpLoop.Name & " - " & _

IIf(prpLoop = "", "[empty]", prpLoop)

On Error GoTo 0

Next prpLoop

Next fldLoop

' Удаляет объект TableDef, созданный только для демонстрации.

dbsNorthwind.TableDefs.Delete tdfNew.Name

dbsNorthwind.Close

End Sub


Метод CreateIndex, пример

Следующая программа использует метод CreateIndex для создания двух новых объектов Index, а затем добавляет их в семейство Indexes объекта TableDef "Сотрудники".  Далее отображаются семейство Indexes объекта TableDef, семейства Fields новых Index и семейства Properties новых объектов Index.  Для выполнения этой процедуры требуется функция CreateIndexOutput.

Sub CreateIndexX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim idxCountry As Index

Dim idxFirstName As Index

Dim idxLoop As Index

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind!Сотрудники

With tdfEmployees

' Создает первый объект Index, создает и добавляет объекты

' Field в объект Index, а затем добавляет объект

' Index в семейство Indexes объекта TableDef.

Set idxCountry = .CreateIndex("ИндексСтрана")

With idxCountry

.Fields.Append .CreateField("Страна")

.Fields.Append .CreateField("Фамилия")

.Fields.Append .CreateField("Имя")

End With

.Indexes.Append idxCountry

' Создает второй объект Index, создает и добавляет объекты

' Field в объект Index, а затем добавляет объект

' Index в семейство Indexes объекта TableDef.

Set idxFirstName = .CreateIndex

With idxFirstName

.Name = "ИндексИмя"

.Fields.Append .CreateField("Имя")

.Fields.Append .CreateField("Фамилия")

End With

.Indexes.Append idxFirstName

' Обновляет семейство, чтобы обеспечить

' доступ к новым объектам Index.

.Indexes.Refresh

Debug.Print .Indexes.Count & " Индексы в " & _

.Name & " TableDef"

' Отображает семейство Indexes.

For Each idxLoop In .Indexes

Debug.Print "    " & idxLoop.Name

Next idxLoop

' Печатает отчет.

CreateIndexOutput idxCountry

CreateIndexOutput idxFirstName

' Удаляет новые объекты Index, созданные

' только для демонстрации.

.Indexes.Delete idxCountry.Name

.Indexes.Delete idxFirstName.Name

End With

dbsNorthwind.Close

End Sub

Function CreateIndexOutput(idxTemp As Index)

Dim fldLoop As Field

Dim prpLoop As Property

With idxTemp

' Отображает семейство Fields объекта Index.

Debug.Print "Поля в " & .Name

For Each fldLoop In .Fields

Debug.Print "    " & fldLoop.Name

Next fldLoop

' Отображает семейство Properties объекта Index.

Debug.Print "Свойства " & .Name

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " - " & _

IIf(prpLoop = "", "[empty]", prpLoop)

Next prpLoop

End With

End Function


Метод CreateProperty, пример

В следующей программе делается попытка задать значение определяемого пользователем свойства.  Если свойство не существует, вызывается метод CreateProperty для создания нового свойства и задания его значения.  Для выполнения этой процедуры требуется процедура SetProperty.

Sub CreatePropertyX()

Dim dbsNorthwind As Database

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Задает для свойства "Архивный " значение True.

SetProperty dbsNorthwind, "Архивный", True

With dbsNorthwind

Debug.Print "Свойства " & .Name

' Отображает семейство Properties базы данных "Борей".

For Each prpLoop In .Properties

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

Next prpLoop

' Удаляет новое свойство, созданное только

' для демонстрации.

.Properties.Delete "Архивный"

.Close

End With

End Sub

Sub SetProperty(dbsTemp As Database, strName As String, _

booTemp As Boolean)

Dim prpNew As Property

Dim errLoop As Error

' Делает попытку задать значение указанного свойства.

On Error GoTo Err_Property

dbsTemp.Properties("strName") = booTemp

On Error GoTo 0

Exit Sub

Err_Property:

' Ошибка 3270 означает, что свойство не найдено.

If DBEngine.Errors(0).Number = 3270 Then

' Создает свойство, задает его значение и добавляет

' свойство в семейство Properties.

Set prpNew = dbsTemp.CreateProperty(strName, _

dbBoolean, booTemp)

dbsTemp.Properties.Append prpNew

Resume Next

Else

' При возникновении другой ошибки выводит сообщение.

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & vbCr & _

errLoop.Description

Next errLoop

End

End If

End Sub


Метод CreateQueryDef, пример

Следующая программа использует метод CreateQueryDef для создания и выполнения как временного, так и постоянного объекта QueryDef.  Для выполнения этой процедуры требуется функция GetrstTemp.

Sub CreateQueryDefX()

Dim dbsNorthwind As Database

Dim qdfTemp As QueryDef

Dim qdfNew As QueryDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Создает временный объект QueryDef.

Set qdfTemp = .CreateQueryDef("", _

"SELECT * FROM Сотрудники")

' Открывает объект Recordset и печатает отчет.

GetrstTemp qdfTemp

' Создает постоянный объект QueryDef.

Set qdfNew = .CreateQueryDef("NewQueryDef", _

"SELECT * FROM Типы")

' Открывает объект Recordset и печатает отчет.

GetrstTemp qdfNew

' Удаляет объект QueryDef, созданный только для демонстрации.

.QueryDefs.Delete qdfNew.Name

.Close

End With

End Sub

Function GetrstTemp(qdfTemp As QueryDef)

Dim rstTemp As Recordset

With qdfTemp

Debug.Print .Name

Debug.Print "    " & .SQL

' Открывает объект Recordset для объекта QueryDef.

Set rstTemp = .OpenRecordset(dbOpenSnapshot)

With rstTemp

' Заполняет объект Recordset и печатает число записей.

.MoveLast

Debug.Print "    Число записей = " & _

.RecordCount

Debug.Print

.Close

End With

End With

End Function


Метод CreateRelation, пример

Следующая программа использует метод CreateRelation для создания объекта Relation (связь) между объектом TableDef "Сотрудники" и новым объектом TableDef "Отделы".  Данный пример также демонстрирует, как при создании нового объекта Relation создаются все необходимые объекты Index во внешней таблице (объект Index "СотрудникиОтдела" в таблице "Сотрудники").

Sub CreateRelationX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim tdfNew As TableDef

Dim idxNew As Index

Dim relNew As Relation

Dim idxLoop As Index

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Добавляет новое поле в таблицу "Сотрудники".

Set tdfEmployees = .TableDefs!Сотрудники

tdfEmployees.Fields.Append _

tdfEmployees.CreateField("КодОтдела", dbInteger, 2)

' Создает новую таблицу "Отделы".

Set tdfNew = .CreateTableDef("Отделы")

With tdfNew

' Создает и добавляет объекты Field в семейство

' Fields нового объекта TableDef.

.Fields.Append .CreateField("КодОтдела", dbInteger, 2)

.Fields.Append .CreateField("НазваниеОтдела", dbText, 20)

' Создает объект Index для таблицы "Отделы.

Set idxNew = .CreateIndex("ИндексКодОтдела")

' Создает и добавляет объекты Field в семейство

' Fields нового объекта Index.

idxNew.Fields.Append idxNew.CreateField("КодОтдела")

' Чтобы входить  в связь, индекс в главной таблице

' должен быть уникальным.

idxNew.Unique = True

.Indexes.Append idxNew

End With

.TableDefs.Append tdfNew

' Создает объект Relation "СотрудникиОтделы",

' используя при создании связи имена двух таблиц.

Set relNew = .CreateRelation("СотрудникиОтделы", _

tdfNew.Name, tdfEmployees.Name, _

dbRelationUpdateCascade)

' Создает объект Field для семейства Fields нового объекта

' Relation. Задает значения свойств Name и ForeignName,

' используя имена полей, участвующих в связи.

relNew.Fields.Append relNew.CreateField("КодОтдела")

relNew.Fields!КодОтдела.ForeignName = "КодОтдела"

.Relations.Append relNew

' Печатает отчет.

Debug.Print "Свойства связи " & relNew.Name

Debug.Print "    Таблица = " & relNew.Table

Debug.Print "    Внешняя таблица = " & _

relNew.ForeignTable

Debug.Print "Поля связи " & relNew.Name

With relNew.Fields!КодОтдела

Debug.Print "    " & .Name

Debug.Print "        Name = " & .Name

Debug.Print "        ForeignName = " & .ForeignName

End With

Debug.Print "Индексы в таблице " & tdfEmployees.Name

For Each idxLoop In tdfEmployees.Indexes

Debug.Print "    " & idxLoop.Name & _

", Внешняя таблица = " & idxLoop.Foreign

Next idxLoop

' Удаляет новые объекты, созданные только для демонстрации.

.Relations.Delete relNew.Name

.TableDefs.Delete tdfNew.Name

tdfEmployees.Fields.Delete "КодОтдела"

.Close

End With

End Sub


Метод CreateTableDef, пример

Следующая программа создает новый объект TableDef в базе данных "Борей".

Sub CreateTableDefX()

Dim dbsNorthwind As Database

Dim tdfNew As TableDef

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает новый объект TableDef.

Set tdfNew = dbsNorthwind.CreateTableDef("Контакты")

With tdfNew

' Создает поля и добавляет их в новый объект TableDef.

' Это необходимо сделать до добавления объекта TableDef

' в семейство TableDefs базы данных "Борей".

.Fields.Append .CreateField("Имя", dbText)

.Fields.Append .CreateField("Фамилия", dbText)

.Fields.Append .CreateField("Телефон", dbText)

.Fields.Append .CreateField("Примечания", dbMemo)

Debug.Print "Свойства нового объекта TableDef " & _

"до добавления в семейство:"

' Отображает семейство Properties нового объекта TableDef.

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

    prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

' Добавляет новый объект TableDef в базу данных "Борей".

dbsNorthwind.TableDefs.Append tdfNew

Debug.Print "Свойства нового объекта TableDef " & _

"после добавления в семейство:"

' Отображает семейство нового объекта TableDef.

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

    prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

End With

' Удаляет новый объект TableDef, созданный только

' для демонстрации.

dbsNorthwind.TableDefs.Delete "Контакты"

dbsNorthwind.Close

End Sub


Метод Delete, пример

Следующая программа использует метод Delete для удаления указанной записи из объекта Recordset.  Для выполнения этой процедуры требуется процедура DeleteRecord.

Sub DeleteX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim lngID As Long

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

' Добавляет временную запись, которая будет удалена.

With rstEmployees

.Index = "PrimaryKey"

.AddNew

!Имя = "Вова"

!Фамилия = "Сидоров"

.Update

.Bookmark = .LastModified

lngID = !КодСотрудника

End With

' Удаляет запись о сотруднике с указанным кодом.

DeleteRecord rstEmployees, lngID

rstEmployees.Close

dbsNorthwind.Close

End Sub

Sub DeleteRecord(rstTemp As Recordset, _

lngSeek As Long)

With rstTemp

.Seek "=", lngSeek

If .NoMatch Then

MsgBox "Нет сотрудника с кодом #" & lngSeek & " в файле!"

Else

.Delete

MsgBox "Запись для сотрудника #" & lngSeek & _

" удалена!"

End If

End With

End Sub


Метод Edit, пример

Следующая программа использует метод Edit для замены текущих данных, соответствующих указанному имени.  Для выполнения этой процедуры требуется процедура EditName.

Sub EditX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strOldFirst As String

Dim strOldLast As String

Dim strFirstName As String

Dim strLastName As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

' Сохраняет исходные данные.

strOldFirst = rstEmployees!Имя

strOldLast = rstEmployees!Фамилия

' Принимает новые данные для записи.

strFirstName = Trim(InputBox( _

"Введите имя:"))

strLastName = Trim(InputBox( _

"Введите фамилию:"))

' Продолжает выполнение, если данные введены в оба поля.

If strFirstName <> "" and strLastName <> "" Then

' Обновляет запись новыми данными.

EditName rstEmployees, strFirstName, strLastName

With rstEmployees

' Отображает новые и старые данные.

Debug.Print "Старые данные: " & strOldFirst & _

" " & strOldLast

Debug.Print "Новые данные: " & !Имя & _

" " & !Фамилия

' Восстанавливает исходные данные, измененные

' только для демонстрации.

.Edit

!Имя = strOldFirst

!Фамилия = strOldLast

.Update

End With

Else

Debug.Print _

"Необходимо ввести строковое значение для имени и фамилии!"

End If

rstEmployees.Close

dbsNorthwind.Close

End Sub

Sub EditName(rstTemp As Recordset, _

strFirst As String, strLast As String)

' Вносит изменения в запись и устанавливает закладку,

' чтобы оставить запись текущей.

With rstTemp

.Edit

!Имя = strFirst

!Фамилия = strLast

.Update

.Bookmark = .LastModified

End With

End Sub


Метод Execute, пример

Следующая программа демонстрирует метод Execute при запуске объектов QueryDef и Database.  Для выполнения этой процедуры требуются процедуры ExecuteQueryDef и PrintOutput.

Sub ExecuteX()

Dim dbsNorthwind As Database

Dim strSQLChange As String

Dim strSQLRestore As String

Dim qdfChange As QueryDef

Dim rstEmployees As Recordset

Dim errLoop As Error

' Определяет две инструкции SQL для запросов на изменение.

strSQLChange = "UPDATE Сотрудники SET Страна = " & _

"'United States' WHERE Страна = 'USA'"

strSQLRestore = "UPDATE Сотрудники SET Страна = " & _

"'USA' WHERE Страна = 'United States'"

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает временный объект QueryDef.

Set qdfChange = dbsNorthwind.CreateQueryDef("", _

strSQLChange)

Set rstEmployees = dbsNorthwind.OpenRecordset( _

"SELECT Фамилия, Страна FROM Сотрудники", _

dbOpenForwardOnly)

' Печатает отчет по исходным данным.

Debug.Print _

"Данные в таблице 'Сотрудники' до выполнения запроса"

PrintOutput rstEmployees

' Запускает временный объект QueryDef.

ExecuteQueryDef qdfChange, rstEmployees

' Печатает отчет по новым данным.

Debug.Print _

"Данные в таблице 'Сотрудники' после выполнения запроса"

PrintOutput rstEmployees

' Запускает запрос на изменение для восстановления данных.

' Перехватывает ошибки, проверяя семейство Errors.

On Error GoTo Err_Execute

dbsNorthwind.Execute strSQLRestore, dbFailOnError

On Error GoTo 0

' Загружает текущие данные с помощью повторного запроса.

rstEmployees.Requery

' Печатает отчет по восстановленным данным.

Debug.Print "Данные после выполнения запроса, " & _

"восстанавливающего исходные сведения"

PrintOutput rstEmployees

rstEmployees.Close

Exit Sub

Err_Execute:

' Уведомляет пользователя об ошибках, возникших

' при выполнении запроса.

If DBEngine.Errors.Count > 0 Then

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & vbCr & _

errLoop.Description

Next errLoop

End If

Resume Next

End Sub

Sub ExecuteQueryDef(qdfTemp As QueryDef, _

rstTemp As Recordset)

Dim errLoop As Error

' Запускает указанный объект QueryDef.

' Перехватывает ошибки, проверяя семейство Errors.

On Error GoTo Err_Execute

qdfTemp.Execute dbFailOnError

On Error GoTo 0

' Загружает текущие данные с помощью повторного запроса.

rstTemp.Requery

Exit Sub

Err_Execute:

' Уведомляет пользователя об ошибках, возникших

' при выполнении запроса.

If DBEngine.Errors.Count > 0 Then

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & vbCr & _

errLoop.Description

Next errLoop

End If

Resume Next

End Sub

Sub PrintOutput(rstTemp As Recordset)

' Отображает объект Recordset.

Do While Not rstTemp.EOF

Debug.Print "    " & rstTemp!Фамилия & _

", " & rstTemp!Страна

rstTemp.MoveNext

Loop

End Sub


Методы FindFirst, FindLast, FindNext и FindPrevious, пример

Следующая программа использует методы FindFirst, FindLast, FindNext и FindPrevious для перевода указателя записи в объекте Recordset на базе указанной строки поиска и команды.  Для выполнения этой процедуры требуется функция FindAny.

Sub FindFirstX()

Dim dbsNorthwind As Database

Dim rstCustomers As Recordset

Dim strCountry As String

Dim varBookmark As Variant

Dim strMessage As String

Dim intCommand As Integer

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstCustomers = dbsNorthwind.OpenRecordset( _

"SELECT Название, Город, Страна " & _

"FROM Клиенты ORDER BY Название", _

dbOpenSnapshot)

Do While True

' Принимает данные от пользователя и собирает строку поиска.

strCountry = _

Trim(InputBox("Введите название страны."))

If strCountry = "" Then Exit Do

strCountry = "Страна = '" & strCountry & "'"

With rstCustomers

' Заполняет набор записей.

.MoveLast

' Находит первую запись, удовлетворяющую строке поиска.

' Выходит из цикла, если такой строки нет.

.FindFirst strCountry

If .NoMatch Then

MsgBox "Не найдены записи для " & _

strCountry & "."

Exit Do

End If

Do While True

' Сохраняет закладку текущей записи.

varBookmark = .Bookmark

' Принимает способ поиска, выбранный пользователем.

strMessage = "Компания: " & !Название & _

vbCr & "Место: " & !Город & ", " & _

!Страна & vbCr & vbCr & _

strCountry & vbCr & vbCr & _

"[1 - FindFirst, 2 - FindLast, " & _

vbCr & "3 - FindNext, " & _

"4 - FindPrevious]"

intCommand = Val(Left(InputBox(strMessage), 1))

If intCommand < 1 Or intCommand > 4 Then Exit Do

' Применяет выбранный метод Find. При неудачном

' поиске возвращает последнюю текущую запись.

If FindAny(intCommand, rstCustomers, _

strCountry) = False Then

.Bookmark = varBookmark

MsgBox "Запись не найдена Возврат " & _

"на текущую запись."

End If

Loop

End With

Exit Do

Loop

rstCustomers.Close

dbsNorthwind.Close

End Sub

Function FindAny(intChoice As Integer, _

rstTemp As Recordset, _

strFind As String) As Boolean

' Использует способ поиска, выбранный пользователем.

Select Case intChoice

Case 1

rstTemp.FindFirst strFind

Case 2

rstTemp.FindLast strFind

Case 3

rstTemp.FindNext strFind

Case 4

rstTemp.FindPrevious strFind

End Select

' Задает возвращаемое значение по значению свойства NoMatch.

FindAny = IIf(rstTemp.NoMatch, False, True)

End Function


Метод GetRows, пример

Следующая программа использует метод GetRows для загрузки указанного числа строк из объекта Recordset и заполнения массива полученными данными.  Метод GetRows возвращает менее указанного числа строк в двух случаях: при обнаружения метки конца файла EOF или при попытке загрузки записи, удаленной другим пользователем.  Функция возвращает False только в последнем случае.  Для выполнения этой процедуры требуется функция GetRowsOK.

Sub GetRowsX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strMessage As String

Dim intRows As Integer

Dim avarRecords As Variant

Dim intRecord As Integer

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = dbsNorthwind.OpenRecordset( _

"SELECT Имя, Фамилия, Должность " & _

"FROM Сотрудники ORDER BY Фамилия", dbOpenSnapshot)

With rstEmployees

Do While True

' Принимает от пользователя число строк.

strMessage = "Введите число загружаемых строк."

intRows = Val(InputBox(strMessage))

If intRows <= 0 Then Exit Do

' При успешном выполнении GetRowsOK печатает результаты;

' при обнаружении конца файла ничего не делается.

If GetRowsOK(rstEmployees, intRows, _

avarRecords) Then

If intRows > UBound(avarRecords, 2) + 1 Then

Debug.Print "(Недостаточно записей в объекте " & _

"Recordset для загрузки " & intRows & _

" строк.)"

End If

Debug.Print UBound(avarRecords, 2) + 1 & _

" записей обнаружено."

' Печатает загруженные данные.

For intRecord = 0 To UBound(avarRecords, 2)

Debug.Print "    " & _

avarRecords(0, intRecord) & " " & _

avarRecords(1, intRecord) & ", " & _

avarRecords(2, intRecord)

Next intRecord

Else

' В предположении, что GetRows возвращает ошибку

' из-за изменения данных другим пользователем,

' вызывает метод Requery для обновления

' объекта Recordset и возобновления операции.

If .Restartable Then

If MsgBox("Ошибка в методе GetRows. Повторить?", _

vbYesNo) = vbYes Then

.Requery

Else

Debug.Print "Ошибка в методе GetRows!"

Exit Do

End If

Else

Debug.Print "Ошибка в методе GetRows! " & _

"Неверное значение свойства Restartable!"

Exit Do

End If

End If

' Так как после вызова GetRows указатель текущей записи

' остается на последней проверенной записи, переводит

' указатель в начало объекта Recordset перед

' выполнением нового цикла поиска.

.MoveFirst

Loop

End With

rstEmployees.Close

dbsNorthwind.Close

End Sub

Function GetRowsOK(rstTemp As Recordset, _

intNumber As Integer, avarData As Variant) As Boolean

' Сохраняет результаты вызова GetRows в массиве.

avarData = rstTemp.GetRows(intNumber)

' Возвращает False, только если возвращено менее указанного

' количества строк, но не при достижении конца объекта

' Recordset.

If intNumber > UBound(avarData, 2) + 1 And _

Not rstTemp.EOF Then

GetRowsOK = False

Else

GetRowsOK = True

End If

End Function


Метод Move, пример

Следующая программа использует метод Move для помещения указателя текущей записи в позицию, заданную пользователем.

Sub MoveX()

Dim dbsNorthwind As Database

Dim rstSuppliers As Recordset

Dim varBookmark As Variant

Dim strCommand As String

Dim lngMove As Long

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstSuppliers = _

dbsNorthwind.OpenRecordset("SELECT Название, " & _

"Город, Страна FROM Поставщики ORDER BY Название", _

dbOpenDynaset)

With rstSuppliers

' Заполняет набор записей.

.MoveLast

.MoveFirst

Do While True

' Отображает сведения о текущей записи и запрашивает,

' на какое количество записей следует сдвинуться.

strCommand = InputBox( _

"Запись № " & (.AbsolutePosition + 1) & " из " & _

.RecordCount & vbCr & "Компания: " & _

!Название & vbCr & "Место: " & !Город & _

", " & !Страна & vbCr & vbCr & _

"Введите число записей для перемещения " & _

"(положительное или отрицательное).")

If strCommand = "" Then Exit Do

' Сохраняет закладку на случай ошибки метода Move.

varBookmark = .Bookmark

' Методу Move требуется параметр с типом данных Long.

lngMove = CLng(strCommand)

.Move lngMove

' Перехват меток BOF или EOF.

If .BOF Then

MsgBox "Слишком далеко назад! " & _

"Возвращаюсь на текущую запись."

.Bookmark = varBookmark

End If

If .EOF Then

MsgBox "Слишком далеко вперед! " & _

"Возвращаюсь на текущую запись."

.Bookmark = varBookmark

End If

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Методы MoveFirst, MoveLast, MoveNext и MovePrevious, пример

Следующая программа использует методы MoveFirst, MoveLast, MoveNext и MovePrevious для перемещения указателя текущей записи в объекте Recordset на основании введенной команды.  Для выполнения этой процедуры требуется процедура MoveAny.

Sub MoveFirstX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strMessage As String

Dim intCommand As Integer

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = dbsNorthwind.OpenRecordset( _

"SELECT Имя, Фамилия FROM Сотрудники " & _

"ORDER BY Фамилия", dbOpenSnapshot)

With rstEmployees

' Заполняет объект Recordset.

.MoveLast

.MoveFirst

Do While True

' Отображает сведения о текущей записи

' и принимает выбранный пользователем способ.

strMessage = "Имя: " & !Имя & " " & _

!Фамилия & vbCr & "Запись № " & _

(.AbsolutePosition + 1) & " из " & _

.RecordCount & vbCr & vbCr & _

"[1 - MoveFirst, 2 - MoveLast, " & vbCr & _

"3 - MoveNext, 4 - MovePrevious]"

intCommand = Val(Left(InputBox(strMessage), 1))

If intCommand < 1 Or intCommand > 4 Then Exit Do

' Вызывает метод, выбранный пользователем.

MoveAny intCommand, rstEmployees

Loop

.Close

End With

dbsNorthwind.Close

End Sub

Sub MoveAny(intChoice As Integer, _

rstTemp As Recordset)

' Использует выбранный метод, перехватывает метки BOF и EOF.

With rstTemp

Select Case intChoice

Case 1

.MoveFirst

Case 2

.MoveLast

Case 3

.MoveNext

If .EOF Then

MsgBox "Уже достигнут конец набора записей!"

.MoveLast

End If

Case 4

.MovePrevious

If .BOF Then

MsgBox "Уже достигнуто начало набора записей!"

.MoveFirst

End If

End Select

End With

End Sub


Метод NewPassword, пример

Следующая программа приглашает ввести новый пароль для пользователя Иван Иванов.  Если введена строка длиной от 1 до 14 символов, вызывается метод NewPassword для изменения пароля.  Пользователь должен войти в систему как Иван Иванов или как член группы "Admins".

Sub NewPasswordX()

Dim wrkDefault As Workspace

Dim usrNew As User

Dim grpNew As Group

Dim grpMember As Group

Dim strPassword As String

' Определяет стандартную рабочую область.

Set wrkDefault = DBEngine.Workspaces(0)

With wrkDefault

' Создает и добавляет нового пользователя.

Set usrNew = .CreateUser("Иван Иванов", _

"abc123DEF456", "Пароль1")

.Users.Append usrNew

' Создает и добавляет новую группу.

Set grpNew = .CreateGroup("Счетоводы", _

"UVW987xyz654")

.Groups.Append grpNew

' Делает нового пользователя членом новой группы.

Set grpMember = usrNew.CreateGroup("Счетоводы")

usrNew.Groups.Append grpMember

' Приглашает ввести новый пароль. Если введена

' слишком длинная строка, приглашает повторить.

Do While True

strPassword = InputBox("Введите новый пароль:")

Select Case Len(strPassword)

Case 1 To 14

usrNew.NewPassword "Пароль1", strPassword

MsgBox "Пароль изменен!"

Exit Do

Case Is > 14

MsgBox "Слишком длинный пароль!"

Case 0

Exit Do

End Select

Loop

' Удаляет новые объекты User и Group,

' созданные только для демонстрации.

.Users.Delete "Иван Иванов"

.Groups.Delete "Счетоводы"

End With

End Sub


Метод Refresh, пример

Следующая программа использует метод Refresh для обновления семейства Fields таблицы "Типы" на основании изменения значения свойства OrdinalPosition.  Порядок полей в семействе Fields изменяется только после вызова метода Refresh.

Sub RefreshX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim aintPosition() As Integer

Dim astrFieldName() As String

Dim intTemp As Integer

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind.TableDefs("Типы")

With tdfEmployees

' Отображает исходные значения свойства OrdinalPosition

' и сохраняет их в массиве.

Debug.Print _

"Исходные значения OrdinalPosition в объекте TableDef."

ReDim aintPosition(0 To .Fields.Count - 1) As Integer

ReDim astrFieldName(0 To .Fields.Count - 1) As String

For intTemp = 0 To .Fields.Count - 1

aintPosition(intTemp) = _

.Fields(intTemp).OrdinalPosition

astrFieldName(intTemp) = .Fields(intTemp).Name

Debug.Print , aintPosition(intTemp), _

astrFieldName(intTemp)

Next intTemp

' Изменяет значения свойства OrdinalPosition.

For Each fldLoop In .Fields

fldLoop.OrdinalPosition = _

100 - fldLoop.OrdinalPosition

Next fldLoop

Set fldLoop = Nothing

' Печатает новые данные.

Debug.Print "Новые значения OrdinalPosition до вызова Refresh."

For Each fldLoop In .Fields

Debug.Print , fldLoop.OrdinalPosition, fldLoop.Name

Next fldLoop

.Fields.Refresh

' Печатает новые данные, демонстрирующие изменение

' порядка полей.

Debug.Print "Новые значения OrdinalPosition после вызова Refresh."

For Each fldLoop In .Fields

Debug.Print , fldLoop.OrdinalPosition, fldLoop.Name

Next fldLoop

' Восстанавливает исходные значения свойства OrdinalPosition.

For intTemp = 0 To .Fields.Count - 1

.Fields(astrFieldName(intTemp)).OrdinalPosition = _

aintPosition(intTemp)

Next intTemp

End With

dbsNorthwind.Close

End Sub


Метод RepairDatabase, пример

В следующей программе делается попытка восстановить базу данных Борей.mdb. Данную процедуру нельзя запускать из модуля в базе данных Борей.mdb.

Sub RepairDatabaseX()

Dim errLoop As Error

If MsgBox("Восстановить базу данных 'Борей'?", _

vbYesNo) = vbYes Then

On Error GoTo Err_Repair

DBEngine.RepairDatabase "Борей.mdb"

On Error GoTo 0

MsgBox "Процедура восстановления завершена!"

End If

Exit Sub

Err_Repair:

For Each errLoop In DBEngine.Errors

MsgBox "Неудачная попытка восстановления!" & vbCr & _

"Код ошибки: " & errLoop.Number & _

vbCr & errLoop.Description

Next errLoop

End Sub


Метод Seek, пример

В следующем примере метод Seek используется для поиска товара по коду товара.

Sub SeekX()

Dim dbsNorthwind As Database

Dim rstProducts As Recordset

Dim intFirst As Integer

Dim intLast As Integer

Dim strMessage As String

Dim strSeek As String

Dim varBookmark As Variant

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Чтобы использовать индекс в методе Seek, необходимо

' открыть табличный объект Recordset.

Set rstProducts = _

dbsNorthwind.OpenRecordset("Товары", dbOpenTable)

With rstProducts

' Задает индекс.

.Index = "PrimaryKey"

' Определяет минимальный и максимальный код товара.

.MoveLast

intLast = !КодТовара

.MoveFirst

intFirst = !КодТовара

Do While True

' Отображает сведения о текущей записи

' и выводит приглашение задать код.

strMessage = "Код товара: " & !КодТовара & vbCr & _

"Марка: " & !Марка & vbCr & vbCr & _

"Введите код товара в интервале от " & intFirst & _

" до " & intLast & "."

strSeek = InputBox(strMessage)

If strSeek = "" Then Exit Do

' Сохраняет текущую закладку на случай ошибки метода Seek.

varBookmark = .Bookmark

.Seek "=", Val(strSeek)

' Возвращается на текущую запись при ошибке в методе Seek.

If .NoMatch Then

MsgBox "Код не найден!"

.Bookmark = varBookmark

End If

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Метод Update, пример

Следующая программа демонстрирует совместное применение методов Update и Edit.

Sub UpdateX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strOldFirst As String

Dim strOldLast As String

Dim strMessage As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

.Edit

' Сохраняет исходные данные.

strOldFirst = !Имя

strOldLast = !Фамилия

' Изменяет данные в буфере редактирования.

!Имя = "Вова"

!Фамилия = "Сидоров"

' Отображает содержимое буфера и принимает введенные данные.

strMessage = "Режим редактирования:" & vbCr & _

"    Исходные данные = " & strOldFirst & " " & _

strOldLast & vbCr & "    Данные в буфере = " & _

!Имя & " " & !Фамилия & vbCr & vbCr & _

"Вызвать Update для замены в объекте Recordset " & _

"исходных данных на данные из буфера?"

If MsgBox(strMessage, vbYesNo) = vbYes Then

.Update

Else

.CancelUpdate

End If

' Отображает результаты.

MsgBox "Содержимое набора записей = " & !Имя & " " & _

!Фамилия

' Восстанавливает исходные данные, так как изменения

' внесены только для демонстрации.

If Not (strOldFirst = !Имя And _

strOldLast = !Фамилия) Then

.Edit

!Имя = strOldFirst

!Фамилия = strOldLast

.Update

End If

.Close

End With

dbsNorthwind.Close

End Sub

Следующая программа демонстрирует совместное применение методов Update и AddNew.

Sub UpdateX2()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strOldFirst As String

Dim strOldLast As String

Dim strMessage As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

.AddNew

!Имя = "Старик"

!Фамилия = "Хоттабыч"

' Отображает содержимое буфера и принимает введенные данные.

strMessage = "Режим добавления:" & vbCr & _

"    Данные в буфере = " & !Имя & " " & _

!Фамилия & vbCr & vbCr & _

"Вызвать Update для сохранения содержимого буфера " & _

"в объекте Recordset?"

If MsgBox(strMessage, vbYesNoCancel) = vbYes Then

.Update

' Переходит на новую запись и отображает результаты.

.Bookmark = .LastModified

MsgBox "Содержимое набора записей = " & !Имя & _

" " & !Фамилия

' Удаляет новые данные, так как изменения

' внесены только для демонстрации.

.Delete

Else

.CancelUpdate

MsgBox "Новая запись не была добавлена."

End If

.Close

End With

dbsNorthwind.Close

End Sub


Метод CancelUpdate, пример

Следующая программа демонстрирует использование метода CancelUpdate с методом AddNew.

Sub CancelUpdateX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim intCommand As Integer

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = dbsNorthwind.OpenRecordset(_

"Сотрудники", bOpenDynaset)

With rstEmployees

.AddNew

!Имя = "Иван"

!Фамилия = "Петров"

intCommand = MsgBox("Добавить запись для " & _

!Имя & " " & !Фамилия & "?", vbYesNo)

If intCommand = vbYes Then

.Update

MsgBox "Запись добавлена."

' Удаляет новую запись,
' добавленную для демонстрации.

.Bookmark = .LastModified

.Delete

Else

.CancelUpdate

MsgBox "Запись не добавлена."

End If

End With

dbsNorthwind.Close

End Sub

Следующая программа демонстрирует использование метода CancelUpdate с методом Edit.

Sub CancelUpdateX2()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strFirst As String

Dim strLast As String

Dim intCommand As Integer

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = dbsNorthwind.OpenRecordset(_

"Сотрудники", dbOpenDynaset)

With rstEmployees

strFirst = !Имя

strLast = !Фамилия

.Edit

!Имя = "Петр"

!Фамилия = "Иванов"

intCommand = MsgBox("Заменить текущее имя на " & _

!Имя & " " & !Фамилия & "?", vbYesNo)

If intCommand = vbYes Then

.Update

MsgBox "Запись изменена."

' Восстанавливает данные, измененные для демонстрации.

.Bookmark = .LastModified

.Edit

!Имя = strFirst

!Фамилия = strLast

.Update

Else

.CancelUpdate

MsgBox "Запись не изменена."

End If

.Close

End With

dbsNorthwind.Close

End Sub


Метод CopyQueryDef, пример

Следующая программа использует метод CopyQueryDef для создания копии объекта QueryDef на основе существующего объекта Recordset, а затем изменяет копию, добавляя предложение в свойство SQL.  При создании постоянных объектов QueryDef можно добавлять в значение свойства SQL пробел, точку с запятой или символ перевода строки; но эти лишние символы должны быть удалены перед добавлением в инструкцию SQL любого нового предложения.

Function CopyQueryNew(rstTemp As Recordset, _

strAdd As String) As QueryDef

Dim strSQL As String

Dim strRightSQL As String

Set CopyQueryNew = rstTemp.CopyQueryDef

With CopyQueryNew

' Удаляет лишние символы.

strSQL = .SQL

strRightSQL = Right(strSQL, 1)

Do While strRightSQL = " " Or strRightSQL = ";" Or _

strRightSQL = Chr(10) Or strRightSQL = vbCr

strSQL = Left(strSQL, Len(strSQL) - 1)

strRightSQL = Right(strSQL, 1)

Loop

.SQL = strSQL & strAdd

End With

End Function

Следующая программа демонстрирует возможное использование функции CopyQueryNew().

Sub CopyQueryDefX()

Dim dbsNorthwind As Database

Dim qdfEmployees As QueryDef

Dim rstEmployees As Recordset

Dim intCommand As Integer

Dim strOrderBy As String

Dim qdfCopy As QueryDef

Dim rstCopy As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set qdfEmployees = dbsNorthwind.CreateQueryDef("NewQueryDef", _

"SELECT Имя, Фамилия, ДатаРождения " & _

"FROM Сотрудники")

Set rstEmployees = qdfEmployees.OpenRecordset(dbOpenForwardOnly)

Do While True

intCommand = Val(InputBox( _

"Выберите поле для сортировки объекта " & _

"Recordset:" &vbCr & "1 - Имя" & vbCr & _

"2 - Фамилия" & vbCr & "3 - ДатаРождения" & _

vbCr & "[Отмена - выход]"))

Select Case intCommand

Case 1

strOrderBy = " ORDER BY Имя"

Case 2

strOrderBy = " ORDER BY Фамилия"

Case 3

strOrderBy = " ORDER BY ДатаРождения"

Case Else

Exit Do

End Select

Set qdfCopy = CopyQueryNew(rstEmployees, strOrderBy)

Set rstCopy = qdfCopy.OpenRecordset(dbOpenSnapshot, _

dbForwardOnly)

With rstCopy

Do While Not .EOF

Debug.Print !Фамилия & ", " & !Имя & _

" - " &!ДатаРождения

.MoveNext

Loop

.Close

End With

Exit Do

Loop

rstEmployees.Close

' Удаляет объект QueryDef, добавленный только для демонстрации.

dbsNorthwind.QueryDefs.Delete qdfEmployees.Name

dbsNorthwind.Close

End Sub


Метод CreateGroup, пример

Следующая программа использует метод CreateGroup для создания нового объекта Group; затем делает пользователя "admin" членом нового объекта Group и печатает списки свойств и пользователей.

Sub CreateGroupX()

Dim wrkDefault As Workspace

Dim grpNew As Group

Dim grpTemp As Group

Dim prpLoop As Property

Dim usrLoop As User

Set wrkDefault = DBEngine.Workspaces(0)

With wrkDefault

' Создает и добавляет новую группу.

Set grpNew = .CreateGroup("НоваяГруппа", _

"AAA123456789")

.Groups.Append grpNew

' Делает пользователя "admin" членом группы

' "НоваяГруппа", создавая и добавляя объект

' Group в семейство Groups пользователей.

Set grpTemp = .Users("admin").CreateGroup("НоваяГруппа")

.Users("admin").Groups.Append grpTemp

Debug.Print "Свойства " & grpNew.Name

' Отображает семейство Properties объекта НоваяГруппа.

' Свойство PID недоступно для чтения.

For Each prpLoop In grpNew.Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

Debug.Print "Семейство Users объекта " & _

grpNew.Name

' Печатает семейство Users объекта "НоваяГруппа".

For Each usrLoop In grpNew.Users

Debug.Print "    " & _

usrLoop.Name

Next usrLoop

' Удаляет новый объект Group, созданный

' только для демонстрации.

.Groups.Delete "НоваяГруппа"

End With

End Sub


Метод CreateUser, свойства Password и PID, пример

Следующая программа использует метод CreateUser и свойства Password и PID для создания нового объекта User.  Далее новый объект User включается в разные объекты Group, а затем для него печатаются списки свойств и групп.

Sub CreateUserX()

Dim wrkDefault As Workspace

Dim usrNew As User

Dim grpNew As Group

Dim usrTemp As User

Dim prpLoop As Property

Dim grpLoop As Group

Set wrkDefault = DBEngine.Workspaces(0)

With wrkDefault

' Создает и добавляет новый объект User.

Set usrNew = .CreateUser("НовыйПользователь")

usrNew.PID = "AAA123456789"

usrNew.Password = "НовыйПароль"

.Users.Append usrNew

' Создает и добавляет новый объект Group.

Set grpNew = .CreateGroup("НоваяГруппа", _

"AAA123456789")

.Groups.Append grpNew

' Делает пользователя "НовыйПользователь" членом

' группы "НоваяГруппа", создавая и добавляя

' подходящий объект User в семейство Users группы.

Set usrTemp = _

.Groups("НоваяГруппа").CreateUser("НовыйПользователь")

.Groups("НоваяГруппа").Users.Append usrTemp

Debug.Print "Свойства " & usrNew.Name

' Отображает семейство Properties объекта НовыйПользователь.

' Свойство PID недоступно для чтения.

For Each prpLoop In usrNew.Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

Debug.Print "Семейство Groups объекта " & usrNew.Name

' Отображает семейство Groups объекта НовыйПользователь.

For Each grpLoop In usrNew.Groups

Debug.Print "    " & _

grpLoop.Name

Next grpLoop

' Удаляет объекты User и Group, созданные

' только для демонстрации.

.Users.Delete "НовыйПользователь"

.Groups.Delete "НоваяГруппа"

End With

End Sub


Метод CreateWorkspace, пример

Следующая программа использует метод CreateWorkspace для создания рабочей области Microsoft Jet и рабочей области ODBCDirect.  Затем печатаются списки свойств двух рабочих областей.

Sub CreateWorkspaceX()

Dim wrkODBC As Workspace

Dim wrkJet As Workspace

Dim wrkLoop As Workspace

Dim prpLoop As Property

' Создает рабочую область ODBCDirect. До создания рабочей

' области Microsoft Jet, ядро базы данных Microsoft Jet

' не будет загружено в память.

Set wrkODBC = CreateWorkspace("ODBCWorkspace", "admin", _

"", dbUseODBC)

Workspaces.Append wrkODBC

DefaultType = dbUseJet

' Создает безымянный объект Workspace с типом,

' указанным в свойстве DefaultType объекта DBEngine

' (dbUseJet).

Set wrkJet = CreateWorkspace("", "admin", "")

' Отображает семейство Workspaces.

Debug.Print "Объекты Workspace в семействе Workspaces:"

For Each wrkLoop In Workspaces

Debug.Print "    " & wrkLoop.Name

Next wrkLoop

With wrkODBC

' Отображает семейство Properties объекта ODBCDirect.

Debug.Print "Свойства " & .Name

On Error Resume Next

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " = " & prpLoop

Next prpLoop

On Error GoTo 0

End With

With wrkJet

' Отображает семейство Properties рабочей области

' Microsoft Jet.

Debug.Print _

"Свойства безымянной рабочей области Microsoft Jet"

On Error Resume Next

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " = " & prpLoop

Next prpLoop

On Error GoTo 0

End With

wrkODBC.Close

wrkJet.Close

End Sub


Метод Idle, пример

Следующая программа использует метод Idle, чтобы обеспечить в процедуре вывода доступ к последним доступным данным в базе данных.  Для выполнения данной процедуры требуется процедура IdleOutput.

Sub IdleX()

Dim dbsNorthwind As Database

Dim strCountry As String

Dim strSQL As String

Dim rstOrders As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Принимает введенное пользователем название страны

' и использует его для создания инструкции SQL.

strCountry = Trim(InputBox("Введите название страны:"))

strSQL = "SELECT * FROM Заказы WHERE СтранаПолучателя = '" & _

strCountry & "' ORDER BY КодЗаказа"

' Открывает объект Recordset с помощью инструкции SQL.

Set rstOrders = dbsNorthwind.OpenRecordset(strSQL)

' Отображает содержимое объекта Recordset.

IdleOutput rstOrders, strCountry

rstOrders.Close

dbsNorthwind.Close

End Sub

Sub IdleOutput(rstTemp As Recordset, strTemp As String)

' Вызывает метод Idle для снятия ненужных блокировок,

' принудительного  выполнения отложенных операций записи,

' и обновления памяти текущими данными из файла .mdb.

DBEngine.Idle dbRefreshCache

' Отображает содержимое объекта Recordset.

With rstTemp

Debug.Print "Страна " & strTemp & ":"

Debug.Print , "КодЗаказа", "КодКлиента", "ДатаРазмещения"

Do While Not .EOF

Debug.Print , !КодЗаказа, !КодКлиента, !ДатаРазмещения

.MoveNext

Loop

End With

End Sub


Метод MakeReplica, пример

Следующая функция использует метод MakeReplica для создания дополнительной реплики существующей основной реплики.  Аргумент intOptions может быть комбинацией констант dbRepMakeReadOnly и dbRepMakePartial или иметь значение 0.  Например, для создания доступной только для чтения частичной реплики следует передать в качестве значения intOptions сумму констант dbRepMakeReadOnly + dbRepMakePartial.

Function MakeAdditionalReplica(strReplicableDB As _

String, strNewReplica As String, intOptions As _

Integer) As Integer

Dim dbsTemp As Database

On Error GoTo ErrorHandler

Set dbsTemp = OpenDatabase(strReplicableDB)

' Если в функцию MakeAdditionalReplica параметры

' не передаются, аргумент можно опустить. По

' умолчанию будет создана полная реплика, доступная

' для чтения/записи. В противном случае необходимо

' задать значение intOptions.

If intOptions = 0 Then

dbsTemp.MakeReplica strNewReplica, _

"Реплика для " & strReplicableDB

Else

dbsTemp.MakeReplica strNewReplica, _

"Реплика для " & strReplicableDB, _

intOptions

End If

dbsTemp.Close

ErrorHandler:

Select Case Err

Case 0:

MakeAdditionalReplica = 0

Exit Function

Case Else:

MsgBox "Ошибка " & Err & " : " & Error

MakeAdditionalReplica = Err

Exit Function

End Select

End Function


Метод NextRecordset, свойство DefaultCursorDriver, пример

Следующая программа использует метод NextRecordset для просмотра данных составного запроса SELECT.  При выполнении таких запросов свойство DefaultCursorDriver должно получить значение dbUseODBCCursor.  Метод NextRecordset возвращает значение True, даже если некоторые или все инструкции SELECT не возвращают записей.  Значение False будет возвращено только после всех предложений инструкции SQL.

Sub NextRecordsetX()

Dim wrkODBC As Workspace

Dim conPubs As Connection

Dim rstTemp As Recordset

Dim intCount As Integer

Dim booNext As Boolean

' Создает объект Workspace ODBCDirect и открывает объект

' Connection. При использовании составных инструкций SQL

' значение DefaultCursorDriver является обязательным.

Set wrkODBC = CreateWorkspace("", _

"admin", "", dbUseODBC)

wrkODBC.DefaultCursorDriver = dbUseODBCCursor

Set conPubs = wrkODBC.OpenConnection("Publishers", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Создает составную инструкцию SELECT.

Set rstTemp = conPubs.OpenRecordset("SELECT * " & _

"FROM authors; " & _

"SELECT * FROM stores; " & _

"SELECT * FROM jobs")

' Делает попытку напечатать результаты каждой из трех

' инструкций SELECT.

booNext = True

intCount = 1

With rstTemp

Do While booNext

Debug.Print "Содержимое набора записей #" & intCount

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

booNext = .NextRecordset

Debug.Print "    rstTemp.NextRecordset = " & _

booNext

intCount = intCount + 1

Loop

End With

rstTemp.Close

conPubs.Close

wrkODBC.Close

End Sub

Еще одним способом решения той же задачи является создание готовой инструкции, содержащей составную инструкциюSQL.  Для свойства CacheSize объекта QueryDef необходимо задать значение 1, а объект Recordset должен иметь тип набора записей с последовательным доступом и доступным только для чтения.

Sub NextRecordsetX2()

Dim wrkODBC As Workspace

Dim conPubs As Connection

Dim qdfTemp As QueryDef

Dim rstTemp As Recordset

Dim intCount As Integer

Dim booNext As Boolean

' Создает объект Workspace ODBCDirect и открывает объект

' Connection. Значение свойства DefaultCursorDriver является

' необходимым при использовании составных инструкций SQL.

Set wrkODBC = CreateWorkspace("", _

"admin", "", dbUseODBC)

wrkODBC.DefaultCursorDriver = dbUseODBCCursor

Set conPubs = wrkODBC.OpenConnection("Publishers", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Создает временную сохраненную процедуру

' внутри составной инструкции SELECT.

Set qdfTemp = conPubs.CreateQueryDef("", _

"SELECT * FROM authors; " & _

"SELECT * FROM stores; " & _

"SELECT * FROM jobs")

' Определяет свойство CacheSize и открывает объект

' Recordset с аргументами, обеспечивающими доступ

' к нескольким наборам записей.

qdfTemp.CacheSize = 1

Set rstTemp = qdfTemp.OpenRecordset(dbOpenForwardOnly, _

dbReadOnly)

' Попытка напечатать результаты для каждой из

' трех инструкций SELECT.

booNext = True

intCount = 1

With rstTemp

Do While booNext

Debug.Print "Набор записей #" & intCount

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

booNext = .NextRecordset

Debug.Print "    rstTemp.NextRecordset = " & _

booNext

intCount = intCount + 1

Loop

End With

rstTemp.Close

qdfTemp.Close

conPubs.Close

wrkODBC.Close

End Sub


Метод OpenConnection, пример

Следующая программа использует метод OpenConnection с различными параметрами для открытия трех разных объектов Connection.

Sub OpenConnectionX()

Dim wrkODBC As Workspace

Dim conPubs As Connection

Dim conPubs2 As Connection

Dim conPubs3 As Connection

Dim conLoop As Connection

' Создает объект Workspace ODBCDirect.

Set wrkODBC = CreateWorkspace("NewODBCWorkspace", _

"admin", "", dbUseODBC)

' Открывает объект Connection, используя заданную строку

' подключения. Если этих данных недостаточно, пользователь

' может перехватить эту ошибку и не допустить открытия

' диалогового окна диспетчера драйвера ODBC.

MsgBox "Открытие Connection1..."

Set conPubs = wrkODBC.OpenConnection("Connection1", _

dbDriverNoPrompt, , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Открывает объект Connection только для чтения на основании

' данных, введенных пользователем в диалоговое окно

' диспетчера драйвера ODBC.

MsgBox "Открытие Connection2..."

Set conPubs2 = wrkODBC.OpenConnection("Connection2", _

dbDriverPrompt, True, "ODBC;DSN=Publishers;")

' Открывает объект Connection только для чтения на основании

' недостающих данных, введенных пользователем в диалоговое

' окно диспетчера драйвера ODBC.

MsgBox "Открытие Connection3..."

Set conPubs3 = wrkODBC.OpenConnection("Connection3", _

dbDriverCompleteRequired, True, _

"ODBC;DATABASE=pubs;DSN=Publishers;")

' Отображает семейство Connections.

For Each conLoop In wrkODBC.Connections

Debug.Print "Свойства объекта Connection " & _

conLoop.Name & ":"

With conLoop

' Печатает значения свойств, явно вызывая каждый

' объект Property; объект Connection не поддерживает

' семейство Properties.

Debug.Print "    Connect = " & .Connect

' Свойство фактически возвращает объект Database.

Debug.Print "    Database[.Name] = " & _

.Database.Name

Debug.Print "    Name = " & .Name

Debug.Print "    QueryTimeout = " & .QueryTimeout

Debug.Print "    RecordsAffected = " & _

.RecordsAffected

Debug.Print "    StillExecuting = " & _

.StillExecuting

Debug.Print "    Transactions = " & .Transactions

Debug.Print "    Updatable = " & .Updatable

End With

Next conLoop

conPubs.Close

conPubs2.Close

conPubs3.Close

wrkODBC.Close

End Sub


Метод OpenDatabase, пример

Следующая программа использует метод OpenDatabase для открытия одной базы данных Microsoft Jet и двух баз данных ODBC, подключенных к ядру Microsoft Jet.

Sub OpenDatabaseX()

Dim wrkJet As Workspace

Dim dbsNorthwind As Database

Dim dbsPubs As Database

Dim dbsPubs2 As Database

Dim dbsLoop As Database

Dim prpLoop As Property

' Создает объект Workspace Microsoft Jet.

Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)

' Открывает для монопольного доступа аргумент Database,

' представляющий сохраненную базу данных Microsoft Jet.

MsgBox "Открытие базы данных 'Борей'..."

Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb", _

True)

' Открывает только для чтения объект Database,

' используя строку подключения.

MsgBox "Открытие базы данных 'Publishers'..."

Set dbsPubs = wrkJet.OpenDatabase("Publishers", _

dbDriverNoPrompt, True, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Открывает только для чтения объект Database с вводом

' недостающих данных в диалоговое окно диспетчера

' драйвера ODBC.

MsgBox "Открытие копии базы данных 'Publishers'..."

Set dbsPubs2 = wrkJet.OpenDatabase("Publishers", _

dbDriverCompleteRequired, True, _

"ODBC;DATABASE=pubs;DSN=Publishers;")

' Отображает семейство Databases.

For Each dbsLoop In wrkJet.Databases

Debug.Print "Свойства объекта Database " & _

dbsLoop.Name & ":"

On Error Resume Next

' Отображает семейство Properties каждого

' объекта Database.

For Each prpLoop In dbsLoop.Properties

If prpLoop.Name = "Connection" Then

' Свойство фактически возвращает объект Connection.

Debug.Print "    Connection[.Name] = " & _

dbsLoop.Connection.Name

Else

Debug.Print "    " & prpLoop.Name & " = " & _

prpLoop

End If

Next prpLoop

On Error GoTo 0

Next dbsLoop

dbsNorthwind.Close

dbsPubs.Close

dbsPubs2.Close

wrkJet.Close

End Sub


Метод OpenRecordset, пример

Следующая программа использует метод OpenRecordset для открытия пяти объектов Recordset и отображения их содержимого.  Для выполнения данной процедуры требуется процедура OpenRecordsetOutput.

Sub OpenRecordsetX()

Dim wrkJet As Workspace

Dim wrkODBC As Workspace

Dim dbsNorthwind As Database

Dim conPubs As Connection

Dim rstTemp As Recordset

Dim rstTemp2 As Recordset

' Открывает сеансы Microsoft Jet и ODBCDirect, базу данных

' Microsoft Jet и подключение ODBCDirect.

Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)

Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)

Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

Set conPubs = wrkODBC.OpenConnection("", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Открывает пять объектов Recordset и отображает

' содержимое каждого объекта.

Debug.Print "С последовательным доступом, " & _

"где источником является объект QueryDef..."

Set rstTemp = dbsNorthwind.OpenRecordset( _

"Десять самых дорогих товаров", dbOpenForwardOnly)

OpenRecordsetOutput rstTemp

Debug.Print "Динамический набор записей только для чтения, " & _

"где источником является инструкция SQL..."

Set rstTemp = dbsNorthwind.OpenRecordset( _

"SELECT * FROM Сотрудники", dbOpenDynaset, dbReadOnly)

OpenRecordsetOutput rstTemp

' Использует свойство Filter для отбора записей

' при следующем вызове метода OpenRecordset.

Debug.Print "Отбор записей из существующего " & _

"объекта Recordset..."

rstTemp.Filter = "Фамилия >= 'Ж'"

Set rstTemp2 = rstTemp.OpenRecordset()

OpenRecordsetOutput rstTemp2

Debug.Print "Набор записей динамического типа " & _

"для подключения ODBC..."

Set rstTemp = conPubs.OpenRecordset( _

"SELECT * FROM stores", dbOpenDynamic)

OpenRecordsetOutput rstTemp

' С помощью свойства StillExecuting проверяет, готов ли

' объект Recordset для обработки.

Debug.Print "Статический набор записей на основе " & _

"асинхронного запроса для подключения ODBC..."

Set rstTemp = conPubs.OpenRecordset("publishers", _

dbOpenSnapshot, dbRunAsync)

Do While rstTemp.StillExecuting

Debug.Print "    [еще выполняется...]"

Loop

OpenRecordsetOutput rstTemp

rstTemp.Close

dbsNorthwind.Close

conPubs.Close

wrkJet.Close

wrkODBC.Close

End Sub

Sub OpenRecordsetOutput(rstOutput As Recordset)

' Отображает указанный объект Recordset.

With rstOutput

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

End With

End Sub


Метод PopulatePartial, пример

Следующая программа вызывает метод PopulatePartial после изменения фильтра реплики.

Sub PopulatePartialX()

Dim tdfCustomers As TableDef

Dim strFilter As String

Dim dbsTemp As Database

' Открывает частичную реплику для монопольного доступа.

Set dbsTemp = OpenDatabase("F:\SALES\FY96CA.MDB", True)

With dbsTemp

Set tdfCustomers =.TableDefs("Клиенты")

' Выполняет синхронизацию с полной репликой

' перед заданием фильтра реплики.

.Synchronize "C:\SALES\FY96.MDB"

strFilter = "Город = 'Тула'"

tdfCustomers.ReplicaFilter = strFilter

' Заполняет реплику записями из полной реплики.

.PopulatePartial "C:\SALES\FY96.MDB"

.Close

End With

End Sub


Метод RefreshLink, пример

Следующая программа использует метод RefreshLink для обновления данных в присоединенной таблице после смены подключения с одного источника данных на другой.  Для выполнения данной процедуры требуется процедура RefreshLinkOutput.

Sub RefreshLinkX()

Dim dbsCurrent As Database

Dim tdfLinked As TableDef

' Открывает базу данных, в которую будет добавлена

' присоединенная таблица.

Set dbsCurrent = OpenDatabase("DB1.mdb")

' Создает присоединенную таблицу, связанную

' с базой данных Microsoft SQL Server.

Set tdfLinked = _

dbsCurrent.CreateTableDef("AuthorsTable")

tdfLinked.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"

tdfLinked.SourceTableName = "authors"

dbsCurrent.TableDefs.Append tdfLinked

' Отображает содержимое присоединенной таблицы.

Debug.Print _

"Присоединенная таблица, подключенная к первому источнику:"

RefreshLinkOutput dbsCurrent

' Изменяет сведения о подключении для присоединенной таблицы

' и обновляет связь, чтобы сделать новые данные доступными.

tdfLinked.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=NewPublishers"

tdfLinked.RefreshLink

' Отображает содержимое присоединенной таблицы.

Debug.Print _

"Присоединенная таблица, подключенная ко второму источнику:"

RefreshLinkOutput dbsCurrent

' Удаляет присоединенную таблица, созданную для демонстрации.

dbsCurrent.TableDefs.Delete tdfLinked.Name

dbsCurrent.Close

End Sub

Sub RefreshLinkOutput(dbsTemp As Database)

Dim rstRemote As Recordset

Dim intCount As Integer

' Открывает присоединенную таблицу.

Set rstRemote = _

dbsTemp.OpenRecordset("AuthorsTable")

intCount = 0

' Отображает объект Recordset, останавливаясь на 50 записях.

With rstRemote

Do While Not .EOF And intCount < 50

Debug.Print , .Fields(0), .Fields(1)

intCount = intCount + 1

.MoveNext

Loop

If Not .EOF Then Debug.Print , "[другие записи]"

.Close

End With

End Sub


Метод RegisterDatabase, пример

Следующая программа использует метод RegisterDatabase для регистрации источника данных Microsoft SQL Server "Publishers" в реестре Windows.

Лучшим способом создания, изменения или удаления имен источников данных является использование значка "ODBC" панели управления Windows.

Sub RegisterDatabaseX()

Dim dbsRegister As Database

Dim strDescription As String

Dim strAttributes As String

Dim errLoop As Error

' Создает строку ключевых слов.

strDescription = InputBox( "Введите описание " & _

"регистрируемой базы данных.")

strAttributes = "Database=pubs" & _

vbCr & "Description=" & strDescription & _

vbCr & "OemToAnsi=No" & _

vbCr & "Server=Server1"

' Обновляет реестр Windows.

On Error GoTo Err_Register

DBEngine.RegisterDatabase "Publishers", "SQL Server", _

True, strAttributes

On Error GoTo 0

MsgBox "Для просмотра изменений вызовите " & _

"regedit.exe: " & "HKEY_CURRENT_USER\" & _

"Software\ODBC\ODBC.INI"

Exit Sub

Err_Register:

' Уведомляет пользователя о любых ошибках,

' являющихся  следствием недопустимых данных.

If DBEngine.Errors.Count > 0 Then

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & _

vbCr & errLoop.Description

Next errLoop

End If

Resume Next

End Sub


Метод Requery, пример

Следующая программа демонстрирует использование метода Requery для обновления данных запроса после изменения базового источника данных.

Sub RequeryX()

Dim dbsNorthwind As Database

Dim qdfTemp As QueryDef

Dim rstView As Recordset

Dim rstChange As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set qdfTemp = dbsNorthwind.CreateQueryDef("", _

"PARAMETERS ПросмотрСтраны Text; " & _

"SELECT Имя, Фамилия, Страна FROM Сотрудники " & _

"WHERE Страна = [ПросмотрСтраны] " & _

"ORDER BY Фамилия")

qdfTemp.Parameters!ПросмотрСтраны = "USA"

Debug.Print "Исходный запрос, " & _

[ПросмотрСтраны] = USA"

Set rstView = qdfTemp.OpenRecordset

Do While Not rstView.EOF

Debug.Print "    " & rstView!Имя & " " & _

rstView!Фамилия & ", " & rstView!Страна

rstView.MoveNext

Loop

' Изменение данных.

Set rstChange = dbsNorthwind.OpenRecordset("Сотрудники")

rstChange.AddNew

rstChange!Имя = "Nina"

rstChange!Фамилия = "Roberts"

rstChange!Страна = "USA"

rstChange.Update

rstView.Requery

Debug.Print "Повторный запрос после изменения источника"

Set rstView = qdfTemp.OpenRecordset

Do While Not rstView.EOF

Debug.Print "    " & rstView!Имя & " " & _

rstView!Фамилия & ", " & rstView!Страна

rstView.MoveNext

Loop

' Восстанавливает исходные данные,

' измененные для демонстрации.

rstChange.Bookmark = rstChange.LastModified

rstChange.Delete

rstChange.Close

rstView.Close

dbsNorthwind.Close

End Sub

Следующая программа демонстрирует использование метода Requery для обновления результатов запроса после изменения параметров.

Sub RequeryX2()

Dim dbsNorthwind As Database

Dim qdfTemp As QueryDef

Dim prmCountry As Parameter

Dim rstView As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set qdfTemp = dbsNorthwind.CreateQueryDef("", _

"PARAMETERS ПросмотрСтраны Text; " & _

"SELECT Имя, Фамилия, Страна FROM Сотрудники " & _

"WHERE Страна = [ПросмотрСтраны] " & _

"ORDER BY Фамилия")

Set prmCountry = qdfTemp.Parameters!ПросмотрСтраны

qdfTemp.Parameters!ПросмотрСтраны = "USA"

Debug.Print "Исходный запрос, " & _

[ПросмотрСтраны] = USA"

Set rstView = qdfTemp.OpenRecordset

Do While Not rstView.EOF

Debug.Print "    " & rstView!Имя & " " & _

rstView!Фамилия & ", " & rstView!Страна

rstView.MoveNext

Loop

' Изменяет параметр запроса.

qdfTemp.Parameters!ПросмотрСтраны = "UK"

' Чтобы результирующий объект Recordset отражал изменение

' параметра, необходимо указать аргумент QueryDef .

rstView.Requery qdfTemp

Debug.Print "После изменения параметра, " & _

"[ПросмотрСтраны] = UK"

Do While Not rstView.EOF

Debug.Print "    " & rstView!Имя & " " & _

rstView!Фамилия & ", " & rstView!Страна

rstView.MoveNext

Loop

rstView.Close

dbsNorthwind.Close

End Sub


Метод SetOption, пример

Следующая программа использует метод SetOption для изменения значений в двух разделах реестра на основании данных, введенных пользователем.  Метод SetOption переопределяет сохраненные параметры реестра только для текущего приложения.  Сохраненные значения останутся неизменными и доступными для просмотра с помощью программы REGEDIT.EXE.

Sub SetOptionX()

Dim intExclusiveDelay As Integer

Dim intSharedDelay As Integer

' Принимает от пользователя новые значения параметров

' ExclusiveAsyncDelay и SharedAsyncDelay.

intExclusiveDelay = Val(InputBox("Введите новое значение " & _

" параметра ExclusiveAsyncDelay " & _

"(в миллисекундах):"))

intSharedDelay = Val(InputBox("Введите новое значение " & _

"параметра SharedAsyncDelay " & _

"(в миллисекундах):"))

If intExclusiveDelay > 0 And intSharedDelay > 0 Then

' Изменяет значения параметров реестра.

SetOption dbExclusiveAsyncDelay, intExclusiveDelay

SetOption dbSharedAsyncDelay, intSharedDelay

MsgBox "Параметры реестра получили новые " & _

"значения на время выполнения программы."

Else

MsgBox "Параметры реестра не были изменены."

End If

End Sub


Метод Synchronize, пример

Следующие примеры используют метод Synchronize для демонстрации одностороннего и двухстороннего обмен данными между двумя компонентами набора реплик.  Для выполнения этих примеров необходимо преобразовать базу данных Борей.mdb в основную реплику (см. свойство Replicable), и создать реплику этой базы данных с именем Nwreplica.mdb.  При необходимости, измените имя реплики в собственной программе или создайте реплику с помощью метода MakeReplica.

Следующая программа передает изменения из основной реплики "Борей" в реплику "Nwreplica".  Пути должны соответствовать путям на вашем компьютере.

Sub SendChangeToReplicaX()

Dim dbsNorthwind As Database

' Открывает реплицированную базу данных Борей.mdb.

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Передает изменения данных или структуры в реплику.

dbsNorthwind.Synchronize "Nwreplica.mdb", _

dbRepExportChanges

dbsNorthwind.Close

End Sub

В этом примере реплицированная база данных Борей.mdb принимает изменения из реплики Nwreplica.  Данную процедуру необходимо запускать из базы данных, принимающей изменения.

Sub ReceiveChangeX()

Dim dbsNorthwind As Database

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Передает изменения из реплики в основную реплику.

dbsNorthwind.Synchronize "Nwreplica.mdb", _

dbRepImportChanges

dbsNorthwind.Close

End Sub

В этом примере выполняется взаимный обмен изменениями между реплицированной базой данных "Борей" и репликой.  Такой способ в данном методе задается по умолчанию.

Sub TwoWayExchangeX()

Dim dbsNorthwind As Database

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Выполняет взаимный обмен изменениями между репликами.

dbsNorthwind.Synchronize "Nwreplica.mdb", _

dbRepImpExpChanges

dbsNorthwind.Close

End Sub

Следующая программа выполняет синхронизацию двух баз данных через Internet.

Sub InternetSynchronizeX()

Dim dbsTemp As Database

Set dbsTemp = OpenDatabase("C:\Data\OrdEntry.mdb")

' Выполняет синхронизацию локальной базы данных

' с репликой на сервере Internet.

dbsTemp.Synchronize _

"www.mycompany.myserver.com" _

& "/files/Orders.mdb", _

dbRepImpExpChanges + dbRepSyncInternet

dbsTemp.Close

End Sub


Свойство AbsolutePosition, пример

Следующая программа использует свойство AbsolutePosition для контроля за выполнением цикла по всем записям объекта Recordset.

Sub AbsolutePositionX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strMessage As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Свойство AbsolutePosition применимо только

' к динамическим и статическим наборам записей.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenSnapshot)

With rstEmployees

' Заполняет объект Recordset.

.MoveLast

.MoveFirst

' Цикл по всем компонентам объекта Recordset.

Do While Not .EOF

' Отображает сведения о текущей записи. Прибавляет 1

' к значению AbsolutePosition, поскольку значения

' этого свойства отсчитываются от нуля.

strMessage = "Сотрудник: " & !Фамилия & vbCr & _

"(запись " & (.AbsolutePosition + 1) & _

" из " & .RecordCount & ")"

If MsgBox(strMessage, vbOKCancel) = vbCancel _

Then Exit Do

.MoveNext

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Свойство AllowZeroLength, пример

В следующей программе свойство AllowZeroLength позволяет пользователю задать для поля значение пустой строки.  Это позволяет различать записи с неизвестными данными и записи, для которых отсутствуют допустимые данные.

Sub AllowZeroLengthX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim fldTemp As Field

Dim rstEmployees As Recordset

Dim strMessage As String

Dim strInput As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind.TableDefs("Сотрудники")

' Создает новый объект Field и добавляет его в семейство

' Fields таблицы "Сотрудники".

Set fldTemp = tdfEmployees.CreateField("ФаксТел", _

dbText, 24)

fldTemp.AllowZeroLength = True

tdfEmployees.Fields.Append fldTemp

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

' Принимает данные от пользователя.

.Edit

strMessage = "Введите номер факса для " & _

!Имя & " " & !Фамилия & "." & vbCr & _

"[? - неизвестен, X - нет факса]"

strInput = UCase(InputBox(strMessage))

If strInput <> "" Then

Select Case strInput

Case "?"

!ФаксТел = Null

Case "X"

!ФаксТел = ""

Case Else

!ФаксТел = strInput

End Select

.Update

' Печатает отчет.

Debug.Print "Имя - Факс"

Debug.Print !Имя & " " & !Фамилия & " - ";

If IsNull(!ФаксТел) Then

Debug.Print "[Неизвестен]"

Else

If !ФаксТел = "" Then

Debug.Print "[Нет факса]"

Else

Debug.Print !ФаксТел

End If

End If

Else

.CancelUpdate

End If

.Close

End With

' Удаляет новое поле, созданное только для демонстрации.

tdfEmployees.Fields.Delete fldTemp.Name

dbsNorthwind.Close

End Sub


Свойства BOF и EOF, пример

Следующая программа демонстрирует использование свойств BOF и EOF для перемещения назад и вперед по объекту Recordset.

Sub BOFX()

Dim dbsNorthwind As Database

Dim rstCategories As Recordset

Dim strMessage As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstCategories = _

dbsNorthwind.OpenRecordset("Типы", _

dbOpenSnapshot)

With rstCategories

' Заполняет объект Recordset.

.MoveLast

.MoveFirst

Do While True

' Отображает сведения о текущей записи

' и принимает данные от пользователя.

strMessage = "Категория: " & !Категория & _

vbCr & "(запись " & (.AbsolutePosition + 1) & _

" из " & .RecordCount & ")" & vbCr & vbCr & _

"1 - вперед, 2 - назад"

' Переход вперед или назад и перехват меток BOF или EOF.

Select Case InputBox(strMessage)

Case 1

.MoveNext

If .EOF Then

MsgBox _

"Конец файла!" & vbCr & _

"Указатель передвинут на последнюю запись."

.MoveLast

End If

Case 2

.MovePrevious

If .BOF Then

MsgBox _

"Начало файла!" & vbCr & _

"Указатель передвинут на первую запись."

.MoveFirst

End If

Case Else

Exit Do

End Select

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Свойства Bookmark и Bookmarkable, пример

Следующая программа использует свойства Bookmark и Bookmarkable для запоминания позиции записи в объекте Recordset и возвращения к этой записи.

Sub BookmarkX()

Dim dbsNorthwind As Database

Dim rstCategories As Recordset

Dim strMessage As String

Dim intCommand As Integer

Dim varBookmark As Variant

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstCategories = _

dbsNorthwind.OpenRecordset("Типы", _

dbOpenSnapshot)

With rstCategories

If .Bookmarkable = False Then

Debug.Print "Объект Recordset не поддерживает закладки!"

Else

' Заполняет объект Recordset.

.MoveLast

.MoveFirst

Do While True

' Отображает сведения о текущей записи

' и принимает данные от пользователя.

strMessage = "Категория: " & !Категория & _

" (запись " & (.AbsolutePosition + 1) & _

" из " & .RecordCount & ")" & vbCr & _

"Введите команду:" & vbCr & _

"[1 - следующая / 2 - предыдущая /" & vbCr & _

"3 - установить закладку / 4 - перейти на закладку]"

intCommand = Val(InputBox(strMessage))

Select Case intCommand

' Переход вперед или назад, перехват

' меток BOF или EOF.

Case 1

.MoveNext

If .EOF Then .MoveLast

Case 2

.MovePrevious

If .BOF Then .MoveFirst

' Сохраняет закладку текущей записи.

Case 3

varBookmark = .Bookmark

' Переходит на запись, отмеченную

' сохраненной закладкой.

Case 4

If IsEmpty(varBookmark) Then

MsgBox "Нет установленной закладки!"

Else

.Bookmark = varBookmark

End If

Case Else

Exit Do

End Select

Loop

End If

.Close

End With

dbsNorthwind.Close

End Sub


Свойство Count, пример

Следующая программа демонстрирует применение свойства Count к трем семействам в базе данных "Борей".  С помощью этого свойства определяется число объектов в каждом семействе и задается верхний предел циклов по всем элементам этих семейств.  Другим средством перечисления элементов семейств без применения свойства Count является конструкция For Each...Next.

Sub CountX()

Dim dbsNorthwind As Database

Dim intloop As Integer

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Печатает сведения о семействе TableDefs.

Debug.Print .TableDefs.Count & _

" Объекты TableDef в базе 'Борей'"

For intloop = 0 To .TableDefs.Count - 1

Debug.Print "    " & .TableDefs(intloop).Name

Next intloop

' Печатает сведения о семействе QueryDefs.

Debug.Print .QueryDefs.Count & _

" Объекты QueryDef в базе 'Борей'"

For intloop = 0 To .QueryDefs.Count - 1

Debug.Print "    " & .QueryDefs(intloop).Name

Next intloop

' Печатает сведения о семействе Relations.

Debug.Print .Relations.Count & _

" Объекты Relation в базе 'Борей'"

For intloop = 0 To .Relations.Count - 1

Debug.Print "    " & .Relations(intloop).Name

Next intloop

.Close

End With

End Sub


Свойство DataUpdatable, пример

Следующая программа демонстрирует применение свойства DataUpdatable, используя первое поле из шести различных объектов Recordset.  Для выполнения данной процедуры требуется функция DataOutput.

Sub DataUpdatableX()

Dim dbsNorthwind As Database

Dim rstNorthwind As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Открывает и печатает отчет о табличном объекте Recordset.

Set rstNorthwind = .OpenRecordset("Сотрудники")

DataOutput rstNorthwind

' Открывает и печатает отчет о динамическом объекте Recordset.

Set rstNorthwind = .OpenRecordset("Сотрудники", _

dbOpenDynaset)

DataOutput rstNorthwind

' Открывает и печатает отчет о статическом объекте Recordset.

Set rstNorthwind = .OpenRecordset("Сотрудники", _

dbOpenSnapshot)

DataOutput rstNorthwind

' Открывает и печатает отчет об объекте Recordset

' типа набора записей с последовательным доступом.

Set rstNorthwind = .OpenRecordset("Сотрудники", _

dbOpenForwardOnly)

DataOutput rstNorthwind

' Открывает и печатает отчет об объекте Recordset,

' созданном с помощью запроса на выборку.

Set rstNorthwind = _

.OpenRecordset("Текущий список товаров")

DataOutput rstNorthwind

' Открывает и печатает отчет об объекте Recordset,

' созданном с помощью запроса на выборку с подсчетом итогов.

Set rstNorthwind = .OpenRecordset("Суммы заказов")

DataOutput rstNorthwind

.Close

End With

End Sub

Function DataOutput(rstTemp As Recordset)

With rstTemp

Debug.Print "Объект Recordset: " & .Name & ", ";

Select Case .Type

Case dbOpenTable

Debug.Print "dbOpenTable"

Case dbOpenDynaset

Debug.Print "dbOpenDynaset"

Case dbOpenSnapshot

Debug.Print "dbOpenSnapshot"

Case dbOpenForwardOnly

Debug.Print "dbOpenForwardOnly"

End Select

Debug.Print "    Поле: " & .Fields(0).Name & ", " & _

"DataUpdatable = " & .Fields(0).DataUpdatable

Debug.Print

.Close

End With

End Function


Свойства DateCreated и LastUpdated, пример

Следующая программа демонстрирует применение свойств DateCreated и LastUpdated путем добавления нового объекта Field в существующий объект TableDef, а также путем создания нового объекта TableDef.  Для выполнения данной процедуры требуется функция DateOutput.

Sub DateCreatedX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim tdfNewTable As TableDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

Set tdfEmployees = .TableDefs!Сотрудники

With tdfEmployees

' Печатает текущие сведения о таблице "Сотрудники".

DateOutput "Текущие свойства", tdfEmployees

' Создает и добавляет поле в таблицу "Сотрудники".

.Fields.Append .CreateField("НовоеПоле", dbDate)

' Печатает новые сведения о таблице "Сотрудники".

DateOutput "После создания нового поля", _

tdfEmployees

' Удаляет новое поле, созданное только для демонстрации.

.Fields.Delete "НовоеПоле"

End With

' Создает и добавляет новый объект TableDef

' в базу данных "Борей".

Set tdfNewTable = .CreateTableDef("НоваяТаблица")

With tdfNewTable

.Fields.Append .CreateField("НовоеПоле", dbDate)

End With

.TableDefs.Append tdfNewTable

' Печатает сведения о новом объекте TableDef.

DateOutput "После создания новой таблицы", tdfNewTable

' Удаляет новый объект TableDef, созданный

' только для демонстрации.

.TableDefs.Delete tdfNewTable.Name

.Close

End With

End Sub

Function DateOutput(strTemp As String, _

tdfTemp As TableDef)

' Печатает значения свойств DateCreated и LastUpdated

' для указанного объекта TableDef.

Debug.Print strTemp

Debug.Print "    TableDef: " & tdfTemp.Name

Debug.Print "        DateCreated = " & _

tdfTemp.DateCreated

Debug.Print "        LastUpdated = " & _

tdfTemp.LastUpdated

Debug.Print

End Function


Свойство DefaultValue, пример

Следующая программа использует свойство DefaultValue, чтобы информировать пользователя о нормальном значении поля во время вывода приглашения ввести данные.  Кроме того, демонстрируется заполнение новых записей с помощью свойства DefaultValue, если пользователь не вводит значение.  Для выполнения данной процедуры требуется функция DefaultPrompt.

Sub DefaultValueX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim strOldDefault As String

Dim rstEmployees As Recordset

Dim strMessage As String

Dim strCode As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind.TableDefs!Сотрудники

' Сохраняет исходное значение свойства DefaultValue

' и задает новое значение свойства.

strOldDefault = _

tdfEmployees.Fields!Индекс.DefaultValue

tdfEmployees.Fields!Индекс.DefaultValue = "198052"

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

With rstEmployees

' Добавляет новую запись в объект Recordset.

.AddNew

!Имя = "Иван"

!Фамилия = "Иванов"

' Принимает данные от пользователя. Если пользователь вводит

' данные, они заносятся в поле; в противном случае

' используется значение свойства DefaultValue.

strMessage = "Введите почтовый индекс для " & vbCr & _

!Имя & " " & !Фамилия & ":"

strCode = DefaultPrompt(strMessage, !Индекс)

If strCode <> "" Then !Индекс = strCode

.Update

' Переходит на новую запись и печатает данные.

.Bookmark = .LastModified

Debug.Print "    Имя = " & !Имя

Debug.Print "    Фамилия = " & !Фамилия

Debug.Print "    Индекс = " & !Индекс

' Удаляет новую запись, созданную только для демонстрации.

.Delete

.Close

End With

' Восстанавливает исходное значение DefaultValue, измененное

' только для демонстрации.

tdfEmployees.Fields!Индекс.DefaultValue = _

strOldDefault

dbsNorthwind.Close

End Sub

Function DefaultPrompt(strPrompt As String, _

fldTemp As Field) As String

Dim strFullPrompt As String

' Приглашает ввести новое значение DefaultValue для

' указанного объекта Field.

strFullPrompt = strPrompt & vbCr & _

"[Значение по умолчанию = " & fldTemp.DefaultValue & _

", 'Отмена' - использовать имеющееся значение]"

DefaultPrompt = InputBox(strFullPrompt)

End Function


Свойство DistinctCount, пример

Следующая программа использует свойство DistinctCount для демонстрации определения числа уникальных значений в объекте Index.  Однако данное значение является точным только сразу после создания объекта Index.  Это значение останется точным, пока не будут изменены ключи, добавлены новые или удалены старые ключи.  (При повторном выполнении данной процедуры пользователь имеет возможность увидеть результаты изменения значения свойства DistinctCount для существующих объектов Index).

Sub DistinctCountX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim idxCountry As Index

Dim idxLoop As Index

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind!Сотрудники

With tdfEmployees

' Создает и добавляет новый объект Index

' в таблицу "Сотрудники".

Set idxCountry = .CreateIndex("ИндексСтрана")

idxCountry.Fields.Append _

idxCountry.CreateField("Страна")

.Indexes.Append idxCountry

' Чтобы новое значение свойства DistinctCount стало

' доступным, необходимо обновить семейство.

.Indexes.Refresh

' Отображает семейство Indexes, чтобы показать

' текущие значения свойства DistinctCount.

Debug.Print "Семейство Indexes до добавления записи"

For Each idxLoop In .Indexes

Debug.Print "    DistinctCount = " & _

idxLoop.DistinctCount & ", Name = " & _

idxLoop.Name

Next idxLoop

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

' Добавляет новую запись в таблицу "Сотрудники".

With rstEmployees

.AddNew

!Имя = "Петр"

!Фамилия = "Петров"

!Страна = "Чад"

.Update

End With

' Отображает семейство Indexes, чтобы показать

' измененные значения свойства DistinctCount.

Debug.Print "Семейство Indexes после добавления записи " & _

"и обновления семейства"

.Indexes.Refresh

For Each idxLoop In .Indexes

Debug.Print "    DistinctCount = " & _

idxLoop.DistinctCount & ", Имя = " & _

idxLoop.Name

Next idxLoop

' Удаляет новую запись, созданную только для демонстрации.

With rstEmployees

.Bookmark = .LastModified

.Delete

.Close

End With

' Удаляет новое семейство Indexes, созданное для демонстрации.

.Indexes.Delete idxCountry.Name

End With

dbsNorthwind.Close

End Sub


Свойство EditMode, пример

Следующая программа демонстрирует значение свойства EditMode при разных условиях.  Для выполнения данной процедуры требуется функция EditModeOutput.

Sub EditModeX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

' Демонстрирует значение свойства EditMode в разных

' режимах редактирования.

With rstEmployees

EditModeOutput "До вызова метода Edit или AddNew:", .EditMode

.Edit

EditModeOutput "После вызова метода Edit:", .EditMode

.Update

EditModeOutput "После вызова метода Update:", .EditMode

.AddNew

EditModeOutput "После вызова метода AddNew:", .EditMode

.CancelUpdate

EditModeOutput "После вызова метода CancelUpdate:", .EditMode

.Close

End With

dbsNorthwind.Close

End Sub

Function EditModeOutput(strTemp As String, _

intEditMode As Integer)

' Печатает отчет о значениях свойства EditMode.

Debug.Print strTemp

Debug.Print "    EditMode = ";

Select Case intEditMode

Case dbEditNone

Debug.Print "dbEditNone"

Case dbEditInProgress

Debug.Print "dbEditInProgress"

Case dbEditAdd

Debug.Print "dbEditAdd"

End Select

End Function


Свойство FieldSize, пример

Следующая программа использует свойство FieldSize для отображения количества байтов, используемых объектами Field типа Memo и Long Binary в двух таблицах.

Sub FieldSizeX()

Dim dbsNorthwind As Database

Dim rstCategories As Recordset

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstCategories = _

dbsNorthwind.OpenRecordset("Типы", _

dbOpenDynaset)

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

Debug.Print _

"Размеры полей в таблице 'Типы'"

With rstCategories

Debug.Print "    Категория - " & _

"Описание (байт) - Иллюстрация (байт)"

' Отображает объект Recordset 'Типы' и печатает размеры

' полей в байтах для каждой записи.

Do While Not .EOF

Debug.Print "        " & !Категория & " - " & _

!Описание.FieldSize & " - " & _

!Иллюстация.FieldSize

.MoveNext

Loop

.Close

End With

Debug.Print "Размеры полей в таблице 'Сотрудники'"

With rstEmployees

Debug.Print "    Фамилия - Примечания (байт) - " & _

"Фотография (байт)"

' Отображает объект Recordset Сотрудники' и печатает размеры

' полей в байтах для каждой записи.

Do While Not .EOF

Debug.Print "        " & !Фамилия & " - " & _

!Примечания.FieldSize & " - " & !Фотография.FieldSize

.MoveNext

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Свойство Filter, пример

Следующая программа использует свойство Filter для создания нового объекта Recordset на основе существующего объекта Recordset и применения определенного условия.  Для выполнения данной процедуры требуется функция FilterField.

Sub FilterX()

Dim dbsNorthwind As Database

Dim rstOrders As Recordset

Dim intOrders As Integer

Dim strCountry As String

Dim rstOrdersCountry As Recordset

Dim strMessage As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstOrders = dbsNorthwind.OpenRecordset("Заказы", _

dbOpenSnapshot)

' Заполняет объект Recordset.

rstOrders.MoveLast

intOrders = rstOrders.RecordCount

' Принимает данные от пользователя.

strCountry = Trim(InputBox( _

"Введите название страны:"))

If strCountry <> "" Then

' Открывает отобранный объект Recordset.

Set rstOrdersCountry = _

FilterField(rstOrders, "СтранаПолучателя", strCountry)

With rstOrdersCountry

' Проверяет свойство RecordCount перед заполнением объекта;

' Recordset, чтобы не возникла ошибка.

If .RecordCount <> 0 Then .MoveLast

' Печатает число записей в исходном объекте

' и в объекте Recordset после отбора.

strMessage = "Заказы в исходном наборе записей: " & _

vbCr & intOrders & vbCr & _

"Заказы в отобранном наборе записей (Страна = '" & _

strCountry & "'): " & vbCr & .RecordCount

MsgBox strMessage

.Close

End With

End If

rstOrders.Close

dbsNorthwind.Close

End Sub

Function FilterField(rstTemp As Recordset, _

strField As String, strFilter As String) As Recordset

' Устанавливает фильтр для указанного объекта Recordset

' и открывает новый объект Recordset.

rstTemp.Filter = strField & " = '" & strFilter & "'"

Set FilterField = rstTemp.OpenRecordset

End Function

Примечание.   Для просмотра результатов отбора записей из объекта rstOrders необходимо определить для него свойство Filter, а затем открыть второй объект Recordset на основе rstOrders.

Примечание.   Если известно, какие данные следует отобрать, обычно удобнее создать объект Recordset с помощью инструкции SQL.  Ниже показано, как отобрать данные для конкретной страны с помощью одного объекта Recordset.

Sub FilterX2()

Dim dbsNorthwind As Database

Dim rstOrders As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Открывает объект Recordset, в котором из таблицы

' отбираются данные по значению поля 'СтранаПолучателя'.

Set rstOrders = _

dbsNorthwind.OpenRecordset("SELECT * " & _

"FROM Заказы WHERE СтранаПолучателя = 'USA'", _

dbOpenSnapshot)

rstOrders.Close

dbsNorthwind.Close

End Sub


Свойство Foreign, пример

Следующая программа демонстрирует использование свойства Foreign для указания, какие объекты Index в объекте TableDef представляют внешний ключ.  Такие индексы создаются ядром базы данных Microsoft Jet при создании объекта Relation.  Именем, которое по умолчанию получают индексы внешнего ключа, является комбинация имени главной таблицы и имени внешней таблицы.  Для выполнения данной процедуры требуется функция ForeignOutput.

Sub ForeignX()

Dim dbsNorthwind As Database

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Печатает отчет об индексах внешнего ключа для трех

' объектов TableDef.

ForeignOutput .TableDefs!Товары

ForeignOutput .TableDefs!Заказы

ForeignOutput .TableDefs!Заказано

.Close

End With

End Sub

Function ForeignOutput(tdfTemp As TableDef)

Dim idxLoop As Index

With tdfTemp

Debug.Print "Индексы в " & .Name & " TableDef"

' Отображает семейство Indexes указанного

' объекта TableDef.

For Each idxLoop In .Indexes

Debug.Print "    " & idxLoop.Name

Debug.Print "        Foreign = " & idxLoop.Foreign

Next idxLoop

End With

End Function


Свойства ForeignName, ForeignTable и Table, пример

Следующая программа демонстрирует применение свойств Table, ForeignTable и ForeignName для определения параметров объекта Relation (связи) между двумя таблицами.

Sub ForeignNameX()

Dim dbsNorthwind As Database

Dim relLoop As Relation

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Debug.Print "Связь"

Debug.Print "                    Table - Field"

Debug.Print "    Главная (сторона 'один')   ";

Debug.Print ".Table - .Fields(0).Name"

Debug.Print "    Внешняя (сторона 'многие')  ";

Debug.Print ".ForeignTable - .Fields(0).ForeignName"

' Отображает семейство Relations базы данных 'Борей',

' значения свойств объекта Relation и содержащихся

' в нем объектов Field.

For Each relLoop In dbsNorthwind.Relations

With relLoop

Debug.Print

Debug.Print "Связь " & .Name

Debug.Print "                    Таблица - Поле"

Debug.Print "    Главная (сторона 'один')   ";

Debug.Print .Table & " - " & .Fields(0).Name

Debug.Print "    Внешняя (сторона 'многие')  ";

Debug.Print .ForeignTable & " - " & _

.Fields(0).ForeignName

End With

Next relLoop

dbsNorthwind.Close

End Sub


Свойство IgnoreNulls, пример

Следующая программа задает для свойства IgnoreNulls нового объекта Index значение True или False в зависимости от данных, введенных пользователем, а затем демонстрирует результат для объекта Recordset, содержащего запись со значением Null в ключевом поле.

Sub IgnoreNullsX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim idxNew As Index

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind!Сотрудники

With tdfEmployees

' Создает новый объект Index.

Set idxNew = .CreateIndex("НовыйИндекс")

idxNew.Fields.Append idxNew.CreateField("Страна")

' Задает значение свойства IgnoreNulls нового объекта Index,

' зависящее от данных, введенных пользователем.

Select Case MsgBox("Задать для IgnoreNulls значение True?", _

vbYesNoCancel)

Case vbYes

idxNew.IgnoreNulls = True

Case vbNo

idxNew.IgnoreNulls = False

Case Else

dbsNorthwind.Close

End

End Select

' Добавляет новый объект Index в семейство Indexes

' таблицы "Сотрудники".

.Indexes.Append idxNew

.Indexes.Refresh

End With

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

' Добавляет новую запись в таблицу "Сотрудники".

.AddNew

!Имя = "Иван"

!Фамилия = "Иванов"

.Update

' Задает порядок записей с помощью нового индекса.

.Index = idxNew.Name

.MoveFirst

Debug.Print "Индекс = " & .Index & _

", IgnoreNulls = " & idxNew.IgnoreNulls

Debug.Print "    Страна - Имя"

' Отображает объект Recordset. Значение свойства

' IgnoreNulls определяет, будет ли новая запись

' отображаться при выводе результатов.

Do While Not .EOF

Debug.Print "        " & _

IIf(IsNull(!Страна), "[Null]", !Страна) & _

" - " & !Имя & " " & !Фамилия

.MoveNext

Loop

' Удаляет новую запись, созданную только для демонстрации.

.Index = ""

.Bookmark = .LastModified

.Delete

.Close

End With

' Удаляет новый объект Index, созданный только для демонстрации.

tdfEmployees.Indexes.Delete idxNew.Name

dbsNorthwind.Close

End Sub


Свойство Index, пример

Следующая программа использует свойство Index, чтобы изменить порядок записей в табличном объекте Recordset.

Sub IndexPropertyX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim rstEmployees As Recordset

Dim idxLoop As Index

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

Set tdfEmployees = dbsNorthwind.TableDefs!Сотрудники

With rstEmployees

' Отображает семейство Indexes таблицы "Сотрудники".

For Each idxLoop In tdfEmployees.Indexes

.Index = idxLoop.Name

Debug.Print "Индекс = " & .Index

Debug.Print "    КодСотрудника - Индекс - Имя"

.MoveFirst

' Цикл по всем компонентам объекта Recordset,

' демонстрирующий порядок записей.

Do While Not .EOF

Debug.Print "        " & !КодСотрудника & " - " & _

!Индекс & " - " & !Имя & " " & _

!Фамилия

.MoveNext

Loop

Next idxLoop

.Close

End With

dbsNorthwind.Close

End Sub


Свойство LastModified, пример

Следующая программа использует свойство LastModified для перевода указателя текущей записи на измененную запись или на новую запись.

Sub LastModifiedX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim strFirst As String

Dim strLast As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

With rstEmployees

' Сохраняет текущие данные.

strFirst = !Имя

strLast = !Фамилия

' Изменяет данные в текущей записи.

.Edit

!Имя = "Иван"

!Фамилия = "Иванов"

.Update

' Переводит указатель текущей записи на последнюю

' измененную или добавленную запись.

.Bookmark = .LastModified

Debug.Print _

"Последние измененные данные после вызова Edit: " & _

!Имя & " " & !Фамилия

' Восстанавливает исходные данные,

' измененные только для демонстрации.

.Edit

!Имя = strFirst

!Фамилия = strLast

.Update

' Добавляет новую запись.

.AddNew

!Имя = "Петр"

!Фамилия = "Петров"

.Update

' Переводит указатель текущей записи на последнюю

' измененную или добавленную запись.

.Bookmark = .LastModified

Debug.Print _

"Последние измененные данные после вызова AddNew: " & _

!Имя & " " & !Фамилия

' Удаляет новую запись, созданную только для демонстрации.

.Delete

.Close

End With

dbsNorthwind.Close

End Sub


Свойство LockEdits, пример

Следующая программа демонстрирует установление жесткой блокировки с помощью значения True свойства LockEdits, а затем установление нежесткой блокировки с помощью значения False свойства LockEdits.  Иллюстрируется также способ обработки ошибок, требуемый при изменении значения поля в сетевой базе данных.  Для выполнения данной процедуры требуются функции PessimisticLock и OptimisticLock.

Sub LockEditsX()

Dim dbsNorthwind As Database

Dim rstCustomers As Recordset

Dim strOldName As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstCustomers = _

dbsNorthwind.OpenRecordset("Клиенты", _

dbOpenDynaset)

With rstCustomers

' Сохраняет исходные данные.

strOldName = !Название

If MsgBox("Демонстрация жесткой блокировки...", _

vbOKCancel) = vbOK Then

' Попытка изменить данные при действующей

' жесткой блокировке.

If PessimisticLock(rstCustomers, !Название, _

"Мухомор") Then

MsgBox "Запись успешно изменена."

' Восстанавливает исходные данные...

.Edit

!Название = strOldName

.Update

End If

End If

If MsgBox("Демонстрация нежесткой блокировки...", _

vbOKCancel) = vbOK Then

' Попытка изменить данные при действующей

' нежесткой блокировке.

If OptimisticLock(rstCustomers, !Название, _

"Мухомор") Then

MsgBox "Запись успешно изменена."

' Восстанавливает исходные данные...

.Edit

!Название = strOldName

.Update

End If

End If

.Close

End With

dbsNorthwind.Close

End Sub

Function PessimisticLock(rstTemp As Recordset, _

fldTemp As Field, strNew As String) As Boolean

dim ErrLoop as Error

PessimisticLock = True

With rstTemp

.LockEdits = True

' После задания для свойства LockEdits значения True,

' перехватываются ошибки при вызове метода Edit.

On Error GoTo Err_Lock

.Edit

On Error GoTo 0

' Если метод Edit еще выполняется, ошибки не возникают;

' пользователь имеет возможность изменять данные.

If .EditMode = dbEditInProgress Then

fldTemp = strNew

.Update

.Bookmark = .LastModified

Else

' Загружает текущую запись для просмотра изменений,

' сделанных другим пользователем.

.Move 0

End If

End With

Exit Function

Err_Lock:

If DBEngine.Errors.Count > 0 Then

' Отображает семейство Errors.

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & _

vbCr & errLoop.Description

Next errLoop

PessimisticLock = False

End If

Resume Next

End Function

Function OptimisticLock(rstTemp As Recordset, _

fldTemp As Field, strNew As String) As Boolean

dim ErrLoop as Error

OptimisticLock = True

With rstTemp

.LockEdits = False

.Edit

fldTemp = strNew

' После задания для свойства LockEdits значения False,

' перехватываются ошибки при вызове метода Update.

On Error GoTo Err_Lock

.Update

On Error GoTo 0

' Если метод Edit не выполняется, ошибки не возникают;

' пользователь имеет возможность изменять данные.

If .EditMode = dbEditNone Then

' Переводит указатель текущей записи на последнюю

' измененную запись.

.Bookmark = .LastModified

Else

.CancelUpdate

' Загружает текущую запись для просмотра изменений,

' сделанных другим пользователем.

.Move 0

End If

End With

Exit Function

Err_Lock:

If DBEngine.Errors.Count > 0 Then

' Отображает семейство Errors.

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & _

vbCr & errLoop.Description

Next errLoop

OptimisticLock = False

End If

Resume Next

End Function


Свойство NoMatch, пример

Следующая программа использует свойство NoMatch для проверки выполнения методов Seek и FindFirst и для соответствующей обработки при неудаче.  Для выполнения данной процедуры требуются процедуры SeekMatch и FindMatch.

Sub NoMatchX()

Dim dbsNorthwind As Database

Dim rstProducts As Recordset

Dim rstCustomers As Recordset

Dim strMessage As String

Dim strSeek As String

Dim strCountry As String

Dim varBookmark As Variant

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Значение по умолчанию dbOpenTable;

' необходимо, если будет использоваться свойство Index.

Set rstProducts = dbsNorthwind.OpenRecordset("Товары")

With rstProducts

.Index = "PrimaryKey"

Do While True

' Отображает сведения о текущей записи;

' выводит приглашение пользователю.

strMessage = "Свойство NoMatch для метода Seek " & vbCr & _

"Код товара: " & !КодТовара & vbCr & _

"Марка: " & !Марка & vbCr & _

"NoMatch = " & .NoMatch & vbCr & vbCr & _

"Введите код товара."

strSeek = InputBox(strMessage)

If strSeek = "" Then Exit Do

' Вызывает процедуру для поиска записей

' с кодом товара, указанным пользователем.

SeekMatch rstProducts, Val(strSeek)

Loop

.Close

End With

Set rstCustomers = dbsNorthwind.OpenRecordset( _

"SELECT Название, Страна FROM Клиенты " & _

"ORDER BY Название", dbOpenSnapshot)

With rstCustomers

Do While True

' Отображает сведения о текущей записи;

' выводит приглашение пользователю.

strMessage = "Свойство NoMatch для метода FindFirst" & _

vbCr & "Клиент: " & !Название & _

vbCr & "Страна: " & !Страна & vbCr & _

"NoMatch = " & .NoMatch & vbCr & vbCr & _

"Введите название страны."

strCountry = Trim(InputBox(strMessage))

If strCountry = "" Then Exit Do

' Вызывает процедуру для поиска записей

' для страны, указанной пользователем.

FindMatch rstCustomers, _

"Страна = '" & strCountry & "'"

Loop

.Close

End With

dbsNorthwind.Close

End Sub

Sub SeekMatch(rstTemp As Recordset, _

intSeek As Integer)

Dim varBookmark As Variant

Dim strMessage As String

With rstTemp

' Запоминает положение текущей записи.

varBookmark = .Bookmark

.Seek "=", intSeek

' При неудачном поиске в методе Seek, уведомляет

' пользователя и возвращается на бывшую текущую запись.

If .NoMatch Then

strMessage = _

"Запись не найдена! Возврат на текущую запись." & _

vbCr & vbCr & "NoMatch = " & .NoMatch

MsgBox strMessage

.Bookmark = varBookmark

End If

End With

End Sub

Sub FindMatch(rstTemp As Recordset, _

strFind As String)

Dim varBookmark As Variant

Dim strMessage As String

With rstTemp

' Запоминает положение текущей записи.

varBookmark = .Bookmark

.FindFirst strFind

' При неудачном поиске в методе Find, уведомляет

' пользователя и возвращается на бывшую текущую запись.

If .NoMatch Then

strMessage = _

"Запись не найдена! Возврат на текущую запись." & _

vbCr & vbCr & "NoMatch = " & .NoMatch

MsgBox strMessage

.Bookmark = varBookmark

End If

End With

End Sub


Свойство OrdinalPosition, пример

Следующая программа изменяет значения свойства OrdinalPosition для таблицы "Сотрудники", чтобы контролировать порядок объектов Field в объекте Recordset.  При заданном значении 1 для свойств OrdinalPosition всех объектов Fields поля в объекте Recordset будут размещаться в алфавитном порядке.  Следует помнить, что значения свойства OrdinalPosition в объекте Recordset не совпадают со значениями в объекте TableDef, но отражают конечные результаты изменения объекта TableDef.

Sub OrdinalPositionX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim aintPosition() As Integer

Dim astrFieldName() As String

Dim intTemp As Integer

Dim fldTemp As Field

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind.TableDefs("Сотрудники")

With tdfEmployees

' Отображает и сохраняет исходные значения OrdinalPosition.

Debug.Print _

"Исходные значения OrdinalPosition в объекте TableDef."

ReDim aintPosition(0 To .Fields.Count - 1) As Integer

ReDim astrFieldName(0 To .Fields.Count - 1) As String

For intTemp = 0 To .Fields.Count - 1

aintPosition(intTemp) = _

.Fields(intTemp).OrdinalPosition

astrFieldName(intTemp) = .Fields(intTemp).Name

Debug.Print , aintPosition(intTemp), _

astrFieldName(intTemp)

Next intTemp

' Изменяет значения свойства OrdinalPosition.

For Each fldTemp In .Fields

fldTemp.OrdinalPosition = 1

Next fldTemp

' Открывает новый объект Recordset, чтобы показать, как

' значения OrdinalPosition изменяют порядок записей.

Debug.Print _

"Значения OrdinalPosition в новом объекте Recordset."

Set rstEmployees = dbsNorthwind.OpenRecordset( _

"SELECT * FROM Сотрудники")

For Each fldTemp In rstEmployees.Fields

Debug.Print , fldTemp.OrdinalPosition, fldTemp.Name

Next fldTemp

rstEmployees.Close

' Восстанавливает исходные значения свойства OrdinalPosition,

' измененные для демонстрации.

For intTemp = 0 To .Fields.Count - 1

.Fields(astrFieldName(intTemp)).OrdinalPosition = _

aintPosition(intTemp)

Next intTemp

End With

dbsNorthwind.Close

End Sub


Свойство PercentPosition, пример

Следующая программа использует свойство PercentPosition для демонстрации позиции указателя текущей записи относительно начала объекта Recordset.

Sub PercentPositionX()

Dim dbsNorthwind As Database

Dim rstProducts As Recordset

Dim strFind As String

Dim strMessage As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Свойство PercentPosition применимо только

' к динамическим и статическим наборам записей.

Set rstProducts = dbsNorthwind.OpenRecordset( _

"SELECT Марка FROM Товары " & _

"ORDER BY Марка", dbOpenSnapshot)

With rstProducts

' Заполняет объект Recordset.

.MoveLast

.MoveFirst

Do While True

' Отображает сведения о текущей записи

' и выводит приглашение пользователю.

strMessage = "Товар: " & !Марка & vbCr & _

"Указатель текущей записи находится на " & _

Format(.PercentPosition, "##0.0") & _

"% от " & vbCr & _

"начала объекта Recordset." & vbCr & _

"Введите образец для поиска " & _

"названия товара."

strFind = Trim(InputBox(strMessage))

If strFind = "" Then Exit Do

' Поиск записи, удовлетворяющей образцу.

.FindFirst "Марка >= '" & strFind & "'"

If .NoMatch Then .MoveLast

Loop

.Close

End With

dbsNorthwind.Close

End Sub


Свойство Primary, пример

Следующая программа использует свойство Primary, чтобы назначить новый объект Index нового объекта TableDef первичным индексом таблицы.  Следует помнить, что значение True свойства Primary автоматически задает также значение True для свойств Unique и Required.

Sub PrimaryX()

Dim dbsNorthwind As Database

Dim tdfNew As TableDef

Dim idxNew As Index

Dim idxLoop As Index

Dim fldLoop As Field

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает и добавляет новый объект TableDef в семейство

' TableDefs базы данных "Борей".

Set tdfNew = dbsNorthwind.CreateTableDef("НоваяТаблица")

tdfNew.Fields.Append tdfNew.CreateField("ЧисловоеПоле", _

dbLong, 20)

tdfNew.Fields.Append tdfNew.CreateField("ТекстовоеПоле", _

dbText, 20)

dbsNorthwind.TableDefs.Append tdfNew

With tdfNew

' Создает и добавляет новый объект Index в

' семейство Indexes нового объекта TableDef.

Set idxNew = .CreateIndex("ЧисловойИндекс")

idxNew.Fields.Append idxNew.CreateField("ЧисловоеПоле")

idxNew.Primary = True

.Indexes.Append idxNew

Set idxNew = .CreateIndex("ТекстовыйИндекс")

idxNew.Fields.Append idxNew.CreateField("ТекстовоеПоле")

.Indexes.Append idxNew

Debug.Print .Indexes.Count & " Индексы в таблице " & _

.Name

' Отображает семейство Indexes.

For Each idxLoop In .Indexes

With idxLoop

Debug.Print "    " & .Name

' Отображает семейство Fields каждого

' объекта Index.

Debug.Print "        Fields"

For Each fldLoop In .Fields

Debug.Print "            " & fldLoop.Name

Next fldLoop

' Отображает семейство Properties каждого

' объекта Index.

Debug.Print "        Свойства"

For Each prpLoop In .Properties

Debug.Print "            " & prpLoop.Name & _

" = " & IIf(prpLoop = "", "[empty]", _

prpLoop)

Next prpLoop

End With

Next idxLoop

End With

dbsNorthwind.TableDefs.Delete tdfNew.Name

dbsNorthwind.Close

End Sub


Свойство RecordCount, пример

Следующая программа демонстрирует применение свойства RecordCount для различных типов объектов Recordsets до и после их заполнения.

Sub RecordCountX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Открывает табличный объект Recordset и отображает

' свойство RecordCount.

Set rstEmployees = .OpenRecordset("Сотрудники")

Debug.Print _

"Табличный набор записей для таблицы 'Сотрудники'"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

rstEmployees.Close

' Открывает динамический объект Recordset и отображает

' свойство RecordCount до заполнения набора записей.

Set rstEmployees = .OpenRecordset("Сотрудники", _

dbOpenDynaset)

Debug.Print "Динамический набор записей " & _

"для таблицы 'Сотрудники' до вызова MoveLast"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

' Отображает свойство RecordCount после заполнения набора

' записей.

rstEmployees.MoveLast

Debug.Print "Динамический набор записей " & _

"для таблицы 'Сотрудники' после вызова MoveLast"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

rstEmployees.Close

' Открывает статический объект Recordset и отображает

' свойство RecordCount до заполнения набора записей.

Set rstEmployees = .OpenRecordset("Сотрудники", _

dbOpenSnapshot)

Debug.Print "Статический набор записей " & _

"для таблицы 'Сотрудники' до вызова MoveLast"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

' Отображает свойство RecordCount после заполнения набора

' записей.

rstEmployees.MoveLast

Debug.Print "Статический набор записей " & _

"для таблицы 'Сотрудники' после вызова MoveLast"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

rstEmployees.Close

' Открывает объект Recordset с последовательным доступом и

' отображает свойство RecordCount до заполнения набора.

Set rstEmployees = .OpenRecordset("Сотрудники", _

dbOpenForwardOnly)

Debug.Print "Набор записей с последовательным доступом " & _

"для таблицы 'Сотрудники' до вызова MoveNext"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

' Отображает свойство RecordCount после заполнения набора

' записей.

rstEmployees.MoveNext

Debug.Print "Набор записей с последовательным доступом " & _

"для таблицы 'Сотрудники' после вызова MoveNext"

Debug.Print "    RecordCount = " & _

rstEmployees.RecordCount

rstEmployees.Close

.Close

End With

End Sub


Свойство RecordsAffected, пример

Следующая программа использует свойство RecordsAffected с запросами на изменение, выполняемыми из объектов Database и QueryDef.  Для выполнения данной процедуры требуется функция RecordsAffectedOutput.

Sub RecordsAffectedX()

Dim dbsNorthwind As Database

Dim qdfTemp As QueryDef

Dim strSQLChange As String

Dim strSQLRestore As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Печатает отчет о содержимом таблицы 'Сотрудники'.

Debug.Print _

"Число записей в таблице 'Сотрудники': " & _

.TableDefs!Сотрудники.RecordCount

RecordsAffectedOutput dbsNorthwind

' Определяет и выполняет запрос на изменение.

strSQLChange = "UPDATE Сотрудники " & _

"SET Страна = 'Россия' " & _

"WHERE Страна = 'РФ'"

.Execute strSQLChange

' Печатает отчет о содержимом таблицы 'Сотрудники'.

Debug.Print _

"Свойство RecordsAffected после выполнения " & _

"запроса из объекта Database: " & .RecordsAffected

RecordsAffectedOutput dbsNorthwind

' Определяет и выполняет второй запрос на изменение.

strSQLRestore = "UPDATE Сотрудники " & _

"SET Страна = 'Россия' " & _

"WHERE Страна = 'РФ' "

Set qdfTemp = .CreateQueryDef("", strSQLRestore)

qdfTemp.Execute

' Печатает отчет о содержимом таблицы 'Сотрудники'.

Debug.Print _

"Свойство RecordsAffected после выполнения " & _

"запроса из объекта QueryDef: " & qdfTemp.RecordsAffected

RecordsAffectedOutput dbsNorthwind

.Close

End With

End Sub

Function RecordsAffectedOutput(dbsNorthwind As Database)

Dim rstEmployees As Recordset

' Открывает объект Recordset для таблицы 'Сотрудники'.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

' Цикл по всем компонентам объекта Recordset.

.MoveFirst

Do While Not .EOF

Debug.Print "    " & !Фамилия & ", " & !Страна

.MoveNext

Loop

.Close

End With

End Function


Свойство Restartable, пример

Следующая программа демонстрирует применение свойства Restartable к различным объектам Recordset.

Sub RestartableX()

Dim dbsNorthwind As Database

Dim rstTemp As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Открывает табличный объект Recordset

' и печатает его свойство Restartable.

Set rstTemp = .OpenRecordset("Сотрудники", dbOpenTable)

Debug.Print _

"Табличный набор записей для таблицы 'Сотрудники'"

Debug.Print "    Restartable = " & rstTemp.Restartable

rstTemp.Close

' Открывает объект Recordset из инструкции SQL

' и печатает его свойство Restartable.

Set rstTemp = _

.OpenRecordset("SELECT * FROM Сотрудники")

Debug.Print "Объект Recordset, открытый из инструкции SQL"

Debug.Print "    Restartable = " & rstTemp.Restartable

rstTemp.Close

' Открывает объект Recordset сохраненного объекта QueryDef

' и печатает его свойство Restartable.

Set rstTemp = .OpenRecordset("Список товаров")

Debug.Print _

"Объект Recordset, открытый из объекта QueryDef (" & _

rstTemp.Name & ")"

Debug.Print "    Restartable = " & rstTemp.Restartable

rstTemp.Close

.Close

End With

End Sub


Свойство Size, пример

Следующая программа демонстрирует применение свойства Size, печатая перечень имен и размеров объектов Field из таблицы "Сотрудники.

Sub SizeX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim fldNew As Field

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind.TableDefs!Сотрудники

With tdfEmployees

' Создает и добавляет новый объект Field

' в таблицу "Сотрудники".

Set fldNew = .CreateField("ФаксТел")

fldNew.Type = dbText

fldNew.Size = 20

.Fields.Append fldNew

Debug.Print "Таблица: " & .Name

Debug.Print "    Field.Name - Field.Type - Field.Size"

' Отображает семейство Fields; печатая имена,

' типы и размеры полей.

For Each fldLoop In .Fields

Debug.Print "        " & fldLoop.Name & " - " & _

fldLoop.Type & " - " & fldLoop.Size

Next fldLoop

' Удаляет новое поле, созданное только для демонстрации.

.Fields.Delete fldNew.Name

End With

dbsNorthwind.Close

End Sub


Свойство Sort, пример

Следующая программа демонстрирует применение свойства Sort, изменяя его значение и создавая новый объект Recordset.  Для выполнения данной процедуры требуется функция SortOutput.

Sub SortX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim rstSortEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

With rstEmployees

SortOutput "Исходный объект Recordset:", rstEmployees

.Sort = "Фамилия, Имя"

' Печатает отчет, показывая значение свойства Sort

' и порядок записей.

SortOutput _

"Объект Recordset после изменения свойства Sort:", _

rstEmployees

' Открывает новый объект Recordset из текущего.

Set rstSortEmployees = .OpenRecordset

' Печатает отчет, показывая значение свойства Sort

' и порядок записей.

SortOutput "Новый объект Recordset:", rstSortEmployees

rstSortEmployees.Close

.Close

End With

dbsNorthwind.Close

End Sub

Function SortOutput(strTemp As String, _

rstTemp As Recordset)

With rstTemp

Debug.Print strTemp

Debug.Print "    Sort = " & _

IIf(.Sort <> "", .Sort, "[Empty]")

.MoveFirst

' Цикл по всем компонентам объекта Recordset.

Do While Not .EOF

Debug.Print "        " & !Фамилия & _

", " & !Имя

.MoveNext

Loop

End With

End Function

Примечание.  Если известно, какие данные следует отобрать, обычно удобнее создать объект Recordset с помощью инструкции SQL.  Ниже показано, как отобрать те же данные с помощью одного объекта Recordset.

Sub SortX2()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Открывает объект Recordset с помощью инструкции SQL,

' которая задает порядок сортировки.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("SELECT * " & _

"FROM Сотрудники ORDER BY Фамилия, Имя", _

dbOpenDynaset)

dbsNorthwind.Close

End Sub


Свойства SourceField и SourceTable, пример

Следующая программа демонстрирует применение свойств SourceField и SourceTable путем открытия объекта Recordset, образованного из полей двух таблиц.

Sub SourceFieldX()

Dim dbsNorthwind As Database

Dim rstProductCategory As Recordset

Dim fldLoop As Field

Dim strSQL As String

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Открывает объект Recordset с помощью инструкции SQL,

' в которой используются поля из двух разных таблиц.

strSQL = "SELECT КодТовара AS Код, " & _

"Марка AS Товар, " & _

"Типы.КодТипа AS Тип, " & _

"Категория AS Сорт " & _

"FROM Типы INNER JOIN Товары ON " & _

"Типы.КодТипа = Товары.КодТипа " & _

"ORDER BY Марка"

Set rstProductCategory = _

dbsNorthwind.OpenRecordset(strSQL)

Debug.Print "Поле - SourceTable - SourceField"

' Отображает семейство Fields объекта Recordset, печатая

' имя поля, имя исходной таблицы и имя исходного поля.

For Each fldLoop In rstProductCategory.Fields

Debug.Print "    " & fldLoop.Name & " - " & _

fldLoop.SourceTable & " - " & fldLoop.SourceField

Next fldLoop

rstProductCategory.Close

dbsNorthwind.Close

End Sub


Свойство SQL, пример

Следующая программа демонстрирует применение свойства SQL, задавая и изменяя значение свойства SQL временного объекта QueryDef, а затем сравнивая результаты.  Для выполнения данной процедуры требуется функция SQLOutput.

Sub SQLX()

Dim dbsNorthwind As Database

Dim qdfTemp As QueryDef

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set qdfTemp = dbsNorthwind.CreateQueryDef("")

' Открывает объект Recordset с помощью временного

' объекта QueryDef и печатает отчет.

SQLOutput "SELECT * FROM Сотрудники " & _

"WHERE Страна = 'Литва' " & _

"ORDER BY Фамилия", qdfTemp

' Открывает объект Recordset с помощью временного

' объекта QueryDef и печатает отчет.

SQLOutput "SELECT * FROM Сотрудники " & _

"WHERE Страна = 'Латвия' " & _

"ORDER BY Фамилия", qdfTemp

dbsNorthwind.Close

End Sub

Function SQLOutput(strSQL As String, qdfTemp As QueryDef)

Dim rstEmployees As Recordset

' Определяет свойство SQL временного объекта QueryDef

' и открывает объект Recordset.

qdfTemp.SQL = strSQL

Set rstEmployees = qdfTemp.OpenRecordset

Debug.Print strSQL

With rstEmployees

' Цикл по всем компонентам объекта Recordset.

Do While Not .EOF

Debug.Print "    " & !Имя & " " & _

!Фамилия & ", " & !Страна

.MoveNext

Loop

.Close

End With

End Function


Свойство Type, пример

Следующая программа демонстрирует применение свойства Type, возвращая имя константы, соответствующей значению свойства Type четырех разных объектов Recordsets.  Для выполнения данной процедуры требуется функция RecordsetType.

Sub TypeX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' По умолчанию используется константа dbOpenTable.

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

Debug.Print _

"Табличный объект Recordset (таблица 'Сотрудники'): " & _

RecordsetType(rstEmployees.Type)

rstEmployees.Close

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenDynaset)

Debug.Print _

"Динамический набор записей (таблица 'Сотрудники'): " & _

RecordsetType(rstEmployees.Type)

rstEmployees.Close

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenSnapshot)

Debug.Print _

"Статический набор записей (таблица 'Сотрудники'): " & _

RecordsetType(rstEmployees.Type)

rstEmployees.Close

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники", _

dbOpenForwardOnly)

Debug.Print _

"Набор с последовательным доступом (таблица 'Сотрудники'): " & _

RecordsetType(rstEmployees.Type)

rstEmployees.Close

dbsNorthwind.Close

End Sub

Function RecordsetType(intType As Integer) As String

Select Case intType

Case dbOpenTable

RecordsetType = "dbOpenTable"

Case dbOpenDynaset

RecordsetType = "dbOpenDynaset"

Case dbOpenSnapshot

RecordsetType = "dbOpenSnapshot"

Case dbOpenForwardOnly

RecordsetType = "dbOpenForwardOnly"

End Select

End Function

Следующая программа демонстрирует применение свойства Type, возвращая имена констант, соответствующих значениям свойства Type всех объектов Field в таблице "Сотрудники.  Для выполнения данной процедуры требуется функция FieldType.

Sub TypeX2()

Dim dbsNorthwind As Database

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Debug.Print "Поля в таблице 'Сотрудники':"

Debug.Print "    Тип - Имя"

' Отображает семейство Fields таблицы "Сотрудники".

For Each fldLoop In _

dbsNorthwind.TableDefs!Сотрудники.Fields

Debug.Print "        " & FieldType(fldLoop.Type) & _

" - " & fldLoop.Name

Next fldLoop

dbsNorthwind.Close

End Sub

Function FieldType(intType As Integer) As String

Select Case intType

Case dbBoolean

FieldType = "dbBoolean"

Case dbByte

FieldType = "dbByte"

Case dbInteger

FieldType = "dbInteger"

Case dbLong

FieldType = "dbLong"

Case dbCurrency

FieldType = "dbCurrency"

Case dbSingle

FieldType = "dbSingle"

Case dbDouble

FieldType = "dbDouble"

Case dbDate

FieldType = "dbDate"

Case dbText

FieldType = "dbText"

Case dbLongBinary

FieldType = "dbLongBinary"

Case dbMemo

FieldType = "dbMemo"

Case dbGUID

FieldType = "dbGUID"

End Select

End Function

Следующая программа демонстрирует применение свойства Type, возвращая имена констант, соответствующих значениям свойства Type всех объектов QueryDef в базе данных "Борей".  Для выполнения данной процедуры требуется функция QueryDefType.

Sub TypeX3()

Dim dbsNorthwind As Database

Dim qdfLoop As QueryDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Debug.Print "Запросы в базе данных 'Борей':"

Debug.Print "    Тип - Имя"

' Отображает семейство QueryDefs базы данных "Борей".

For Each qdfLoop In dbsNorthwind.QueryDefs

Debug.Print "        " & _

QueryDefType(qdfLoop.Type) & " - " & qdfLoop.Name

Next qdfLoop

dbsNorthwind.Close

End Sub

Function QueryDefType(intType As Integer) As String

Select Case intType

Case dbQSelect

QueryDefType = "dbQSelect"

Case dbQAction

QueryDefType = "dbQAction"

Case dbQCrosstab

QueryDefType = "dbQCrosstab"

Case dbQDelete

QueryDefType = "dbQDelete"

Case dbQUpdate

QueryDefType = "dbQUpdate"

Case dbQAppend

QueryDefType = "dbQAppend"

Case dbQMakeTable

QueryDefType = "dbQMakeTable"

Case dbQDDL

QueryDefType = "dbQDDL"

Case dbQSQLPassThrough

QueryDefType = "dbQSQLPassThrough"

Case dbQSetOperation

QueryDefType = "dbQSetOperation"

Case dbQSPTBulk

QueryDefType = "dbQSPTBulk"

End Select

End Function


Свойство Unique, пример

Следующая программа задает для свойства Unique нового объекта Index значение True и добавляет объект Index в семейство Indexes таблицы "Сотрудники".  Далее печатается семейство Indexes объекта TableDef и семейство Properties каждого объекта Index.  Новый индекс допускает существование в объекте TableDef только одной записи с конкретной комбинацией значений полей "Страна", "Фамилия" и "Имя".

Sub UniqueX()

Dim dbsNorthwind As Database

Dim tdfEmployees As TableDef

Dim idxNew As Index

Dim idxLoop As Index

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfEmployees = dbsNorthwind!Сотрудники

With tdfEmployees

' Создает и добавляет новый объект Index

' в семейство Indexes таблицы "Сотрудники".

Set idxNew = .CreateIndex("НовыйИндекс")

With idxNew

.Fields.Append .CreateField("Страна")

.Fields.Append .CreateField("Фамилия")

.Fields.Append .CreateField("Имя")

.Unique = True

End With

.Indexes.Append idxNew

.Indexes.Refresh

Debug.Print .Indexes.Count & " Индексы в таблице " & _

.Name

' Отображает семейство Indexes таблицы 'Сотрудники'.

For Each idxLoop In .Indexes

Debug.Print "    " & idxLoop.Name

' Отображает семейство Properties каждого объекта Index.

For Each prpLoop In idxLoop.Properties

Debug.Print "        " & prpLoop.Name & _

" = " & IIf(prpLoop = "", "[empty]", prpLoop)

Next prpLoop

Next idxLoop

' Удаляет новый объект Index, созданный для демонстрации.

.Indexes.Delete idxNew.Name

End With

dbsNorthwind.Close

End Sub


Свойство Updatable, пример

Следующая программа демонстрирует применение свойства Updatable к базе данных, четырем типам объектов Recordset, объекту TableDef и объекту QueryDef.

Sub UpdatableX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

Debug.Print .Name

Debug.Print "    Updatable = " & .Updatable

' По умолчанию задается константа dbOpenTable.

Set rstEmployees = .OpenRecordset("Сотрудники")

Debug.Print _

"Табличный объект Recordset для таблицы 'Сотрудники'"

Debug.Print "    Updatable = " & _

rstEmployees.Updatable

rstEmployees.Close

Set rstEmployees = .OpenRecordset("Сотрудники", _

dbOpenDynaset)

Debug.Print _

"Динамический набор записей для таблицы 'Сотрудники'"

Debug.Print "    Updatable = " & _

rstEmployees.Updatable

rstEmployees.Close

Set rstEmployees = .OpenRecordset("Сотрудники", _

dbOpenSnapshot)

Debug.Print _

"Динамический набор записей для таблицы 'Сотрудники'"

Debug.Print "    Updatable = " & _

rstEmployees.Updatable

rstEmployees.Close

Set rstEmployees = .OpenRecordset("Сотрудники", _

dbOpenForwardOnly)

Debug.Print _

" Набор с последовательным доступом для таблицы 'Сотрудники'"

Debug.Print "    Updatable = " & _

rstEmployees.Updatable

rstEmployees.Close

Debug.Print "'" & .TableDefs(0).Name & "' TableDef"

Debug.Print "    Updatable = " & _

.TableDefs(0).Updatable

Debug.Print "'" & .QueryDefs(0).Name & "' QueryDef"

Debug.Print "    Updatable = " & _

.QueryDefs(0).Updatable

.Close

End With

End Sub


Свойство V1xNullBehavior, пример

Следующая программа преобразует файл базы данных Microsoft Jet версии 1.1 в файл базы данных Microsoft Jet версии 3.0.  При преобразовании свойство V1xNullBehavior создается и добавляется в семейство Properties новой базы данных.  Для демонстрации изменений печатаются семейства Properties обеих баз данных.  И наконец, свойство V1xNullBehavior удаляется.  При этом подразумевается, что любые приложения будут преобразованы таким образом, чтобы сохранять в полях типа Text и Memo значения Null вместо пустых строк.

Примечание.   Для выполнения данной процедуры необходимо получить файл базы данных Microsoft Jet версии 1.1 с именем "Nwind11.mdb".

Sub V1xNullBehaviorX()

Dim dbsNorthwind As Database

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Nwind11.mdb")

With dbsNorthwind

Debug.Print .Name & ", версии " & .Version

' Отображает семейство Properties базы данных.

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

.Close

End With

DBEngine.CompactDatabase "Nwind11.mdb", _

"Nwind30.mdb", , dbVersion30

Set dbsNorthwind = OpenDatabase("Nwind30.mdb")

With dbsNorthwind

Debug.Print .Name & ", версии " & .Version

' Отображает семейство Properties сжатой базы данных.

' На свойство V1xNullBehavior нельзя ссылаться в явном виде,

' т.е. в формате dbsNorthwind.V1xNullBehavior. Однако

' оно доступно в циклах или в ссылке с помощью

' строкового выражения, т.е. в формате

' dbsNorthwind.Properties("V1xNullBehavior").

For Each prpLoop In .Properties

On Error Resume Next

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop

On Error GoTo 0

Next prpLoop

.Properties.Delete "V1xNullBehavior"

.Close

End With

End Sub


Свойство ValidateOnSet, пример

Следующая программа использует свойство ValidateOnSet для демонстрации перехвата ошибок при вводе данных.  Для выполнения данной процедуры требуется функция ValidateData.

Sub ValidateOnSetX()

Dim dbsNorthwind As Database

Dim fldDays As Field

Dim rstEmployees As Recordset

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает и добавляет новый объект Field

' в семейство Fields таблицы "Сотрудники".

Set fldDays = _

dbsNorthwind.TableDefs!Сотрудники.CreateField( _

"Отгулы", dbInteger, 2)

fldDays.ValidationRule = "BETWEEN 1 AND 20"

fldDays.ValidationText = _

"Допускаются числа от 1 до 20!"

dbsNorthwind.TableDefs!Сотрудники.Fields.Append fldDays

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

Do While True

' Добавляет новую запись.

.AddNew

' Принимает данные от пользователя для трех полей.

' Проверяет, что данные не противоречат условиям

' для любого из полей.

If ValidateData(!Имя, _

"Введите имя.") = False Then Exit Do

If ValidateData(!Фамилия, _

"Введите фамилию.") = False Then Exit Do

If ValidateData(!Отгулы, _

"Введите число отгулов.") = False Then Exit Do

.Update

.Bookmark = .LastModified

Debug.Print !Имя & " " & !Фамилия & _

" - " & "Отгулы = " & !Отгулы

' Удаляет новую запись, созданную только для демонстрации.

.Delete

Exit Do

Loop

' Отменяет вызов метода AddNew, если хотя бы одно

' из условий было нарушено.

If .EditMode <> dbEditNone Then .CancelUpdate

.Close

End With

' Удаляет новое поле, созданное только для демонстрации.

dbsNorthwind.TableDefs!Сотрудники.Fields.Delete _

fldDays.Name

dbsNorthwind.Close

End Sub

Function ValidateData(fldTemp As Field, _

strMessage As String) As Boolean

Dim strInput As String

Dim errLoop As Error

ValidateData = True

' Свойство ValidateOnSet доступно для чтения/записи

' только для объектов Field в объектах Recordset.

fldTemp.ValidateOnSet = True

Do While True

strInput = InputBox(strMessage)

If strInput = "" Then Exit Do

' Перехват ошибок при задании значений полей.

On Error GoTo Err_Data

If fldTemp.Type = dbInteger Then

fldTemp = Val(strInput)

Else

fldTemp = strInput

End If

On Error GoTo 0

If Not IsNull(fldTemp) Then Exit Do

Loop

If strInput = "" Then ValidateData = False

Exit Function

Err_Data:

If DBEngine.Errors.Count > 0 Then

' Отображает семейство Errors. Свойство Description

' последнего объекта Error получит значение свойства

' ValidationText соответствующего поля.

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & errLoop.Number & _

vbCr & errLoop.Description

Next errLoop

End If

Resume Next

End Function


Свойства ValidationRule и ValidationText, пример

Следующая программа создает объект Field в указанном объекте TableDef и задает его свойства ValidationRule и ValidationText с помощью переданных данных.  Далее демонстрируется использование свойств ValidationRule и ValidationText при вводе данных.  Для выполнения данной процедуры требуется функция SetValidation.

Sub ValidationRuleX()

Dim dbsNorthwind As Database

Dim fldDays As Field

Dim rstEmployees As Recordset

Dim strMessage As String

Dim strDays As String

Dim errLoop As Error

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает новое поле в таблице "Сотрудники",

' используя указанные значения свойств.

Set fldDays = _

SetValidation(dbsNorthwind.TableDefs!Сотрудники, _

"Отгулы", dbInteger, 2, "BETWEEN 1 AND 20", _

"Допускаются числа от 1 до 20!")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

' Цикл по всем компонентам объекта Recordset. Для каждой

' записи поля заполняются данными, введенными пользователем.

Do While Not .EOF

.Edit

strMessage = "Введите число отгулов для " & _

!Имя & " " & !Фамилия & vbCr & _

"[" & !Отгулы.ValidationRule & "]"

Do While True

' Принимает данные от пользователя.

strDays = InputBox(strMessage)

If strDays = "" Then

.CancelUpdate

Exit Do

End If

!Отгулы = Val(strDays)

' Свойство ValidateOnSet по умолчанию имеет значение

' False. Данные в буфере будут проверяться на

' соответствие свойству ValidationRule при вызове

' метода Update.

On Error GoTo Err_Rule

.Update

On Error GoTo 0

' При успешном выполнении метода Update

' печатает результаты изменения данных.

If .EditMode = dbEditNone Then

Debug.Print !Имя & " " & !Фамилия & _

    " - " & "Число отгулов = " & _

    !Отгулы

Exit Do

End If

Loop

If strDays = "" Then Exit Do

.MoveNext

Loop

.Close

End With

' Удаляет новое поле, созданное только для демонстрации.

dbsNorthwind.TableDefs!Сотрудники.Fields.Delete _

fldDays.Name

dbsNorthwind.Close

Exit Sub

Err_Rule:

If DBEngine.Errors.Count > 0 Then

' Отображает семейство Errors.

For Each errLoop In DBEngine.Errors

MsgBox "Код ошибки: " & _

errLoop.Number & vbCr & _

errLoop.Description

Next errLoop

End If

Resume Next

End Sub

Function SetValidation(tdfTemp As TableDef, _

strFieldName As String, intType As Integer, _

intLength As Integer, strRule As String, _

strText As String) As Field

' Создает и добавляет новый объект Field в семейство Fields

' указанного объекта TableDef.

Set SetValidation = tdfTemp.CreateField(strFieldName, _

intType, intLength)

SetValidation.ValidationRule = strRule

SetValidation.ValidationText = strText

tdfTemp.Fields.Append SetValidation

End Function


Свойство Value, пример

Следующая программа демонстрирует применение свойства Value для объектов Field и Property.

Sub ValueX()

Dim dbsNorthwind As Database

Dim rstEmployees As Recordset

Dim fldLoop As Field

Dim prpLoop As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set rstEmployees = _

dbsNorthwind.OpenRecordset("Сотрудники")

With rstEmployees

Debug.Print "Значения объектов Field в rstEmployees"

' Отображает семейство Fields таблицы "Сотрудники".

For Each fldLoop In .Fields

Debug.Print "    " & fldLoop.Name & " = ";

Select Case fldLoop.Type

Case dbLongBinary

Debug.Print "[LongBinary]"

Case dbMemo

Debug.Print "[Memo]"

Case Else

' Так как свойство Value является используемым

' по умолчанию свойством объекта Field, использование

' ключевого слова является необязательным.

Debug.Print fldLoop.Value

End Select

Next fldLoop

Debug.Print "Значения объектов Property в rstEmployees"

' Отображает семейство Properties объекта Recordset.

For Each prpLoop In .Properties

On Error Resume Next

' Так как свойство Value является используемым

' по умолчанию свойством объекта Property, использование

' ключевого слова является необязательным.

If prpLoop <> "" Then Debug.Print "    " & _

prpLoop.Name & " = " & prpLoop.Value

On Error GoTo 0

Next prpLoop

.Close

End With

dbsNorthwind.Close

End Sub


Свойства AllPermissions, Permissions и SystemDB, пример

Следующая программа использует свойства SystemDB, AllPermissions и Permissions для демонстрации получения пользователями различных разрешений в зависимости от группы, к которой они принадлежат.

Sub AllPermissionsX()

' Проверяет, что файл системной базы данных Microsoft Jet

' является доступным.

DBEngine.SystemDB = "system.mdw"

Dim dbsNorthwind As Database

Dim ctrLoop As Container

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Отображает семейство Containers и печатает имя текущего

' пользователя и присвоенные ему разрешения.

For Each ctrLoop In dbsNorthwind.Containers

With ctrLoop

Debug.Print "Контейнер: " & .Name

Debug.Print "Пользователь: " & .UserName

Debug.Print "    Permissions: " & .Permissions

Debug.Print "    AllPermissions: " & _

.AllPermissions

End With

Next ctrLoop

dbsNorthwind.Close

End Sub


Свойство Attributes, пример

Следующая программа отображает свойство Attributes объектов Field, Relation и TableDef в базе данных "Борей".

Sub AttributesX()

Dim dbsNorthwind As Database

Dim fldLoop As Field

Dim relLoop As Relation

Dim tdfloop As TableDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Отображает атрибуты полей объекта TableDef.

Debug.Print "Атрибуты полей таблицы: " & _

.TableDefs(0).Name

For Each fldLoop In .TableDefs(0).Fields

Debug.Print "    " & fldLoop.Name & " = " & _

fldLoop.Attributes

Next fldLoop

' Отображает атрибуты связей в базе данных "Борей".

Debug.Print "Атрибуты связей в " & _

.Name

For Each relLoop In .Relations

Debug.Print "    " & relLoop.Name & " = " & _

relLoop.Attributes

Next relLoop

' Отображает атрибуты таблиц в базе данных "Борей".

Debug.Print "Атрибуты таблиц в " & .Name

For Each tdfloop In .TableDefs

Debug.Print "    " & tdfloop.Name & " = " & _

tdfloop.Attributes

Next tdfloop

.Close

End With

End Sub


Свойство BatchCollisionCount и метод Update, пример

Следующая программа использует свойство BatchCollisionCount и метод Update для демонстрации пакетного обновления, при котором любые конфликты обновления устраняются путем принудительного пакетного обновления.

Sub BatchX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim rstTemp As Recordset

Dim intLoop As Integer

Dim strPrompt As String

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

' Это значение свойства DefaultCursorDriver

' требуется для пакетного обновления.

wrkMain.DefaultCursorDriver = dbUseClientBatchCursor

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Следующее значение аргумента блокировки

' требуется для пакетного обновления.

Set rstTemp = conMain.OpenRecordset( _

"SELECT * FROM roysched", dbOpenDynaset, 0, _

dbOptimisticBatch)

With rstTemp

' Изменяет данные в локальном наборе записей.

Do While Not .EOF

.Edit

If !royalty <= 20 Then

!royalty = !royalty - 4

Else

!royalty = !royalty + 2

End If

.Update

.MoveNext

Loop

' Попытка пакетного обновления.

.Update dbUpdateBatch

' Если имеются конфликты обновления, пользователю

' предоставляется возможность выбрать

' принудительное обновление или разрешение

' конфликтов по отдельности.

If .BatchCollisionCount > 0 Then

strPrompt = "Обнаружены конфликты. " & vbCr & _

"Вызвать программу принудительного " & _

vbCr & "обновления с помощью локальных данных?)"

If MsgBox(strPrompt, vbYesNo) = vbYesNo Then _

.Update dbUpdateBatch, True

End If

.Close

End With

conMain.Close

wrkMain.Close

End Sub


Свойства BatchSize и UpdateOptions, пример

Следующая программа использует свойства BatchSize и UpdateOptions для управления операциями пакетного обновления указанного объекта Recordset.

Sub BatchSizeX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim rstTemp As Recordset

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

' Это значение свойства DefaultCursorDriver

' требуется для пакетного обновления.

wrkMain.DefaultCursorDriver = dbUseClientBatchCursor

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Следующее значение аргумента блокировки

' требуется для пакетного обновления.

Set rstTemp = conMain.OpenRecordset( _

"SELECT * FROM roysched", dbOpenDynaset, 0, _

dbOptimisticBatch)

With rstTemp

' Увеличивает число инструкций, отправляемых на сервер

' в одной операции пакетного обновления, что приводит

' к уменьшению количества обращений к серверу.

.BatchSize = 25

' Изменяет значение свойства UpdateOptions таким образом,

' чтобы предложение WHERE любой инструкции в пакете,

' отправленном на сервер включало все обновляемые

' столбцы в дополнение к ключевым столбцам. Кроме того,

' любые изменения записей выполняются путем удаления

' исходной записи и добавления измененной версии записи

' вместо простого изменения исходной записи.

.UpdateOptions = dbCriteriaModValues + _

dbCriteriaDeleteInsert

' Выполняет пакетное обновление с использованием

' заданных выше настроек.

' ...

.Close

End With

conMain.Close

wrkMain.Close

End Sub


Свойство CollatingOrder, пример

Следующая программа отображает свойство CollatingOrder для базы данных "Борей" и для отдельных полей в таблице.

Sub CollatingOrderX()

Dim dbsNorthwind As Database

Dim fldLoop As Field

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Отображает языковую настройку базы данных "Борей".

Debug.Print "Языковая настройка " & .Name & " = " & _

.CollatingOrder

' Отображает языковую настройку для полей объекта TableDef.

Debug.Print "Языковая настройка полей таблицы " & _

.TableDefs(0).Name

For Each fldLoop In .TableDefs(0).Fields

Debug.Print "    " & fldLoop.Name & " = " & _

fldLoop.CollatingOrder

Next fldLoop

.Close

End With

End Sub


Свойство ConflictTable, пример

Следующая программа использует свойство ConflictTable для печати имен таблиц, в которых возникли конфликты при синхронизации.

Sub ConflictTableX()

Dim dbsNorthwind As Database

Dim tdfTest As TableDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Отображает семейство TableDefs и проверяет свойство

' ConflictTable каждого объекта.

For Each tdfTest In dbsNorthwind.TableDefs

If tdfTest.ConflictTable <> "" Then _

Debug.Print tdfTest.Name & " имеет конфликт."

Next tdfTest

dbsNorthwind.Close

End Sub

Следующая программа открывает объект Recordset на основе таблицы конфликтов и на основе таблицы, вызвавшей конфликт.  После этого выполняется обработка записей в этих таблицах с использованием поля "RequiredDate" для копирования данных из одной таблицы в другую в зависимости от того, запись какой таблицы была обновлена последней.

Sub ConflictTableX2(dbsResolve As Database)

Dim tdfTest As TableDef

Dim rstSource As Recordset

Dim rstConflict As Recordset

Dim fldLoop As Field

Set tdfTest = dbsResolve.TableDefs("Заказы")

If tdfTest.ConflictTable <> "" Then

Set rstSource = dbsResolve.OpenRecordset( _

tdfTest.Name, dbOpenTable)

Set rstConflict = dbsResolve.OpenRecordset( _

tdfTest.ConflictTable, dbOpenTable)

rstSource.Index = "[d_Guid]"

rstConflict.MoveFirst

Do Until rstConflict.EOF

rstSource.Seek "=", rstConflict![s_Guid]

If Not rstSource.NoMatch Then

If rstSource!RequiredDate < _

rstConflict!RequiredDate Then

On Error Resume Next

For Each fldLoop in rstConflict.Fields

fldLoop = rstSource(fldLoop.Name)

Next fldLoop

On Error Goto 0

End If

End If

rstConflict.Delete

rstConflict.MoveNext

Loop

rstConflict.Close

rstSource.Close

End If

End Sub


Свойства Connect и SourceTableName, пример

Следующая программа использует свойства Connect и SourceTableName для присоединения различных внешних таблиц к базе данных Microsoft. Для выполнения данной процедуры требуется процедура ConnectOutput.

Sub ConnectX()

Dim dbsTemp As Database

Dim strMenu As String

Dim strInput As String

' Открывает базу данных Microsoft Jet, к которой

' будет присоединена таблица.

Set dbsTemp = OpenDatabase("DB1.mdb")

' Сборка текста меню.

strMenu = "Введите номер, определяющий источник:" & vbCr

strMenu = strMenu & _

"   1. База данных Microsoft Jet" & vbCr

strMenu = strMenu & _

"   2. Таблица Microsoft FoxPro 3.0" & vbCr

strMenu = strMenu & _

"   3. Таблица dBASE" & vbCr

strMenu = strMenu & _

"   4. Таблица Paradox" & vbCr

strMenu = strMenu & _

"   M. (см. варианты 5-9)"

' Принимает выбор пользователя.

strInput = InputBox(strMenu)

If UCase(strInput) = "M" Then

' Сборка текста меню.

strMenu = "Введите номер, определяющий источник:" & vbCr

strMenu = strMenu & _

"   5. Электронная таблица Microsoft Excel" & vbCr

strMenu = strMenu & _

"   6. Электронная таблица Lotus" & vbCr

strMenu = strMenu & _

"   7. Текст, разделяемый запятыми (CSV)" & vbCr

strMenu = strMenu & _

"   8. Таблица HTML" & vbCr

strMenu = strMenu & _

"   9. Папка Microsoft Exchange"

' Принимает выбор пользователя.

strInput = InputBox(strMenu)

End If

' Вызывает процедуру ConnectOutput. Третий аргумент будет

' использован как строка подключения, а четвертый

' как значение свойства SourceTableName.

Select Case Val(strInput)

Case 1

ConnectOutput dbsTemp, _

"JetTable", _

";DATABASE=C:\My Documents\Борей.mdb", _

"Employees"

Case 2

ConnectOutput dbsTemp, _

"FoxProTable", _

"FoxPro 3.0;DATABASE=C:\FoxPro30\Samples", _

"Q1Sales"

Case 3

ConnectOutput dbsTemp, _

"dBASETable", _

"dBase IV;DATABASE=C:\dBASE\Samples", _

"Accounts"

Case 4

ConnectOutput dbsTemp, _

"ParadoxTable", _

"Paradox 3.X;DATABASE=C:\Paradox\Samples", _

"Accounts"

Case 5

ConnectOutput dbsTemp, _

"ExcelTable", _

"Excel 5.0;" & _

"DATABASE=C:\Excel\Samples\Q1Sales.xls", _

"January Sales"

Case 6

ConnectOutput dbsTemp, _

"LotusTable", _

"Lotus WK3;" & _

"DATABASE=C:\Lotus\Samples\Sales.xls", _

"THIRDQTR"

Case 7

ConnectOutput dbsTemp, _

"CSVTable", _

"Text;DATABASE=C:\Samples", _

"Sample.txt"

Case 8

ConnectOutput dbsTemp, _

"HTMLTable", _

"HTML Import;DATABASE=http://" & _

"www.server1.com/samples/page1.html", _

"Q1SalesData"

Case 9

ConnectOutput dbsTemp, _

"ExchangeTable", _

"Exchange 4.0;MAPILEVEL=" & _

"Mailbox - Michelle Wortman (Exchange)" & _

"|People\Important;", _

"Jerry Wheeler"

End Select

dbsTemp.Close

End Sub

Sub ConnectOutput(dbsTemp As Database, _

strTable As String, strConnect As String, _

strSourceTable As String)

Dim tdfLinked As TableDef

Dim rstLinked As Recordset

Dim intTemp As Integer

' Создает новый объект TableDef,задает его свойства Connect

' и SourceTableName на основании переданных аргументов,

' добавляет объект в семейство TableDefs.

Set tdfLinked = dbsTemp.CreateTableDef(strTable)

tdfLinked.Connect = strConnect

tdfLinked.SourceTableName = strSourceTable

dbsTemp.TableDefs.Append tdfLinked

Set rstLinked = dbsTemp.OpenRecordset(strTable)

Debug.Print "Data from linked table:"

' Отображает первые три записи присоединенной таблицы.

intTemp = 1

With rstLinked

Do While Not .EOF And intTemp <= 3

Debug.Print , .Fields(0), .Fields(1)

intTemp = intTemp + 1

.MoveNext

Loop

If Not .EOF Then Debug.Print , "[дополнительные записи]"

.Close

End With

' Удаляет присоединенную таблицу, созданную

' только для демонстрации.

dbsTemp.TableDefs.Delete strTable

End Sub


Свойство Container, пример

Следующая программа отображает свойство Container для различных объектов Document.

Sub ContainerPropertyX()

Dim dbsNorthwind As Database

Dim ctrLoop As Container

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Печатает имя контейнера для первого объекта Document

' в каждом семействе Documents объекта Container.

For Each ctrLoop In dbsNorthwind.Containers

Debug.Print "Документ: " & ctrLoop.Documents(0).Name

Debug.Print "    Контейнер = " & _

ctrLoop.Documents(0).Container

Next ctrLoop

dbsNorthwind.Close

End Sub


Свойство Database, пример

Следующая программа использует свойство Database для демонстрации преобразования программы, в которой доступ к данным ODBC осуществляется через ядро базы данных Microsoft Jet, в программу, использующую объекты Connection ODBCDirect.

Процедура OldDatabaseCode использует для доступа к базе данных ODBC подключение источника данных к ядру Microsoft Jet.

Sub OldDatabaseCode()

Dim wrkMain As Workspace

Dim dbsPubs As Database

Dim prpLoop As Property

' Создает объект Workspace Microsoft Jet.

Set wrkMain = CreateWorkspace("", "admin", "", dbUseJet)

' Открывает объект Database с помощью

' строки подключения.

Set dbsPubs = wrkMain.OpenDatabase("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Отображает семейство Properties объекта Database.

With dbsPubs

Debug.Print "Свойства объекта Database " & _

.Name & ":"

On Error Resume Next

For Each prpLoop In .Properties

If prpLoop.Name = "Connection" Then

' Свойство фактически возвращает объект Connection.

Debug.Print "    Connection[.Name] = " & _

.Connection.Name

Else

Debug.Print "    " & prpLoop.Name & " = " & _

prpLoop

End If

Next prpLoop

On Error GoTo 0

End With

dbsPubs.Close

wrkMain.Close

End Sub

Процедура NewDatabaseCode открывает объект Connection в рабочей области ODBCDirect.  Затем значение свойства Database объекта Connection присваивается объектной переменной, имя которой совпадает с именем источника данных в старой процедуре.  Последующую часть программы изменять не приходится, поскольку в ней не используются специфические характеристики рабочей области Microsoft Jet.

Sub NewDatabaseCode()

Dim wrkMain As Workspace

Dim conPubs As Connection

Dim dbsPubs As Database

Dim prpLoop As Property

' Создает объект Workspace ODBCDirect вместо объекта

' Workspace Microsoft Jet.

Set wrkMain = CreateWorkspace("", "admin", "", dbUseODBC)

' Открывает объект Connection с помощью

' строки подключения.

Set conPubs = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Присваивает свойство Database той же объектной переменной,

' как и в старой программе.

Set dbsPubs = conPubs.Database

' Отображает семейство Properties объекта Database.

' Далее программа совпадает с программой предыдущего примера.

With dbsPubs

Debug.Print "Свойства объекта Database " & _

.Name & ":"

On Error Resume Next

For Each prpLoop In .Properties

If prpLoop.Name = "Connection" Then

' Свойство фактически возвращает объект Connection.

Debug.Print "    Connection[.Name] = " & _

.Connection.Name

Else

Debug.Print "    " & prpLoop.Name & " = " & _

prpLoop

End If

Next prpLoop

On Error GoTo 0

End With

dbsPubs.Close

wrkMain.Close

End Sub


Свойство DefaultType, пример

Следующая программа использует свойство DefaultType для определения типа объекта Workspace, который будет создаваться при следующем вызове метода CreateWorkspace.  Для выполнения данной процедуры требуется функция TypeOutput.

Sub DefaultTypeX()

Dim wrkODBC As Workspace

Dim wrkJet As Workspace

Dim prpLoop As Property

' Определяет свойство DefaultType и создает объект Workspace

' без указания его типа.

DBEngine.DefaultType = dbUseODBC

Set wrkODBC = CreateWorkspace("ODBCWorkspace", _

"admin", "")

Debug.Print "DBEngine.DefaultType = " & _

TypeOutput(DBEngine.DefaultType)

With wrkODBC

' Отображает семейство Properties объекта Workspace.

Debug.Print "Свойства " & .Name

On Error Resume Next

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " = " & prpLoop

If prpLoop.Name = "Type" Then Debug.Print _

"        (" & TypeOutput(prpLoop.Value) & ")"

Next prpLoop

On Error GoTo 0

End With

' Определяет свойство DefaultType и создает объект Workspace

' без указания его типа.

DBEngine.DefaultType = dbUseJet

Set wrkJet = CreateWorkspace("JetWorkspace", "admin", "")

Debug.Print "DBEngine.DefaultType = " & _

TypeOutput(DBEngine.DefaultType)

With wrkJet

' Отображает семейство Properties объекта Workspace.

Debug.Print "Свойства " & .Name

On Error Resume Next

For Each prpLoop In .Properties

Debug.Print "    " & prpLoop.Name & " = " & prpLoop

If prpLoop.Name = "Type" Then Debug.Print _

"        (" & TypeOutput(prpLoop.Value) & ")"

Next prpLoop

On Error GoTo 0

End With

wrkODBC.Close

wrkJet.Close

End Sub

Function TypeOutput(intTemp As Integer) As String

If intTemp = dbUseJet Then

TypeOutput = "dbUseJet"

Else

TypeOutput = "dbUseODBC"

End If

End Function


Свойства DefaultUser, DefaultPassword, пример

Следующая программа задает значения свойств DefaultUser и DefaultPassword, определяющие параметры стандартного объекта Workspace.

Sub DefaultUserX()

' Задает значения свойств DefaultUser и DefaultPassword

' для объекта DBEngine.

DBEngine.DefaultUser = "НовыйПользователь"

DBEngine.DefaultPassword = "НовыйПароль"

Debug.Print _

"Задано для DBEngine.DefaultUser 'НовыйПользователь'..."

Debug.Print _

"Задано для DBEngine.DefaultPassword " & _

"[пустая строка]..."

Dim wrkJet As Workspace

Dim wrkLoop As Workspace

Dim prpLoop As Property

Set wrkJet = CreateWorkspace("JetWorkspace", "admin", _

"", dbUseJet)

' Отображает семейство Workspaces.

On Error Resume Next

For Each wrkLoop In Workspaces

Debug.Print "Рабочая область: " & wrkLoop.Name

' Отображает семейство Properties каждого

' объекта Workspace.

For Each prpLoop In wrkLoop.Properties

Debug.Print "    " & prpLoop.Name & " = " & prpLoop

Next prpLoop

Next wrkLoop

On Error GoTo 0

wrkJet.Close

End Sub


Свойство DesignMasterID, пример

Следующая программа задает значение свойства DesignMasterID, совпадающее со значением свойства ReplicaID другой базы данных, делая вторую базу данных основной репликой в наборе реплик.  Для старой и новой основной реплики выполняется синхронизация, позволяющая обновить структуру реплик.  Для выполнения данного примера необходимо создать основную реплику и реплику, включить в программу их имена и пути, а затем запустить данную программу из базы данных, отличной от новой и старой основной реплики.

Sub SetNewDesignMaster(strOldDM as String, _

strNewDM as String)

Dim dbsOld As Database

Dim dbsNew As Database

' Открывает текущую основную реплику для монопольного доступа.

Set dbsOld = OpenDatabase(strOldDM, True)

' Открывает базу данных, которая будет новой

' основной репликой.

Set dbsNew = OpenDatabase(strNewDM)

' Назначает новую базу данных основной репликой.

dbsOld.DesignMasterID = dbsNew.ReplicaID

' Выполняет синхронизацию старой основной реплики с новой

' основной репликой и включает двухсторонний обмен.

dbsOld.Synchronize strNewDM, dbRepImpExpChanges

dbsOld.Close

dbsNew.Close

End Sub


Свойство Direction, пример

Следующая программа использует свойство Direction для определения запроса к источнику данных ODBC.

Sub DirectionX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim qdfTemp As QueryDef

Dim rstTemp As Recordset

Dim strSQL As String

Dim intLoop As Integer

' Создает рабочую область ODBC и открывает подключение

' к базе данных Microsoft SQL Server.

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Задает строку SQL, вызывающую сохраненную

' процедуру getempsperjob.

strSQL = "{ call getempsperjob (?, ?) }"

Set qdfTemp = conMain.CreateQueryDef("", strSQL)

With qdfTemp

' Указывает, что два параметра запроса передают

' данные в сохраненную процедуру.

.Parameters(0).Direction = dbParamInput

.Parameters(1).Direction = dbParamInput

' Присваивает параметрам начальные значения.

.Parameters(0) = "0877"

.Parameters(1) = 0

Set rstTemp = .OpenRecordset()

With rstTemp

' Цикл по всем допустимым значениям второго параметра.

' Для каждого значения набор записей отбирается

' заново, а затем печатается.

For intLoop = 1 To 14

qdfTemp.Parameters(1) = intLoop

.Requery

Debug.Print "Publisher = " & _

qdfTemp.Parameters(0) & _

", job = " & intLoop

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

Next intLoop

.Close

End With

End With

conMain.Close

wrkMain.Close

End Sub


Объект Error, семейство Errors и свойства Description, Number, Source, HelpFile и HelpContext, пример

Следующая программа создает ошибку, перехватывает ее и отображает свойства Description, Number, Source, HelpContext и HelpFile результирующего объекта Error.

Sub DescriptionX()

Dim dbsTest As Database

On Error GoTo ОбработчикОшибок

' Преднамеренно генерирует ошибку.

Set dbsTest = OpenDatabase("NoDatabase")

Exit Sub

ОбработчикОшибок:

Dim strError As String

Dim errLoop As Error

' Отображает семейство Errors и отображает свойства

' каждого объекта Error.

For Each errLoop In Errors

With errLoop

strError = _

"Ошибка #" & .Number & vbCr

strError = strError & _

"    " & .Description & vbCr

strError = strError & _

"    (Источник: " & .Source & ")" & vbCr

strError = strError & _

"Нажмите F1 для вызова раздела " & .HelpContext & vbCr

strError = strError & _

"    из файла " & .HelpFile & "."

End With

MsgBox strError

Next

Resume Next

End Sub


Свойство Inherit, пример

Следующая программа задает значение True для свойства Inherit контейнера Tables, чтобы все создаваемые впоследствии объекты Document в контейнере Tables имели те же параметры защиты, что и контейнер Tables.

Sub InheritX()

Dim dbsNorthwind As Database

Dim conTables As Container

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set conTables = dbsNorthwind.Containers("Tables")

' После задания для свойства Inherit контейнера Tables

' значения True и определения для него разрешений любой

' новый объект Document в этом контейнере будет

' наследовать те же разрешения.

conTables.Inherit = True

conTables.Permissions = dbSecWriteSec

dbsNorthwind.Close

End Sub


Свойство Inherited, пример

Следующая программа использует свойство Inherited для проверки, был ли определяемый пользователем объект Property создан для объекта Recordset или для некоторого базового объекта.

Sub InheritedX()

Dim dbsNorthwind As Database

Dim tdfTest As TableDef

Dim rstTest As Recordset

Dim prpNew As Property

Dim prpLoop As Property

' Создает новое свойство для сохраненного объекта TableDef

' и открывает набор записей из этого объекта TableDef.

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set tdfTest = dbsNorthwind.TableDefs(0)

Set prpNew = tdfTest.CreateProperty("НовоеСвойство", _

dbBoolean, True)

tdfTest.Properties.Append prpNew

Set rstTest = tdfTest.OpenRecordset(dbOpenForwardOnly)

' Печатает свойства Name и Inherited нового объекта Property

' в объекте TableDef.

Debug.Print "Новое свойство " & tdfTest.Name & _

" TableDef:"

Debug.Print "    Inherited = " & _

tdfTest.Properties("НовоеСвойство").Inherited

' Печатает свойства Name и Inherited нового объекта Property

' в объекте Recordset.

Debug.Print "Новое свойство " & rstTest.Name & _

" Recordset:"

Debug.Print "    Inherited = " & _

rstTest.Properties("НовоеСвойство").Inherited

' Удаляет новый объект TableDef, созданный для демонстрации.

tdfTest.Properties.Delete prpNew.Name

dbsNorthwind.Close

End Sub


Свойство IniPath, пример

Следующая программа задает в свойстве IniPath путь к соответствующему разделу приложения в реестре Windows.

Sub IniPathX()

' Изменяет свойство IniPath, чтобы указать другой

' раздел реестра Windows.

Debug.Print "Исходное значение IniPath = " & _

IIf(DBEngine.IniPath = "", "[Empty]", _

DBEngine.IniPath)

DBEngine.IniPath = _

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\" & _

"Jet\3.5\ISAM Formats\FoxPro 3.0"

Debug.Print "Новое значение IniPath = " & _

IIf(DBEngine.IniPath = "", "[Empty]", _

DBEngine.IniPath)

End Sub


Свойство IsolateODBCTrans, пример

Следующая программа открывает три рабочие области ODBCDirect и задает в них для свойства IsolateODBCTrans значение True, обеспечивая изоляцию множественных транзакций.

Sub IsolateODBCTransX()

DBEngine.DefaultType = dbUseJet

Dim wrkJet1 As Workspace

Dim wrkJet2 As Workspace

Dim wrkJet3 As Workspace

' Открывает три рабочие области ODBCDirect для изоляции

' транзакций, использующих общий источник данных ODBC.

Set wrkJet1 = CreateWorkspace("", "admin", "")

wrkJet1.IsolateODBCTrans = True

Set wrkJet2 = CreateWorkspace("", "admin", "")

wrkJet2.IsolateODBCTrans = True

Set wrkJet3 = CreateWorkspace("", "admin", "")

wrkJet3.IsolateODBCTrans = True

wrkJet1.Close

wrkJet2.Close

wrkJet3.Close

End Sub


Свойство KeepLocal, пример

Следующая программа добавляет свойство KeepLocal в семейство свойств документа в модуле "ВспомогательныеФункции" в базе данных "Борей".  Пользователь должен задать значение этого свойства объекта (например, таблицы) до преобразования базы данных в реплицируемую.  После назначения этой базы данных основной репликой указанный объект останется локальным и не будет передаваться в другие реплики набора.  В программе следует указать путь к базе данных Борей.mdb на вашем компьютере.

Sub KeepLocalNWObjectX()

Dim dbsNorthwind As Database

Dim docTemp As Document

Dim prpTemp As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set docTemp = dbsNorthwind.Containers("Modules"). _

Documents("ВспомогательныеФункции")

Set prpTemp = docTemp.CreateProperty("KeepLocal", _

dbText, "T")

docTemp.Properties.Append prpTemp

dbsNorthwind.Close

End Sub

Следующая программа задает для свойства KeepLocal указанного объекта TableDef значение "T".  Если свойство KeepLocal не существует, оно создается и добавляется в семейство Properties свойств таблицы, а затем получает значение "T".

Sub SetKeepLocal(tdfTemp As TableDef)

On Error GoTo ErrHandler

tdfTemp.Properties("KeepLocal") = "T"

On Error GoTo 0

Exit Sub

ErrHandler:

Dim prpNew As Property

If Err.Number = 3270 Then

Set prpNew = tdfTemp.CreateProperty("KeepLocal", _

dbText, "T")

tdfTemp.Properties.Append prpNew

Else

MsgBox "Error " & Err & ": " & Error

End If

End Sub


Свойство LoginTimeout, пример

Следующая программа задает в свойстве LoginTimeout объекта DBEngine величину интервала ожидания 120 секунд.  Далее открываются три рабочие области ODBCDirect и изменяет в свойстве LoginTimeout значения, унаследованные от объекта DBEngine.

Sub LoginTimeoutX()

' Изменяет стандартное значение свойства LoginTimeout.

DBEngine.LoginTimeout = 120

Dim wrkODBC1 As Workspace

Dim wrkODBC2 As Workspace

Dim wrkODBC3 As Workspace

Set wrkODBC1 = CreateWorkspace("", "admin", "", _

dbUseODBC)

Set wrkODBC2 = CreateWorkspace("", "admin", "", _

dbUseODBC)

Set wrkODBC3 = CreateWorkspace("", "admin", "", _

dbUseODBC)

' Задает для свойства LoginTimeout отдельных объектов

' Workspace ODBCDirect значение 60 секунд, значение

' по умолчанию (120 секунд) и отсутствие интервала ожидания.

wrkODBC1.LoginTimeout = 60

wrkODBC2.LoginTimeout = -1

wrkODBC2.LoginTimeout = 0

wrkODBC1.Close

wrkODBC2.Close

wrkODBC3.Close

End Sub


Свойства LogMessages и ReturnsRecords, пример

Следующая программа использует свойства LogMessages и ReturnsRecords для создания запроса к серверу, который будет возвращать данные и любые сообщения, генерируемые удаленным сервером.

Sub LogMessagesX()

Dim wrkJet As Workspace

Dim dbsCurrent As Database

Dim qdfTemp As QueryDef

Dim prpNew As Property

Dim rstTemp As Recordset

' Создает объект Workspace Microsoft Jet.

Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)

Set dbsCurrent = wrkJet.OpenDatabase("DB1.mdb")

' Создает объект QueryDef, который будет сохранять

' поступающие с сервера сообщения во временных таблицах.

Set qdfTemp = dbsCurrent.CreateQueryDef("NewQueryDef")

qdfTemp.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"

qdfTemp.SQL = "SELECT * FROM stores"

qdfTemp.ReturnsRecords = True

Set prpNew = qdfTemp.CreateProperty("LogMessages", _

dbBoolean, True)

qdfTemp.Properties.Append prpNew

' Выполняет запрос и отображает результаты.

Set rstTemp = qdfTemp.OpenRecordset()

Debug.Print "Содержимое набора записей:"

With rstTemp

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

.Close

End With

' Удаляет новый объект QueryDef, созданный для демонстрации.

dbsCurrent.QueryDefs.Delete qdfTemp.Name

dbsCurrent.Close

wrkJet.Close

End Sub


Свойство MaxRecords, пример

Следующая программа использует свойство MaxRecords, чтобы установить предельное число записей, возвращаемых запросом к источнику данных ODBC.

Sub MaxRecordsX()

Dim dbsCurrent As Database

Dim qdfPassThrough As QueryDef

Dim qdfLocal As QueryDef

Dim rstTemp As Recordset

' Открывает базу данных, в которой будет

' создан объект QueryDef.

Set dbsCurrent = OpenDatabase("DB1.mdb")

' Создает запрос к серверу для загрузки данных

' из базы данных Microsoft SQL Server.

Set qdfPassThrough = _

dbsCurrent.CreateQueryDef("")

' Задает свойства нового запроса, ограничивающие

' возвращаемые записи числом 20.

qdfPassThrough.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"

qdfPassThrough.SQL = "SELECT * FROM titles"

qdfPassThrough.ReturnsRecords = True

qdfPassThrough.MaxRecords = 20

Set rstTemp = qdfPassThrough.OpenRecordset()

' Отображает результаты запроса.

Debug.Print "Результаты запроса:"

With rstTemp

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

.Close

End With

dbsCurrent.Close

End Sub


Свойство Name, пример

Следующая программа использует свойство Name для указания имени нового объекта, для вывода перечня объектов в семействе и для удаления объекта из семейства.

Sub NameX()

Dim dbsNorthwind As Database

Dim qdfNew As QueryDef

Dim qdfLoop As QueryDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Создает новый постоянный объект QueryDef

' и добавляет его в семейство QueryDefs.

Set qdfNew = .CreateQueryDef()

qdfNew.Name = "NewQueryDef"

qdfNew.SQL = "SELECT * FROM Сотрудники"

.QueryDefs.Append qdfNew

' Отображает семейство имена объектов QueryDef

' в семействе QueryDefs.

Debug.Print "Имена запросов в " & .Name

For Each qdfLoop In .QueryDefs

Debug.Print "    " & qdfLoop.Name

Next qdfLoop

' Удаляет новый объект QueryDef, созданный

' только для демонстрации.

.QueryDefs.Delete qdfNew.Name

.Close

End With

End Sub


Свойства ODBCTimeout и QueryTimeout, пример

Следующая программа использует свойства ODBCTimeout и QueryTimeout, чтобы показать, как значение свойства QueryTimeout объекта Database задает значение по умолчанию свойства ODBCTimeout для любых объектов QueryDef, созданных в объекте Database.

Sub ODBCTimeoutX()

Dim dbsCurrent As Database

Dim qdfStores As QueryDef

Dim rstStores As Recordset

Set dbsCurrent = OpenDatabase("Борей.mdb")

' Изменяет стандартное значение свойства QueryTimeout

' в базе данных "Борей".

Debug.Print "Стандартное значение QueryTimeout в " & _

dbsCurrent.QueryTimeout

dbsCurrent.QueryTimeout = 30

Debug.Print "Новое значение QueryTimeout в " & _

dbsCurrent.QueryTimeout

' Создает новый объект QueryDef.

Set qdfStores = dbsCurrent.CreateQueryDef("Товары", _

"SELECT * FROM Товары")

qdfStores.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"

' Изменяет полученное по умолчанию значение свойства

' ODBCTimeout нового объекта QueryDef.

Debug.Print "Стандартное значение ODBCTimeout для QueryDef: " & _

qdfStores.ODBCTimeout

qdfStores.ODBCTimeout = 0

Debug.Print "Новое значение ODBCTimeout для: " & _

qdfStores.ODBCTimeout

' Выполняет запрос и отображает результаты.

Set rstStores = qdfStores.OpenRecordset()

Debug.Print "Содержимое набора записей:"

With rstStores

Do While Not .EOF

Debug.Print , .Fields(0), .Fields(1)

.MoveNext

Loop

.Close

End With

' Удаляет новый объект QueryDef, созданный для демонстрации.

dbsCurrent.QueryDefs.Delete qdfStores.Name

dbsCurrent.Close

End Sub


Свойства Owner и SystemDB, пример

Следующая программа использует свойства Owner и SystemDB, чтобы показать владельцев разных объектов Document.

Sub OwnerX()

' Проверяет, доступен ли файл системной

' базы данных Microsoft Jet.

DBEngine.SystemDB = "system.mdw"

Dim dbsNorthwind As Database

Dim ctrLoop As Container

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

Debug.Print "Владельцы документов:"

' Отображает семейство Containers и показывает

' владельца первого объекта Document в семействе

' Documents каждого контейнера.

For Each ctrLoop In .Containers

With ctrLoop

Debug.Print "    [" & .Documents(0).Name & _

"] в контейнере [" & .Name & _

"] имеет владельца [" & _

.Documents(0).Owner & "]"

End With

Next ctrLoop

.Close

End With

End Sub


Свойство PartialReplica, пример

Следующая программа использует свойство PartialReplica для репликации всех записей, соответствующих клиентам из одного региона:

PartialReplicaX()

' Предположения: dbsTemp является частичной репликой,

' а между таблицами установлена соответствующая связь.

Dim tdfOrders As TableDef

Dim relCustOrd As Relation

Dim dbsTemp As Database

Dim relLoop As Relation

Set dbsTemp = OpenDatabase("Борей.mdb")

Set tdfOrders = dbsTemp.TableDefs("Заказы")

' Ищет объект Relation представляющий связь

' между таблицами "Клиенты" и "Заказы".

For Each relLoop In dbsTemp.Relations

If relLoop.Table = "Клиенты") And _

relLoop.ForeignTable = "Заказы") Then

' Задает для свойства PartialReplica объекта Relation

' значение True.

relLoop.PartialReplica = True

Exit For

End If

Next relLoop

End Sub

Примечание.   Если для одной таблицы установлены фильтр реплики и связь реплики, то два условия комбинируются с помощью логической операции ИЛИ.  Например, если в предыдущем примере отобрать все заказы со стоимостью, превышающей $1000 ИЛИ все заказы из Твери, то в числе последних будут и те, стоимость которых ниже $1000.


Свойство Prepare, пример

Следующая программа использует свойство Prepare для указания прямого выполнения запроса без предварительного создания сохраненной процедуры на сервере.

Sub PrepareX()

Dim wrkODBC As Workspace

Dim conPubs As Connection

Dim qdfTemp As QueryDef

Dim rstTemp As Recordset

' Создает объект Workspace ODBCDirect и открывает

' объект Connection.

Set wrkODBC = CreateWorkspace("", _

"admin", "", dbUseODBC)

Set conPubs = wrkODBC.OpenConnection("Publishers", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

Set qdfTemp = conPubs.CreateQueryDef("")

With qdfTemp

' Этот запрос будет выполнен только один раз, поэтому

' необходимо вызвать функцию SQLExecDirect API ODBC.

' Без задания данного свойства перед определением

' свойства SQL функция SQLPrepare API ODBC все равно

' будет выызвана, что приведет к потере всего выигрыша

' в быстродействии.

.Prepare = dbQUnprepare

.SQL = "UPDATE roysched " & _

"SET royalty = royalty * 2 " & _

"WHERE title_id LIKE 'BU____' OR " & _

"title_id LIKE 'PC____'"

.Execute

End With

Debug.Print "Query results:"

' Открывает набор измененных записей.

Set rstTemp = conPubs.OpenRecordset( _

"SELECT * FROM roysched " & _

"WHERE title_id LIKE 'BU____' OR " & _

"title_id LIKE 'PC____'")

' Отображает набор записей.

With rstTemp

Do While Not .EOF

Debug.Print , !title_id, !lorange, _

!hirange, !royalty

.MoveNext

Loop

.Close

End With

conPubs.Close

wrkODBC.Close

End Sub


Свойства RecordStatus и DefaultCursorDriver, пример

Следующая программа использует свойства RecordStatus и DefaultCursorDriver для демонстрации изменений в локальном объекте Recordset во время пакетного обновления.  Для выполнения данной процедуры требуется функция RecordStatusOutput.

Sub RecordStatusX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim rstTemp As Recordset

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

' Это значение свойства DefaultCursorDriver

' требуется для пакетного обновления.

wrkMain.DefaultCursorDriver = dbUseClientBatchCursor

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Следующий аргумент блокировки

' требуется для пакетного обновления.

Set rstTemp = conMain.OpenRecordset( _

"SELECT * FROM authors", dbOpenDynaset, 0, _

dbOptimisticBatch)

With rstTemp

.MoveFirst

Debug.Print "Исходная запись: " & !au_lname

Debug.Print , RecordStatusOutput2(.RecordStatus)

.Edit

!au_lname = "Bowen"

.Update

Debug.Print "Измененная запись: " & !au_lname

Debug.Print , RecordStatusOutput2(.RecordStatus)

.AddNew

!au_lname = "NewName"

.Update

Debug.Print "Новая запись: " & !au_lname

Debug.Print , RecordStatusOutput2(.RecordStatus)

.Delete

Debug.Print "Удаленная запись: " & !au_lname

Debug.Print , RecordStatusOutput2(.RecordStatus)

' Закрывает локальный набор записей

' без обновления данных на сервере.

.Close

End With

conMain.Close

wrkMain.Close

End Sub

Function RecordStatusOutput(lngTemp As Long) As String

Dim strTemp As String

strTemp = ""

' Создает отображаемую строку на основании

' значения свойства RecordStatus.

If lngTemp = dbRecordUnmodified Then _

strTemp = "[dbRecordUnmodified]"

If lngTemp = dbRecordModified Then _

strTemp = "[dbRecordModified]"

If lngTemp = dbRecordNew Then _

strTemp = "[dbRecordNew]"

If lngTemp = dbRecordDeleted Then _

strTemp = "[dbRecordDeleted]"

If lngTemp = dbRecordDBDeleted Then _

strTemp = "[dbRecordDBDeleted]"

RecordStatusOutput = strTemp

End Function


Свойство Replicable, пример

Следующие примеры иллюстрируют применение свойства Replicable в двух ситуациях: к базе данных и к объекту базы данных.

Следующая программа преобразует базу данных Борей.mdb в реплицируемую.  Перед выполнением этой программы рекомендуется создать резервную копию базы данных "Борей".  Необходимо также указать в программе путь к базе данных "Борей" на вашем компьютере.

Sub MakeDesignMasterX()

Dim dbsNorthwind As Database

Dim prpNew As Property

' Открывает базу данных для монопольного доступа.

Set dbsNorthwind = OpenDatabase("Борей.mdb", True)

With dbsNorthwind

' Создает свойство Replicable, если оно не существует.

' Если свойство существует, отключает обработку ошибок.

On Error Resume Next

Set prpNew = .CreateProperty("Replicable", _

dbText, "T")

.Properties.Append prpNew

' Задает для свойства Replicable базы данных значение True.

.Properties("Replicable") = "T"

.Close

End With

End Sub

Следующая программа создает новый объект TableDef и делает его реплицируемым.  Для выполнения этой процедуры необходимо предварительно реплицировать базу данных.

Sub CreateReplLocalTableX()

Dim dbsNorthwind As Database

Dim tdfNew As TableDef

Dim fldNew As Field

Dim prpNew As Property

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает новый объект TableDef с именем "Налоги".

Set tdfNew = dbsNorthwind.CreateTableDef("Налоги")

' Определяет текстовое поле "Ставка".

Set fldNew = tdfNew.CreateField("Ставка", dbText, 3)

' Добавляет новое поле в объект TableDef.

tdfNew.Fields.Append fldNew

' Добавляет новый объект TableDef в базу данных.

dbsNorthwind.TableDefs.Append tdfNew

' Создает новое свойство Replicable _
' для нового объекта TableDef.

Set prpNew = tdfNew.CreateProperty("Replicable", _

dbText, "T")

' Добавляет свойство Replicable в новый

' объект TableDef.

tdfNew.Properties.Append prpNew

dbsNorthwind.Close

End Sub

Следующая программа задает для свойства Replicable указанного объекта TableDef значение "T".  Если свойство не существует, оно создается и добавляется в семейство Properties таблицы, а затем получает значение "T".

Sub SetReplicable(tdfTemp As TableDef)

On Error GoTo ErrHandler

tdfTemp.Properties("Replicable") = "T"

On Error GoTo 0

Exit Sub

ErrHandler:

Dim prpNew As Property

If Err.Number = 3270 Then

Set prpNew = tdfTemp.CreateProperty("Replicable", _

dbText, "T")

tdfTemp.Properties.Append prpNew

Else

MsgBox "Ошибка " & Err & ": " & Error

End If

End Sub


Свойство ReplicaFilter, пример

Следующая программа использует свойство ReplicaFilter для репликации записей для клиентов из Твери.

Sub ReplicaFilterX()

' Предполагается, что текущая открытая база данных

' является репликой.

Dim tdfCustomers As TableDef

Dim strFilter As String

Dim dbsTemp As Database

Set dbsTemp = OpenDatabase("Борей.mdb")

Set tdfCustomers = dbsTemp.TableDefs("Клиенты")

' Выполняет синхронизацию с полной репликой

' перед установлением фильтра.

dbsTemp.Synchronize "C:\SALES\FY96.MDB"

strFilter = "Город = 'Тверь'"

tdfCustomers.ReplicaFilter = strFilter

dbsTemp.PopulatePartial "C:\SALES\FY96.MDB"

' Удаляет фильтр реплики, созданный только

' для демонстрации.

tdfCustomers.ReplicaFilter = False

' Снова заполняет базу данных

dbsTemp.PopulatePartial "C:\SALES\DATA96.MDB"

End Sub


Свойство ReplicaID, пример

Следующая программа создает реплику из основной реплики Борей.mdb, а затем возвращает код ReplicaID, автоматически создаваемый ядром базы данных Microsoft Jet.  (Если вы еще не создали основную реплику базы данных "Борей", обратитесь к примеру для свойства Replicable или замените в программе имя базы данных на имя существующей основной реплики).

Sub MakeReplicaReplicaIDX()

Dim dbsNorthwind As Database

Dim prpReplicaID As Property

Dim dbsReplica As Database

Set dbsNorthwind = OpenDatabase("Борей.mdb")

' Создает новую реплику.

dbsNorthwind.MakeReplica "Nwreplica2.mdb", _

"вторая реплика"

dbsNorthwind.Close

' Открывает новую реплику, чтобы прочитать значение ReplicaID.

Set dbsReplica = OpenDatabase("Nwreplica2.mdb")

Debug.Print dbsReplica.ReplicaID

dbsReplica.Close

End Sub


Свойство Required, пример

Следующая программа использует свойство Required, чтобы сообщить, какие поля в трех таблицах должны содержать данные при добавлении новой записи.  Для выполнения этой процедуры требуется процедура RequiredOutput.

Sub RequiredX()

Dim dbsNorthwind As Database

Dim tdfloop As TableDef

Set dbsNorthwind = OpenDatabase("Борей.mdb")

With dbsNorthwind

' Показывает, какие поля в семействе Fields

' трех объектов TableDef являются обязательными.

RequiredOutput .TableDefs("Типы")

RequiredOutput .TableDefs("Клиенты")

RequiredOutput .TableDefs("Сотрудники")

.Close

End With

End Sub

Sub RequiredOutput(tdfTemp As TableDef)

Dim fldLoop As Field

' Отображает семейство Fields указанного объекта TableDef

' и печатает значение свойства Required.

Debug.Print "Поля в " & tdfTemp.Name & ":"

For Each fldLoop In tdfTemp.Fields

Debug.Print , fldLoop.Name & ", Required = " & _

fldLoop.Required

Next fldLoop

End Sub


Свойство StillExecuting и метод Cancel, пример

Следующая программа использует свойство StillExecuting и метод Cancel для асинхронного открытия объекта Connection.

Sub CancelConnectionX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim sngTime As Single

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

' Открывает асинхронное подключение.

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt + dbRunAsync, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

sngTime = Timer

' Ожидает пять секунд.

Do While Timer - sngTime < 5

Loop

' Если подключение не установлено, запрашивает пользователя,

' следует ли продлить ожидание. Если нет команды на продление,

' отменяет подключение и осуществляет выход из процедуры.

Do While conMain.StillExecuting

If MsgBox("Подключение не установлено. Продлить ожидание?", _

vbYesNo) = vbNo Then

conMain.Cancel

MsgBox "Подключение отменено!"

wrkMain.Close

Exit Sub

End If

Loop

With conMain

' Использует объект Connection с именем conMain.

.Close

End With

wrkMain.Close

End Sub

Следующая программа использует свойство StillExecuting и метод Cancel для асинхронного выполнения объекта QueryDef.

Sub CancelQueryDefX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim qdfTemp As QueryDef

Dim sngTime As Single

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

Set qdfTemp = conMain.CreateQueryDef("")

With qdfTemp

.SQL = "UPDATE roysched " & _

"SET royalty = royalty * 2 " & _

"WHERE title_id LIKE 'BU____' OR " & _

"title_id LIKE 'PC____'"

' Выполняет асинхронный запрос.

.Execute dbRunAsync

sngTime = Timer

' Ожидает пять секунд.

Do While Timer - sngTime < 5

Loop

' Если запрос не завершен, запрашивает пользователя,

' следует ли продлить ожидание. Если нет команды на продление,

' отменяет запрос и осуществляет выход из процедуры.

Do While .StillExecuting

If MsgBox( _

"Запрос выполняется. Продлить ожидание?", _

vbYesNo) = vbNo Then

.Cancel

MsgBox "Запрос отменен!"

Exit Do

End If

Loop

End With

conMain.Close

wrkMain.Close

End Sub

Следующая программа использует свойство StillExecuting и метод Cancel для асинхронного перемещения на последнюю запись в объекте Recordset.

Sub CancelRecordsetX()

Dim wrkMain As Workspace

Dim conMain As Connection

Dim rstTemp As Recordset

Dim sngTime As Single

Set wrkMain = CreateWorkspace("ODBCWorkspace", _

"admin", "", dbUseODBC)

Set conMain = wrkMain.OpenConnection("Publishers", _

dbDriverNoPrompt, False, _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

Set rstTemp = conMain.OpenRecordset( _

"SELECT * FROM roysched", dbOpenDynaset)

With rstTemp

' Вызывает асинхронный метод MoveLast.

.MoveLast dbRunAsync

sngTime = Timer

' Ожидает пять секунд.

Do While Timer - sngTime < 5

Loop

' Если метод MoveLast не завершен, запрашивает пользователя,

' следует ли продлить ожидание. Если нет команды на продление,

' отменяет метод и осуществляет выход из процедуры.

Do While .StillExecuting

If MsgBox( _

"Не последняя запись. Продлить ожидание?", _

vbYesNo) = vbNo Then

.Cancel

MsgBox "Метод MoveLast отменен!"

conMain.Close

wrkMain.Close

Exit Sub

End If

Loop

' Использует набор записей.

.Close

End With

conMain.Close

wrkMain.Close

End Sub


Свойство Transactions, пример

Следующая программа демонстрирует использование свойства Transactions в рабочей области Microsoft Jet и рабочей области ODBCDirect.

Sub TransactionsX()

Dim wrkJet As Workspace

Dim wrkODBC As Workspace

Dim dbsNorthwind As Database

Dim conPubs As Connection

Dim rstTemp As Recordset

' Открывает рабочие области Microsoft Jet и ODBCDirect,

' базу данных Microsoft Jet и подключение ODBCDirect.

Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)

Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)

Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

Set conPubs = wrkODBC.OpenConnection("", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Открывает два объекта Recordset и отображает

' свойство Transactions каждого объекта.

Debug.Print "Открывает объект Recordset Microsoft Jet " & _

"типа таблицы..."

Set rstTemp = dbsNorthwind.OpenRecordset( _

"Сотрудники", dbOpenTable)

Debug.Print "    Transactions = " & rstTemp.Transactions

Debug.Print "Открывает объект Recordset с последовательным " & _

" доступом, где источник задается инструкцией SQL..."

Set rstTemp = dbsNorthwind.OpenRecordset( _

"SELECT * FROM Сотрудники", dbOpenForwardOnly)

Debug.Print "    Transactions = " & rstTemp.Transactions

' Отображает свойство Transactions объекта Connection

' в рабочей области ODBCDirect.

Debug.Print "Проверка свойства Transaction для " & _

"подключения ODBC..."

Debug.Print "    Transactions = " & conPubs.Transactions

rstTemp.Close

dbsNorthwind.Close

conPubs.Close

wrkJet.Close

wrkODBC.Close

End Sub


Свойство UserName, пример

Следующая программа использует свойство UserName, чтобы изменить разрешения, которые конкретный пользователь имеет на объект, и проверить, может ли пользователь добавлять новые данные в этот объект.

Sub UserNameX()

' Проверяет, доступен ли файл системной

' базы данных Microsoft Jet.

DBEngine.SystemDB = "system.mdw"

Dim dbsNorthwind As Database

Dim docTemp As Document

Set dbsNorthwind = OpenDatabase("Борей.mdb")

Set docTemp = _

dbsNorthwind.Containers("Tables").Documents(0)

' Изменяет разрешения, которые "НовыйПользователь" имеет на

' первый объект Document в контейнере Tables.

With docTemp

.UserName = "НовыйПользователь"

.Permissions = dbSecRetrieveData

If (.Permissions And dbSecInsertData) = _

dbSecInsertData Then

Debug.Print .UserName & " может вставлять данные."

Else

Debug.Print .UserName & " не может вставлять данные."

End If

End With

dbsNorthwind.Close

End Sub


Свойство Version, пример

Следующая программа использует свойство Version для проверки версии ядра базы данных Microsoft Jet в памяти, базы данных Microsoft Jet и подключения ODBC.

Sub VersionX()

Dim wrkJet As Workspace

Dim dbsNorthwind As Database

Dim wrkODBC As Workspace

Dim conPubs As Connection

' Открывает объект Database Microsoft Jet.

Set wrkJet = CreateWorkspace("NewJetWorkspace", _

"admin", "", dbUseJet)

Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

' Создает объект Workspace ODBCDirect

' и открывает объект Connection.

Set wrkODBC = CreateWorkspace("NewODBCWorkspace", _

"admin", "", dbUseODBC)

Set conPubs = wrkODBC.OpenConnection("Connection1", , , _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")

' Демонстрирует три способа использования свойства Version.

Debug.Print "Версия объекта DBEngine (Microsoft Jet " & _

"в памяти) = " & DBEngine.Version

Debug.Print "Версия ядра Microsoft Jet " & _

"в которой была создана база данных " & dbsNorthwind.Name & _

" = " & dbsNorthwind.Version

Debug.Print "Версия подключения ODBCDirect " & _

"(через свойство Database) = " & _

conPubs.Database.Version

dbsNorthwind.Close

conPubs.Close

wrkJet.Close

wrkODBC.Close

End Sub


Свойства Connect и ReturnsRecords, пример для конфигурации клиент/сервер

В данном примере с помощью свойств Connect и ReturnsRecords из базы данных на сервере Microsoft SQL Server отбираются пять книг, имеющих максимальные результаты продаж за год.  Если обнаруживается совпадение в результатах продаж, размер выводящегося списка увеличивается и выводится сообщение с объяснением причины.

Sub ClientServerX1()

Dim dbsCurrent As Database

Dim qdfPassThrough As QueryDef

Dim qdfLocal As QueryDef

Dim rstTopFive As Recordset

Dim strMessage As String

' Открывает базу данных, для которой будут

' созданы объекты QueryDef.

Set dbsCurrent = OpenDatabase("DB1.mdb")

' Создает запрос к серверу для загрузки данных

' из базы данных Microsoft SQL Server.

Set qdfPassThrough = _

dbsCurrent.CreateQueryDef("ВсеНазвания")

qdfPassThrough.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"

qdfPassThrough.SQL = "SELECT * FROM titles " & _

"ORDER BY ytd_sales DESC"

qdfPassThrough.ReturnsRecords = True

' Создает временный объект QueryDef для загрузки

' данных из запроса к серверу.

Set qdfLocal = dbsCurrent.CreateQueryDef("")

qdfLocal.SQL = "SELECT TOP 5 title FROM ВсеНазвания"

Set rstTopFive = qdfLocal.OpenRecordset()

' Отображает результаты запросов.

With rstTopFive

strMessage = _

"Первые 5 бестселлеров:" & vbCr

Do While Not .EOF

strMessage = strMessage & "    " & !Title & _

vbCr

.MoveNext

Loop

If .RecordCount > 5 Then

strMessage = strMessage & _

"(В списке " & _

vbCr & .RecordCount & _

" книг, так как несколько имеют одинаковые результаты)"

End If

MsgBox strMessage

.Close

End With

' Удаляет новый запрос к серверу, созданный только для

' демонстрации.

dbsCurrent.QueryDefs.Delete "ВсеНазвания"

dbsCurrent.Close

End Sub


Методы CreateQueryDef, OpenRecordset и свойство SQL, пример для конфигурации клиент/сервер

В данном примере методы CreateQueryDef и OpenRecordset и свойство SQL используются для выполнения запроса по таблице из базы данных Microsoft SQL Server "Pubs", содержащей заголовки публикаций, и возвращается название и код книги с наилучшими результатами продаж.  Далее в программе выполняется запрос по таблице, содержащей имена авторов, и вычисляется доля премии, полагающейся каждому из соавторов бестселлера (общая сумма премии $1000 делится на соавторов).

Sub ClientServerX2()

Dim dbsCurrent As Database

Dim qdfBestSellers As QueryDef

Dim qdfBonusEarners As QueryDef

Dim rstTopSeller As Recordset

Dim rstBonusRecipients As Recordset

Dim strAuthorList As String

' Открывает базу данных, для которой будут

' созданы объекты QueryDef.

Set dbsCurrent = OpenDatabase("DB1.mdb")

' Создает временный объект QueryDef для загрузки

' данных из базы данных Microsoft SQL Server.

Set qdfBestSellers = dbsCurrent.CreateQueryDef("")

With qdfBestSellers

.Connect = "ODBC;DATABASE=pubs;UID=sa;PWD=;" & _

 "DSN=Publishers"

.SQL = "SELECT title, title_id FROM titles " & _

"ORDER BY ytd_sales DESC"

Set rstTopSeller = .OpenRecordset()

rstTopSeller.MoveFirst

End With

' Создает временный объект QueryDef для загрузки данных

' из базы данных Microsoft SQL Server по результатам

' первого запроса.

Set qdfBonusEarners = dbsCurrent.CreateQueryDef("")

With qdfBonusEarners

.Connect = "ODBC;DATABASE=pubs;UID=sa;PWD=;" & _

"DSN=Publishers"

.SQL = "SELECT * FROM titleauthor " & _

"WHERE title_id = '" & _

rstTopSeller!title_id & "'"

Set rstBonusRecipients = .OpenRecordset()

End With

' Создает выводящуюся строку.

With rstBonusRecipients

Do While Not .EOF

strAuthorList = strAuthorList & "    " & _

!au_id & ":  $" & (10 * !royaltyper) & vbCr

.MoveNext

Loop

End With

' Отображает результаты.

MsgBox "Выслать чек следующим авторам " & _

"на указанную сумму:" & vbCr & _

strAuthorList & "за успешную продажу " & _

rstTopSeller!Title & "."

rstTopSeller.Close

dbsCurrent.Close

End Sub


Методы CreateTableDef и FillCache и свойства CacheSize, CacheStart и SourceTableName, пример для конфигурации клиент/сервер

В данном примере методы CreateTableDef и FillCache и свойства CacheSize, CacheStart и SourceTableName используются, чтобы дважды перебрать все записи в присоединенной таблице, первый раз без временного буфера и второй с временным буфером на 50 записей.  Далее выводятся статистические данные о выполнении этой операции с временным буфером и без него.

Sub ClientServerX3()

Dim dbsCurrent As Database

Dim tdfRoyalties As TableDef

Dim rstRemote As Recordset

Dim sngStart As Single

Dim sngEnd As Single

Dim sngNoCache As Single

Dim sngCache As Single

Dim intLoop As Integer

Dim strTemp As String

Dim intRecords As Integer

' Открывает базу данных, в которую будет добавлена

' присоединенная таблица.

Set dbsCurrent = OpenDatabase("DB1.mdb")

' Создает таблицу, присоединенную к базе данных

' Microsoft SQL Server.

Set tdfRoyalties = _

dbsCurrent.CreateTableDef("Отчисления")

tdfRoyalties.Connect = _

"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"

tdfRoyalties.SourceTableName = "roysched"

dbsCurrent.TableDefs.Append tdfRoyalties

Set rstRemote = _

dbsCurrent.OpenRecordset("Отчисления")

With rstRemote

' Дважды перебирает записи в объекте Recordset

' и определяет затраченное время.

sngStart = Timer

For intLoop = 1 To 2

.MoveFirst

Do While Not .EOF

' Выполняет простую операцию

' для проверки быстродействия.

strTemp = !title_id

.MoveNext

Loop

Next intLoop

sngEnd = Timer

sngNoCache = sngEnd - sngStart

' Помещает в буфер первые 50 записей.

.MoveFirst

.CacheSize = 50

.FillCache

sngStart = Timer

' Дважды перебирает записи в объекте Recordset

' и определяет затраченное время.

For intLoop = 1 To 2

intRecords = 0

.MoveFirst

Do While Not .EOF

' Выполняет простую операцию

' для проверки быстродействия.

strTemp = !title_id

' Подсчитывает записи. Если достигнут конец

' буфера, то в буфер помещаются

' следующие 50 записей.

intRecords = intRecords + 1

.MoveNext

If intRecords Mod 50 = 0 Then

.CacheStart = .Bookmark

.FillCache

End If

Loop

Next intLoop

sngEnd = Timer

sngCache = sngEnd - sngStart

' Выводит результаты.

MsgBox "Сравнение результатов:" & vbCr & _

"    Без буфера: " & Format(sngNoCache, _

"##0.000") & " секунд" & vbCr & _

"    С буфером на 50 записей: " & Format(sngCache, _

"##0.000") & " секунд"

.Close

End With

' Удаляет присоединенную таблицу, созданную для демонстрации.

dbsCurrent.TableDefs.Delete tdfRoyalties.Name

dbsCurrent.Close

End Sub