![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как блокировать таблицу при помощи ADO [D6, MSAccess]
Eugene1501 © (2010-06-15 16:21:00)Здравствуйте.
Ситуация в следующем:
1. Есть приложение для работы с базой данных в сети через ADOConnection -> ADOCommand,ADOQuery.
2. База данных - Access.
Необходимо дать возможность приложению заблокировать на время таблицу ххх на запись и чтение так чтобы другие пользователи при обращении к таблице ххх просто ждали пока блокировка будет снята. Что-то типа Exlusive в TTable;
sniknik (2010-06-24 15:31:00) [1]даже твой способ с отдельной таблицей и значением из нее можно использовать, просто "довести до ума", чтобы не было промежутком между получением и записью нового значения.
хотя этот я бы крайне не рекомендовал.
sniknik (2010-06-24 15:28:00) [2]> То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
неправильно. это просто простой способ. один из. еще можно пользоваться естественными ключами, или гуидами.
12 (2010-06-24 15:21:00) [3]http://support.microsoft.com/kb/815629
Anatoly Podgoretsky (2010-06-24 15:13:00) [4]
> > База у тебя есть?
>
> Есть.
Ну так и пользуйся ее возможностями.
Eugene1501 (2010-06-24 13:50:00) [5]
> нужно не с этим, само изобретенным велосипедом, бороться,
> а сделать нормальную структуру таблицы с автоинкрементным
> id.
> и вообще, не выдумывать своего, кривого, пока не изучишь
> что для этого есть уже, стандартное.
То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
А как быть в том случае, если мне нужно получить значение ключевого поля для только что вставленной записи? Причем ключевое поле, назовем его Id, единственный уникальный идентификатор записи таблицы.
Eugene1501 (2010-06-24 13:47:00) [6]
> База у тебя есть?
Есть.
sniknik (2010-06-24 07:51:00) [7]нужно не с этим, само изобретенным велосипедом, бороться, а сделать нормальную структуру таблицы с автоинкрементным id.
и вообще, не выдумывать своего, кривого, пока не изучишь что для этого есть уже, стандартное.
Anatoly Podgoretsky (2010-06-23 20:23:00) [8]> Eugene1501 (23.06.2010 18:02:12) [12]
База у тебя есть?
Eugene1501 (2010-06-23 18:02:00) [9]Ладно, может подскажете как организовать следующее:
Есть таблица "Документы" - ключевое поле "Id". Максимальное значение поля "Id" я храню в таблице "wtId". При добавление нового документа, открываю таблицу wtId, читаю значение Id, увеличиваю на единицу и записываю новое значение Id, которое использую при добавлении документа в таблицу "Документы". Такой вот механизм формирования значения ключа. Все хорошо до тех пор, пока не начинается работа в сети нескольких пользователей. Бывают ситуации, что разные пользователи одновременно формируют этот уникальный ключ и получают одинаковые значения, при записи документа естественно происходит ошибка. Как с этим бороться?
sniknik (2010-06-21 19:34:00) [10]не получится, т.к. "помощи ADO" ([0]), а он ориентирован на запросы. вот если бы не это ограничение то можно было посмотреть на методы ADOX/jet/jro там глядишь и нашлось бы что-то блокирующее таблицу... т.к. они могут работать непосредственно с обьектами. ну и тогда о запросах пришлось бы забыть, только табличные методы.
12 (2010-06-21 15:21:00) [11]
> Eugene1501 (18.06.10 15:46) [4]
>
>
> > может, что-то типа
> >
> > begintrans
> > update table set fld = 1 where 1=1
> > делаем что-то и
> > rollbacktrans
>
>
> Пока выполняется транзакция другие пользователи могут читать
> данные из таблицы, такой вариант не подходит (.
а если попробовать update структуры?
(например, имя поля переименовать)
Anatoly Podgoretsky (2010-06-19 17:59:00) [12]Вообще ничего блоумровать не надо, не зато боролись
Palladin (2010-06-19 17:07:00) [13]
> sniknik © (19.06.10 13:04) [7]
Ну чего ты придираешься? ) Ну не представляет чудо-программист себе жизни без процедуры Exlusive ) Не понимает что блокировать-то не таблицы надо, а древо данных на уровне корневого объекта )
sniknik (2010-06-19 13:04:00) [14]вот почему как только сделают технологию избавленную от некоторых недостатков, так тут же появляются те кто не представляет себе программирования/логики без этих недостатков?
> Нужно сделать следующее:
почему нельзя сделать вместо этого "следующего" следующее:
> 2. Прочитать определенное значение.
> 3. Записать определенное значение.
???
Anatoly Podgoretsky (2010-06-18 19:31:00) [15]> Eugene1501 (18.06.2010 15:50:05) [5]
Заблокировать таблицу и уехать в командировку на пару недель.
Eugene1501 (2010-06-18 15:50:00) [16]Нужно сделать следующее:
1. Заблокировать таблицу на чтение для других пользователей.
2. Прочитать определенное значение.
3. Записать определенное значение.
4. Разблокировать таблицу.
Eugene1501 (2010-06-18 15:46:00) [17]
> может, что-то типа
>
> begintrans
> update table set fld = 1 where 1=1
> делаем что-то и
> rollbacktrans
Пока выполняется транзакция другие пользователи могут читать данные из таблицы, такой вариант не подходит (.
12 (2010-06-17 08:34:00) [18]
> возможно, есть свои готовые заморочки
99% есть
надо на форумах VB смотреть. Что-то типа Lock table, если память не изменяет
> Виталий Панасенко(дом) (16.06.10 18:40) [2]
>
> а если в fld не 1, а 2?
неважно, потом же rollbacktrans
Виталий Панасенко(дом) (2010-06-16 18:40:00) [19]
> 12 © (16.06.10 13:45) [1]
а если в fld не 1, а 2?
мне так кажется, что так д.б.
update table
set fld=fld
а вообще, возможно, есть свои готовые заморочки
12 (2010-06-16 13:45:00) [20]может, что-то типа
begintrans
update table set fld = 1 where 1=1
делаем что-то и
rollbacktrans
или
begintrans, ,
и вообще модификация структуры таблицы,
действия,
откат