Доступ к заблокированной таблице

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Доступ к заблокированной таблице

Сообщение vvs_adm » 12.05.2005 (Чт) 15:09

У меня есть программа, где есть небольшая вероятность одновременного открытия (через ADODB.recordset) одной и той же таблицы (Access) на запись двумя пользователями. Соответственно при попытке открытия вылетает ошибка. Как проверить, не заблокированна ли таблица и тут же её заблокировать (если свободна)?

P.S.: пробовал "в лоб" - через On Error Goto , но почему-то обрабатывается только первая ошибка, а при повторном запросе вылетает с ошибкой вся программа, как буд-то никакого OnError нету :(

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 12.05.2005 (Чт) 16:44

Проверяй директорию на .ldb file.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 12.05.2005 (Чт) 17:50

val писал(а):Проверяй директорию на .ldb file.
И что? Если таблица открыта другим пользователем на чтение, то и хрен бы с ним. Лишь бы не на запись...
Может кто знает, хотя бы, как обработать ошибку? Дело в том, что открывается на запись таблица "ненадолго", мне не в лом и в цикле покрутиться, пока таблица не разблокируется, но крутиться не желает зараза, обрабатывает только первую ошибку, после чего вылетает обычная ошибка, как буд-то никакого OnError нету!! Код примерно такой :
Код: Выделить всё
Dim cnTemp as ADODB.connection
Dim rsTemp as New ADODB.recordset
set cnTemp = cnMain
cnTemp.Open

set rsTemp.ActiveConnection = cnTemp
rsTemp.Source = "MyTable"
rsTemp.LockType = adLockPessimistic
rsTemp.CursorType = adOpenStatic
Retry:
On Error Goto Retry
rsTemp.Open
.... если open, то ура ...

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 12.05.2005 (Чт) 18:00

Так сделай цикл явный:
Код: Выделить всё
On Error Goto Next
while rsTemp.Active = false and lCountIteration <> 10000
   rsTemp.Open
   lCountIteration = lCountIteration + 1
wend
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 12.05.2005 (Чт) 18:08

Igor_123 А какая разница? После второго подключения все-равно вылетит минуя OnError... Принцип то остался тот же : подключиться, если ошибка, то подключиться опять... Но уже второе подключение вылетает с системной ошибкой и последующим вылетом программы (ну если в отладке, то в дебаггер,а если готовый exe-шник, то нафиг) а НЕ с обработчиком OnError... Почему не срабатывает On Error. Таблицу в частности блокирую открытием в режиме конструктор, но это не суть важно, по-моему...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.05.2005 (Чт) 18:14

В нормальных СУБД есть такое понятие - LOCK TIMEOUT. Поищи в Аксессе, вдруг там это есть.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 12.05.2005 (Чт) 18:25

Ennor А типа мысль :) Попробуем... хотя не того хотелось. Неужели нет другого способа :(

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.05.2005 (Чт) 18:48

Это классический (и, по-правильному, единственный) способ определения доступности объекта в блокировочных СУБД. В принципе, наверняка можно нарыть системную таблицу со списком этих самых блокировок (типа syslockinfo в MSSQL), но это способ, который я отношу к неправильным, ибо он будет зависеть от версии Аксесса, а версия Аксесса - это не настолько постоянная величина, насколько постоянна версия сиквела :).

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 12.05.2005 (Чт) 21:30

Ennor Да оно все бы замечательно было, тока все-таки непонятно, почему повторный метод опен вызывает не обработку ошибки OnError, а "обычный ран-тайм" :(

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.05.2005 (Чт) 22:07

Скорее всего, потому, что в этом случае ошибка происходит в обработчике ошибок, а такое, видимо, не обрабатывается. Лучше, действительно, On Error Resume Next и цикл пока не запишет данные.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 13.05.2005 (Пт) 10:44

EnnorВот большое спасибо-то!!! Мало того, что заработало оч. замечательно, так еще и код стал гораздо лучше с Do While вместо Goto :)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList  
cron