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

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

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-компонентов в сторону ручного кодирования запросов...


Наверх

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