-
Здравствуйте.
Ситуация в следующем:
1. Есть приложение для работы с базой данных в сети через ADOConnection -> ADOCommand,ADOQuery.
2. База данных - Access.
Необходимо дать возможность приложению заблокировать на время таблицу ххх на запись и чтение так чтобы другие пользователи при обращении к таблице ххх просто ждали пока блокировка будет снята. Что-то типа Exlusive в TTable;
-
может, что-то типа
begintrans
update table set fld = 1 where 1=1
делаем что-то и
rollbacktrans
или
begintrans, ,
и вообще модификация структуры таблицы,
действия,
откат
-
> 12 © (16.06.10 13:45) [1]
а если в fld не 1, а 2?
мне так кажется, что так д.б.
update table
set fld=fld
а вообще, возможно, есть свои готовые заморочки
-
> возможно, есть свои готовые заморочки
99% есть
надо на форумах VB смотреть. Что-то типа Lock table, если память не изменяет
> Виталий Панасенко(дом) (16.06.10 18:40) [2]
>
> а если в fld не 1, а 2?
неважно, потом же rollbacktrans
-
> может, что-то типа
>
> begintrans
> update table set fld = 1 where 1=1
> делаем что-то и
> rollbacktrans
Пока выполняется транзакция другие пользователи могут читать данные из таблицы, такой вариант не подходит (.
-
Нужно сделать следующее:
1. Заблокировать таблицу на чтение для других пользователей.
2. Прочитать определенное значение.
3. Записать определенное значение.
4. Разблокировать таблицу.
-
> Eugene1501 (18.06.2010 15:50:05) [5]
Заблокировать таблицу и уехать в командировку на пару недель.
-
вот почему как только сделают технологию избавленную от некоторых недостатков, так тут же появляются те кто не представляет себе программирования/логики без этих недостатков?
> Нужно сделать следующее:
почему нельзя сделать вместо этого "следующего" следующее:
> 2. Прочитать определенное значение.
> 3. Записать определенное значение.
???
-
> sniknik © (19.06.10 13:04) [7]
Ну чего ты придираешься? ) Ну не представляет чудо-программист себе жизни без процедуры Exlusive ) Не понимает что блокировать-то не таблицы надо, а древо данных на уровне корневого объекта )
-
Вообще ничего блоумровать не надо, не зато боролись
-
> Eugene1501 (18.06.10 15:46) [4]
>
>
> > может, что-то типа
> >
> > begintrans
> > update table set fld = 1 where 1=1
> > делаем что-то и
> > rollbacktrans
>
>
> Пока выполняется транзакция другие пользователи могут читать
> данные из таблицы, такой вариант не подходит (.
а если попробовать update структуры?
(например, имя поля переименовать)
-
не получится, т.к. "помощи ADO" ([0]), а он ориентирован на запросы. вот если бы не это ограничение то можно было посмотреть на методы ADOX/jet/jro там глядишь и нашлось бы что-то блокирующее таблицу... т.к. они могут работать непосредственно с обьектами. ну и тогда о запросах пришлось бы забыть, только табличные методы.
-
Ладно, может подскажете как организовать следующее:
Есть таблица "Документы" - ключевое поле "Id". Максимальное значение поля "Id" я храню в таблице "wtId". При добавление нового документа, открываю таблицу wtId, читаю значение Id, увеличиваю на единицу и записываю новое значение Id, которое использую при добавлении документа в таблицу "Документы". Такой вот механизм формирования значения ключа. Все хорошо до тех пор, пока не начинается работа в сети нескольких пользователей. Бывают ситуации, что разные пользователи одновременно формируют этот уникальный ключ и получают одинаковые значения, при записи документа естественно происходит ошибка. Как с этим бороться?
-
> Eugene1501 (23.06.2010 18:02:12) [12]
База у тебя есть?
-
нужно не с этим, само изобретенным велосипедом, бороться, а сделать нормальную структуру таблицы с автоинкрементным id.
и вообще, не выдумывать своего, кривого, пока не изучишь что для этого есть уже, стандартное.
-
> База у тебя есть?
Есть.
-
> нужно не с этим, само изобретенным велосипедом, бороться,
> а сделать нормальную структуру таблицы с автоинкрементным
> id.
> и вообще, не выдумывать своего, кривого, пока не изучишь
> что для этого есть уже, стандартное.
То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
А как быть в том случае, если мне нужно получить значение ключевого поля для только что вставленной записи? Причем ключевое поле, назовем его Id, единственный уникальный идентификатор записи таблицы.
-
> > База у тебя есть?
>
> Есть.
Ну так и пользуйся ее возможностями.
-
-
> То есть, я так понимаю для формирования уникального ключа можно использовать только автоинкрементные поля?
неправильно. это просто простой способ. один из. еще можно пользоваться естественными ключами, или гуидами.
-
даже твой способ с отдельной таблицей и значением из нее можно использовать, просто "довести до ума", чтобы не было промежутком между получением и записью нового значения.
хотя этот я бы крайне не рекомендовал.