![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DB-компоненты, многопользовательская среда, вылазят грабли [D6, MSSQL]
HabarovSergey © (2006-01-23 15:00:00)Здраствуйте. Помогите понять тонкости -
Использую стандартные DB-компоненты (Delphi6, MSSQL, ADO), но при запуске двух копий приложения возникают например такие грабли - вставляю в одном из них строку (форма с DB-эдитами и лоокапкомпобоксами). но при Post'е вылетает ошибка мол нельзя сохранить поскольку данные обновлялись, - если вторая копия хотябы открывала ту же таблицу хоть как то.
использую только
ADOConnection (уровень изоляции - курсор стабилити)
и
ADOQuery (установки - все типы курсора - статические на клиенте)
HabarovSergey (2006-01-23 17:12:00) [1]именно что бы они последовательно инкрементировались и не было "пробелов"
HabarovSergey (2006-01-23 17:10:00) [2]там четыре уровня я их теоретически знаю - хотя мне это всеравно не дает понятия как лучше сделать (и воопще сделать) задачку с NOMER_ZAYAVKI
msguns (2006-01-23 17:04:00) [3]Читать о тразакциях в скале до полного просветления.
HabarovSergey (2006-01-23 17:03:00) [4]триггер убрал все вроде заработало но теперь проблема с тем как присвоить
NOMER_ZAYAVKI с инкрементом в 1 в каждом году последовательно, и при том что бы эти номера не "перескакивали" если например кто то отменить ранее запущенную транзакцию
sniknik (2006-01-23 16:59:00) [5]> нет ключа. сейчас сделаю все раскажу
> ошибка
> "Row cannot be located for updating. Some values may have been changed since it was last read."
без ключа так и будет т.к. операция на обновление состовляется с условием по значениям всех полей ... которые (одно из них) возможно изменилось т.к. открывалась другая сессия. и при этом есть риск изменить вообще не ту запись поэтому ошибка закономерна.
чтобы не было надо обязательно дабавить ключь и указать чтобы адресация для управляющих запросов делалась по нему.
ADODataSet.Properties['Update Criteria'].Value:= adCriteriaKey;
> а как блокировать запись с помощью транзакции и исскуственно?
вообще не надо
> транзакции я использую:
> ADOConnection.BeginTrans
> ADOConnection.CommitTrans
лучше делай серверные SQL-ными командами. (но пока, еще лучше, совсем убери. т.к. подозрение (по [0]) что для одной команды ее делаеш. лишнее. и что еще хуже на обновления в DBEdit-ах...)
HabarovSergey (2006-01-23 16:35:00) [6]а как блокировать запись с помощью транзакции и исскуственно?
транзакции я использую:
ADOConnection.BeginTrans
ADOConnection.CommitTrans
HabarovSergey (2006-01-23 16:23:00) [7]вот такой -
CREATE TRIGGER ecol_razresheniya_NOMER_zayavki ON dbo.ecol_razresheniya
FOR INSERT
AS
update ecol_razresheniya set NOMER_ZAYAVKI=(
select ( case when max(nomer_zayavki) is null then 0 else max(nomer_zayavki) end)+1 from ecol_razresheniya
where Year(DATA_ZAYAVKI)=Year((select top 1 DATA_ZAYAVKI from inserted))
)
where NOMER_ZAYAVKI=NULL
HabarovSergey (2006-01-23 16:21:00) [8]забыл сказать на таблицу на добавление AFTER триггер стоит. вычисляет значение одного столбца
HabarovSergey (2006-01-23 16:19:00) [9]именно когда Insert использую. когда просто редактирую запись то все ок
HabarovSergey (2006-01-23 16:16:00) [10]нет, Виталий. ниче не накручено. в чем может быть проблема - описал все как есть
может типы курсоров надо поменять?
Виталий Панасенко (2006-01-23 15:49:00) [11]
> HabarovSergey (23.01.06 15:19) [8]
> нет. не помогло
> ошибка
> "Row cannot be located for updating. Some values may have
> been changed since it was last read."
Значит, где-то, что-то "накрутил".
Ega23 (2006-01-23 15:22:00) [12]
> Я не спец в MS SQL, но, кажись, после такого (с помощью
> транзакций) блокируется ВСЯ таблица. т.е. другой юзер вообще
> ничего не сможет сделать, пока первый не подтвердит/отменит
> транзакцию... Причем, именно, вообще ничего, даже не прочитает
> данные
Ну, на грязное чтение, вроде можно надеяться... Там же 4 уровня изоляции.
HabarovSergey (2006-01-23 15:19:00) [13]нет. не помогло
ошибка
"Row cannot be located for updating. Some values may have been changed since it was last read."
HabarovSergey (2006-01-23 15:14:00) [14]нет ключа. сейчас сделаю все раскажу
Виталий Панасенко (2006-01-23 15:11:00) [15]А ключ у таблицы есть ? Может, из-за отстутствия ключа ?
HabarovSergey (2006-01-23 15:10:00) [16]имеетаса ввиду когда несколько пользователей работают в нескольких экземплярах этой программы-примера
HabarovSergey (2006-01-23 15:09:00) [17]тоесть как блокировать? если я её только добавляю.
простейший пример. DB-грид - данные выбраны и отсортированы по определенному критерию из одной таблицы - пользователи нажимают кнопку добавить запись . делаетса инсерт и у них появляетса форма с ДБедитами. далее они нажимают сохранить и вызываетса Post для этой записи (а после Post'а ДБ-грит обновляетса закрытием и открытием). Так вот очень часто вываливает ошибка при вызове Post что данные уже изменены мол и наотрес отказываетса делать Post
Виталий Панасенко (2006-01-23 15:07:00) [18]
> Ega23 © (23.01.06 15:03) [1]
> Блокируй запись. Можно с помощью транзакций (почитай в BOL),
> можно искусственно.
Я не спец в MS SQL, но, кажись, после такого (с помощью транзакций) блокируется ВСЯ таблица. т.е. другой юзер вообще ничего не сможет сделать, пока первый не подтвердит/отменит транзакцию... Причем, именно, вообще ничего, даже не прочитает данные
Ega23 (2006-01-23 15:03:00) [19]Блокируй запись. Можно с помощью транзакций (почитай в BOL), можно искусственно.
HabarovSergey (2006-01-23 15:03:00) [20]подскажите, как можно решить подобного рода проблему? (или хотя бы киньте какойнить теорией)
ведь не отказыватса же от DB-компонентов в сторону ручного кодирования запросов...