Форум: "Базы";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
Внизошибка при записи, 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c