Главная страница
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.02 c
3-1177169820
Roven
2007-04-21 19:37
2007.07.29
Установка базы данных


2-1183377068
Regdown
2007-07-02 15:51
2007.07.29
Ряд вопросов


15-1183034315
Суслик
2007-06-28 16:38
2007.07.29
Локальная сеть дома


2-1183559033
Реактор
2007-07-04 18:23
2007.07.29
Проблема Read Write


15-1183342683
Slider007
2007-07-02 06:18
2007.07.29
С днем рождения ! 29 июня 2007 пятница