Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1183167604
iamgeorg
2007-06-30 05:40
2007.07.29
Как определить обороты вентилятора CPU?


6-1166771717
fishka
2006-12-22 10:15
2007.07.29
IdTelnet и получение ответов


15-1183613351
exactly
2007-07-05 09:29
2007.07.29
Какие наушники посоветуете?


6-1166624594
n_shadow
2006-12-20 17:23
2007.07.29
Заполнение структуры PHostEnt


11-1166123770
Trible
2006-12-14 22:16
2007.07.29
CustomData





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский