Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.29;
Скачать: CL | DM;

Вниз

ошибка при записи, ADO   Найти похожие ветки 

 
Krants ©   (2007-04-20 17:31) [0]

Вот столкнулся с одной неприятной ошибкой, причину и возможные варианты ее обхода понимаю но уже есть много кода и переписывать его сами понимаете, нехочется.
Сами процедуры выкладывать не зачем покажу на примере типичного кода:
Имеется стандартное локальное подключение 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 не помагают...
Если кто сталкивался с данной проблемкой посоветуйте плиз. как можно ее обойти?


 
Desdechado ©   (2007-04-20 17:35) [1]

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


 
Krants ©   (2007-04-20 17:40) [2]


> Desdechado ©  

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


 
Desdechado ©   (2007-04-20 18:20) [3]

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


 
Alarm ©   (2007-04-20 18:55) [4]

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


 
MsGuns ©   (2007-04-21 19:35) [5]

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


 
Krants ©   (2007-04-23 10:45) [6]


> 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;
...


 
ЮЮ ©   (2007-04-23 11:21) [7]

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

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

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

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


 
Krants ©   (2007-04-23 11:31) [8]


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

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


 
ЮЮ ©   (2007-04-23 11:50) [9]

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


Не тут, а там:

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 13:10) [10]


> ЮЮ ©  

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

...
 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;
...



Страницы: 1 вся ветка

Текущий архив: 2007.07.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
15-1183358273
Бакук
2007-07-02 10:37
2007.07.29
Кросс-таблицы, Pivot


6-1161766282
Denizzz
2006-10-25 12:51
2007.07.29
ServerSocket, ClientSocket и "выдергивание шланга из сетевухи"


3-1177316209
Juice
2007-04-23 12:16
2007.07.29
DBX & Oracle ошибка при коннекте


15-1183146313
IMHO
2007-06-29 23:45
2007.07.29
Посоветуйте сайт для любителей кино


8-1161870623
Gamer
2006-10-26 17:50
2007.07.29
Рисование графиков