Форум: "Базы";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
ВнизIBQuery и IBUpdateSQL Найти похожие ветки
← →
gestern (2003-11-27 01:33) [0]Что-то не то? Вопрос очень простой. Почему при использовании IBQuery и IBUpdateSQL может возникнуть ошибка Update Failed
← →
Zacho (2003-11-27 10:12) [1]Такая ошибка возникает, когда в результате ApplyUpdates RowsAffected<>1, например какой-либо запрос в TIBUpdateSQL изменяет/удаляет/вставляет больше одной записи. Или если в TIBUpdateSQL вызывается ХП.
← →
BMasik (2003-11-27 10:42) [2]Zacho
А как это хозяйство обойти чтобы оно ни орало.
← →
Zacho (2003-11-27 10:45) [3]
> BMasik (27.11.03 10:42) [2]
Вместо TIBQuery использовать TIBDataSet c CachedUpdates:=false;
← →
BMasik (2003-11-27 10:45) [4]У меня просто BDE , ни IBQuery, но смысл от этого ни меняется
← →
Vlad (2003-11-27 10:46) [5]
> BMasik (27.11.03 10:42) [2]
> Zacho
> А как это хозяйство обойти чтобы оно ни орало.
Просто скажи своему хозяйству чтобы оно не орало (try...except)
← →
Bmasik (2003-11-27 10:47) [6]про IB я знаю...тут ситуация совсем другая...либо блин один Update на форме держать либо гору кверей.
← →
Vlad (2003-11-27 10:50) [7]Еще вариант, в Query на событие OnUpdateError глушить ошибку.
← →
Bmasik (2003-11-27 11:06) [8]Vlad
Второй вариант работает! Сенкаю.
Для тех кому интересно
if E.Message="Update failed" then
UpdateAction:=uaApplied;
← →
Vlad (2003-11-27 11:07) [9]Мощно задвинул. Внушает! (с) :)))
← →
Bmasik (2003-11-27 11:38) [10]Ну можно было бы поиздеваться..получить ошибку BDE и так далее...а надо ли?
← →
gestern (2003-11-27 14:34) [11]>Вместо TIBQuery использовать TIBDataSet c CachedUpdates:=false;
А как это делается. У меня в DataSource не прописывается TIBDataSet. Или оно и не должно?
← →
Zacho (2003-11-27 15:13) [12]
> gestern (27.11.03 14:34) [11]
Не может быть. Что-то ты неправильно делаешь.
← →
gestern (2003-11-27 18:42) [13]
> Не может быть. Что-то ты неправильно делаешь.
Разобраля. Хотя в общем и не помогло. Вернулся к Query оно быстрее работает. Буду бороть проблему Update Failed.
← →
Sandman25 (2003-11-27 18:44) [14]Я писал свой компонент для решения данной проблемы. Скопировал реализацию какого-то метода (сейчас уже не помню, какого) и закоментировал в нем проверку на rowsaffected :)
← →
Zacho (2003-11-27 19:28) [15]
> gestern (27.11.03 18:42) [13]
Не может TIBQuery работать быстрее. Все-таки мой совет: используй TIBDataSet и избегнешь всяческих граблей. И вообще, зачем использовать 2 компонента (TIBQuery и TIBUpdateSQL) вместо одного TIBDataSet ?
← →
Vlad (2003-11-27 19:32) [16]
> Zacho © (27.11.03 19:28) [15]
В чем грабли, например ?
Просто интересно. Я в одном более-менее серьезном проекте использовал как раз IBQuery+IBUpdateSql. Чем это м.б. чревато ?
← →
Zacho (2003-11-27 20:20) [17]
> Vlad © (27.11.03 19:32) [16]
Самые большие грабли - это необходимость использовать CachedUpdates, все остальное вытекает именно из этого. А в реализации CachedUpdates в IBX постоянно обнаруживаются какие-нибудь баги (насколько помню, началось это еще с FIBC) Например, в IBX 6.0 я нарвался на весьма неприятный баг, (слава богу, что бухгалтерша вовремя обратила внимание, что суммы в отчете какие-то странные) проявляющийся при CachedUpdates:=true и Filtered:=true. Несколько часов потратил, прежде чем понял, в чем дело. Да и то же самое Update failed при RowsAffected<>1 - чем не грабля ? Я, например, частенько делаю insert/update/delete при помощи ХП, если бы использовал TIBQuery - пришлось бы думать, как это обходить, писать какой-то абсолютно лишний код, а с TIBDataSet такой проблемы просто не возникает.
И повторю еще раз : зачем использовать 2 компонента (TIBQuery и TIBUpdateSQL) вместо одного TIBDataSet ?
← →
ksan (2003-11-27 20:28) [18]
> Zacho © (27.11.03 20:20) [17]
Извините что вмешиваюсь. Я пробовал использовать TIBDataSet, но возикла проблема с параметром в запросе. При попытке усьановить параметр возникает Transaction is not active. Может быть встречалась такая проблема?
← →
Zacho (2003-11-27 20:43) [19]
> ksan © (27.11.03 20:28) [18]
Дело не в параметре, однозначно. Транзакция не активна ? Так надо сделать StartTransaction.
← →
ksan (2003-11-27 20:47) [20]
> Zacho © (27.11.03 20:43) [19]
А в каком месте ее делать? Последовательность ведь такая:
закрыл запрос,
изменил параметр,
закрыл запрос.
← →
ksan (2003-11-27 20:57) [21]
> Zacho © (27.11.03 20:43) [19]
Причем с TIBQuery такой проблемы не возникает.
← →
Zacho (2003-11-27 21:05) [22]
> ksan (27.11.03 20:47) [20]
Думаю, что в последней строке следует читать "открыл запрос" ? :)
А ответ такой: просто не надо завершить транзакцию перед присваиванием параметров, или завершать, но CommitRetaining или RollbackRetaining или стартовать заново.
Есть хорошая статья по работе с транзакциями в IBX: http://www.ibase.ru/devinfo/ibxtrans.htm
← →
Zacho (2003-11-27 21:10) [23]
> ksan (27.11.03 20:57) [21]
Не может быть. Что-то ты не правильно делаешь, а вот что - я даже и не знаю, мне отсюда не видно :)
← →
ksan (2003-11-28 07:27) [24]
> Zacho © (27.11.03 21:05) [22]
Я действительно ошибся "с закрыть запрос". Спасибо за ссылку.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.015 c