Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как блокировать таблицу при помощи 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, ,
и вообще модификация структуры таблицы,
действия,
откат


Наверх

Титульная страница Поиск, карта сайта Написать письмо