powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка оптимистическая
6 сообщений из 6, страница 1 из 1
Блокировка оптимистическая
    #32298372
Maligor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MS SQL2000(MSDE)+AccessXP.adp На сервере запрос с триггером Instead of.
На клиенте связанная форма,где в качестве источника данных SQL-инструкция (этот запрос и еше одна таблица для фильтрации данных).
( присутствует обработчик события OnError для формы,где идет проверка на номер ошибки 7787 и 7878).
Select Case DataErr
Case 7787
MsgBox strMsg, vbOKOnly + vbInformation, _
"Record Refresh"
Response = acDataErrContinue

В однопользовательском режиме все работает.

Запускаю клиентов на разных машинах и пытаюсь создать конфликт записи при обновлении(блокировка оптимистическая)
Ошибка ловится,но на Response = acDataErrContinue никакой реакции и после выхода из этой процедуры появляется сообщение “Multi-step OLE DB operation generated errors.Check each OLE DB status value,if available.No work was done”
и обновления записи не происходит.
С другой формой,которая отличается только набором полей,все нормально.
Как же это понимать?(вопросу уже больше года)
...
Рейтинг: 0 / 0
Блокировка оптимистическая
    #32298417
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> и пытаюсь создать конфликт записи при обновлении(блокировка оптимистическая

Раскажи и же как ты это пытаешся сделать оптимистическую блокировку на SQL-сервере?
...
Рейтинг: 0 / 0
Блокировка оптимистическая
    #32298482
Maligor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Формулирую по-другому:
Access обнаруживает конфликт записи,но на Response = acDataErrContinue никакой реакции и после выхода из этой процедуры появляется сообщение “Multi-step OLE DB operation generated errors.Check each OLE DB status value,if available.No work was done”
и обновления записи не происходит.
С другой формой,которая отличается только набором полей,все нормально.
...
Рейтинг: 0 / 0
Блокировка оптимистическая
    #32298560
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если аксес обнаруживает конфликт записи - значит он там есть (как мне кажется). Так с какой стати он должен запись апдейтить? Пусть ты даже ему три раза сказал Response = acDataErrContinue
...
Рейтинг: 0 / 0
Блокировка оптимистическая
    #32298593
Maligor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не отображает в форме новые(измененные другим пользователем) данные.В другой форме это происходит.
...
Рейтинг: 0 / 0
Блокировка оптимистическая
    #32346870
Maligor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть кому-нибудь пригодится,поэтому постараюсь по-подробнее описать как решалась данная задача.
На сервере запрос с триггером Instead of.
На клиенте связанная форма,где в качестве источника данных SQL-инструкция (этот запрос и еше одна таблица для фильтрации данных).
( присутствует обработчик события OnError для формы,где идет проверка на номер ошибки 7787 и 7878).
Запрос из четырех таблиц c LEFT JOIN.Связи один-к-одному.Одна таблица главная ,три других –детализация.Чтобы вся эта конструкция была обновляемая,небходимо в запрос включить ключевые поля из всех четырех таблиц.Поля таблицы фильтрации в источник данных не включаются. В качестве уникальной таблицы запрос с триггером.Для нормальной работы в триггере делается проверка на количество обновляемых/удаляемых записей и если таких записей нет-простой выход из триггера.
Т.к. запрос c LEFT JOIN,то возможна ситуация ,когда ключевые поля таблиц детализации в запросе будут Null.
Именно это и вызывало в моем случае сообщение об ошибке “Multi-step OLE DB operation generated errors.Check each OLE DB status value,if available.No work was done”,т.к. выяснилось,что
Ассess не может самостоятельно сформировать команду синхронизации с условием
Where ГлТаб.Ключ=? and ТабДет1.Ключ Is Null и т.д.
Решение: на событие формы BeforUpdate
в зависимости от значений Me. ТабДет(1,2,3)Ключ самому формировать команду синхронизации(точная копия источника записей формы без Where+ Where ГлТаб.Ключ=? and ТабДет1.Ключ Is Null и т.д. )
(сами поля ТабДет(1,2,3)Ключ на форму можно не помещать).
Чтобы при вставке записей не появлялось сообщение о противоречии с базовым источником записей, пришлось вручную делать на событие формы BeforUpdate Me.ТабДет(1,2,3)Ключ= Me.ГлТаб.Ключ по логике приложения.
Остается один вопрос:если первый пользователь изменил запись,а второй без изменения своей копии пытается ее удалить,то появляется ошибка 32 «Row cannot be located for updating. Some values may have been changed since it was last read»,хотя по-моему следовало бы
выдать ошибку WriteCoflict,а так придется каким-нибудь образом вручную обновлять запись.

Собственно вопрос: ошибка 32 это предусмотренная реакция Ассess на данную ситуацию или нет?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Блокировка оптимистическая
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]