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

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

ошибка при записи, ADO


Krants ©   (2007-04-20 17:31:00) 

Вот столкнулся с одной неприятной ошибкой, причину и возможные варианты ее обхода понимаю но уже есть много кода и переписывать его сами понимаете, нехочется.
Сами процедуры выкладывать не зачем покажу на примере типичного кода:
Имеется стандартное локальное подключение TADOConnection и TADOQuery, програмно осуществляется запись в определенное поле.
Ошибка возникает при одновременной записи в одно поле несколькими "операторами" либо процедурами, как на примере:

...
ADOQuery1.Edit;
ADOQuery1.FieldByName('Field1').AsString:='111';
ADOQuery1.Post;
ADOQuery2.Edit;
ADOQuery2.FieldByName('Field1').AsString:='222';
ADOQuery2.Post;
...


Данный код приведет к ошибке типа: "Процесс остановлен ядром базы данных Microsoft Jet, так как другой пользователь пытается одновременно изменить те же данные"

Причину ошибки Вы наверняка понимаете, даный код сработает корректно, если перед вторичной записью сделать определенную задержку. Что бы текущее значение ADOQuery2 было обновленно и при переходе в режим ред. были обновлены DataLink`и компонента. Но ни Refresh ни Open, Close не помагают...
Если кто сталкивался с данной проблемкой посоветуйте плиз. как можно ее обойти?


Krants   (2007-04-23 13:10:00) [1]


> ЮЮ ©  

Спасибо то что надо!, если кому надо, смотрите:

...
 ADOQuery2.Properties['Update Criteria'].Value := adCriteriaKey;
ADOQuery2.Edit;
ADOQuery2.FieldByName('Field2').AsString:='222';
ADOQuery2.Post;
 ADOQuery3.Properties['Update Criteria'].Value := adCriteriaKey;
ADOQuery3.Edit;
ADOQuery3.FieldByName('Field2').AsString:='333';
ADOQuery3.Post;
...


ЮЮ   (2007-04-23 11:50:00) [2]

> Да ничего тут не обламывается,


Не тут, а там:

ADOQuery1.Edit;
ADOQuery1.FieldByName('Field1').AsString:='111';
ADOQuery1.Post;

ADOQuery2.Edit;
ADOQuery2.FieldByName('Field1').AsString:='222';
ADOQuery2.Post;

В нормальных условиях ADO должно было сгенерировать именно твкие же запросы, как и к тебя в [6].  

Но раз поведенин разное,значит выполняеися запрос на UPDATE, сгенерированный ADO, в которим в WHERE присутствует (Field1 = '000')[или что там было до того, пока ты с помощьь Query1 не исправил на '111'].


Krants   (2007-04-23 11:31:00) [3]


> ЮЮ ©   (23.04.07 11:21) [7]

Да ничего тут не обламывается, это к примеру, реально id=1заменяется на id=:id, и задается по текущему ключу датасета...


ЮЮ   (2007-04-23 11:21:00) [4]

Или Id не ключевое или не включено в набор полей ADOQuery1 и ADOQuery2 (или не настроены/расстроены: в Properties, кажется, можно указать как update-ить - по ключевому полю, по измененным полям или по всем полям)

ADO именно такие запросы и построио бы, если бы update-ило - по ключевому полю . В Subj-е же строились запросы типа  

Update tm set field1=:field1 where field1=:old_field1

поэтому второй update обламывался


Krants   (2007-04-23 10:45:00) [5]


> Alarm ©  
> MsGuns ©  

В том то и дело, что программа работает при стандартном подключении, т.е. локальном, где не используется СУБД, и нет никаких грамотных указаний параметров соединения).
Вообщем проблема была решена неудными заменами, типа:


...
ADOQuery2.SQL.Text:='Update tm set field1=:par where id=1';
ADOQuery2.Parameters[0].DataType:=ftString;
ADOQuery2.Parameters[0].Value:='111';
ADOQuery2.ExecSQL;
ADOQuery3.SQL.Text:='Update tm set field1=:par where id=1';
ADOQuery3.Parameters[0].DataType:=ftString;
ADOQuery3.Parameters[0].Value:='222';
ADOQuery3.ExecSQL;
...


MsGuns   (2007-04-21 19:35:00) [6]

Конфликт разруливается грамотным указанием параметров соединения и явными транзакциями


Alarm   (2007-04-20 18:55:00) [7]

Не серьезная программа, если позволяет писАть одновременно в одно и то же поле. Видимо где-то нарушена логика или приоритеты


Desdechado   (2007-04-20 18:20:00) [8]

Тогда он тебе правильно вещает.


Krants   (2007-04-20 17:40:00) [9]


> Desdechado ©  

это для примера, датасеты и конекты разные, и тут не важно в одной они программе или нет...


Desdechado   (2007-04-20 17:35:00) [10]

Не понял, а смысл писать в одно поле дважды, если можно записать толкьо последнее значение?
Да и не факт, что два кверика на один датасет, одну запись смотрят.


Наверх

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