Константа | Описание |
adEditNone | Редактирование не выполняется. |
adEditInProgress | Данные в текущей записи изменились, но сохранение еще не выполнялось. |
adEditAdd | Данное значение свойство EditMode принимает после вызова метода AddNew. Оно показывает, что буфер копирования содержит еще не сохраненную новую запись. |
adEditDelete | Текущая запись была удалена. |
Значение свойства EditMode отражает состояние буфера, используемого для создания и редактирования записей. Оно используется, когда при выходе из режима редактирования выбран соответствующий метод (Update или CancelUpdate).
Тестирование блокировок
Применяемые к записям блокировки можно протестировать, просмотрев значения свойств LockType и EditMode, но обычно гораздо более важно выяснить тип блокировки, налагаемой другим пользователем на требуемые данные. Единственный способ выполнения поставленной задачи фактически состоит в не- обходимости вызова ошибки конфликта доступа.
При возникновении ошибки провайдер OLEDB Jet выдает определенную информацию о типе блокировки, применяемой другим пользователем. В случае конфликта следует проверить свойство подключения:
|
|
Connection.Errors(index). SQLState
для точного выяснения вида возникшей ошибки. В табл. 4 приводятся некоторые коды ошибок конф-ликта доступа, возвращаемые при обращении к свойству .SQLState.
Таблица 4 Коды ошибок блокировки, возвращаемые поставщиком Jet 4.0 OLEDB
Код | Сообщение |
3006 | Database <name> is exclusively locked. (База данных <имя> используется в монопольном режиме.) |
3008 | The table <name> is already opened by another user, or it's already open through the user interface and can't be manipulated programmatically. (База данных <имя> уже открыта другим пользователем, либо она открыта посредством пользовательского интерфейса, и ее программная обработка запрещена.) |
Таблица 4 Коды ошибок блокировки, возвращаемые провайдером Jet 4.0 OLEDB (продолжение)
Код | Сообщение |
3009 | You tried to lock table <tablename> while opening it, but the table can't be locked because it's currently in use. Wait a moment, and then try the operation again. (Предпринята попытка блокировки таблицы <имятаблицы>, но эта операция невозможна, поскольку в данный момент таблица используется. Подождите немного, а затем повторите попытку.) |
3027 | Can't update; database or object is read-only. (Обновление невозможно. База данных или объект доступен только для чтения.) |
3046 | Couldn't save; currently locked by another user. (Сохранение невозможно. Объект блокирован другим пользователем.) |
3158 | Couldn't save record; currently locked by another user. (Сохранение записи невозможно. Она блокирована другим пользователем.) |
3164 | The field can't be updated because another user or process has locked the corresponding record or table. (Обновление поля невозможно, поскольку соответствующая запись или таблица блокирована другим пользователем либо процессом.) |
3186 | Couldn't save; currently locked by user <name> on machine <name>. (Сохранение невозможно. Объект блокирован пользователем <имя> на компьютере <имя>.) |
3187 | Couldn't read; currently locked by user <name> on machine <name>. (Чтение невозможно. Объект блокирован пользователем <имя> на компьютере <имя>.) |
3188 | Couldn't update; currently locked by another session on this machine. (Обновление невозможно. Объект блокирован в течение другого сеанса работы на этом компьютере.) |
3189 | Table <name> is exclusively locked by user <name> on machine <name>. (Таблица <имя> блокирована в монопольном режиме пользователем <имя> на компьютере <имя>.) |
3197 | The Microsoft Jet database engine stopped the process because you and another user are attempting to change the same data at the same time. (Механизм баз данных Microsoft Jet остановил процесс вследствие одновременной попытки двух пользователей изменить одни и те же данные.) |
3202 | Couldn't save; currently locked by another user. (Сохранение невозможно. Объект блокирован другим пользователем.) |
3211 | The database engine couldn't lock table <name> because it's already in use by another person or process. (Механизм баз данных не выполнил блокировку таблицы <имя>, поскольку она уже используется другим лицом либо процессом.) |
3212 | Couldn't update; currently locked. (Обновление невозможно. Объект блокирован.) |
3218 | Couldn't update; currently locked by user <name> on machine <name>. (Обновление невозможно. Объект блокирован пользователем <имя> на компьютере <имя>.) |
3260 | Table <name> is exclusively locked by user <name> on machine <name>. (Таблица <имя> блокирована в монопольном режиме пользователем <имя> на компьютере <имя>.) |
3261 | Couldn't lock table <name>; currently in use by user <name> on machine <name>. (Блокировка таблицы <имя> невозможна. Таблица используется пользователем <имя> на компьютере <имя>.) |
Массив ошибок также содержит и другую потенциально полезную информацию об ошибке блокировки: данные о блокировке, используемой другим пользователем. Свойства NativeError и Number сообщают о блокировке, препятствующей выполнению требуемой операции. Сочетания этих свойств и их значения приведены в табл. 5.
|
|
Таблица 5 Сочетания свойств NativeError и Number объекта Connection. Errors для идентификации типа блокировки
Пользователь | Свойство | Значение | Тип блокировки |
Данный пользователь | Connection.Errors(0).NativeError | -533791822 | Пессимистическая |
Данный пользователь | Connection.Errors(O).Number | -105514571 | Оптимистическая |
Другой пользователь | Connection.Errors(O).NativeEr | -2147467259 | Пессимистическая |
Другой пользователь | Connection.Errors(O).Number | -2147217887 | Оптимистическая |
На данном этапе смысл этих значений не совсем очевиден, разве что их можно использовать при выборе момента для еще одной попытки обновления данных. Однако реальную ситуацию, когда они могут понадобиться, предвидеть трудно. Пока будем считать их применение делом будущего.