Форум: "Базы";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизКак поймать событие отмены апдейта если запрос выполняется с Найти похожие ветки
← →
Jioniro (2005-10-13 17:23) [0]Привет всем - пользуюсь MySQL - сразу скажу что я новичок.
Такой вопрос:
Есть некая таблица. Одно из полей таблицы типа varchar (поле NAME).
Оно объявлено как Unique - то есть уникальное.
для добавления или изменения записей пользуюсь запросом:
update Tmp_MasterAss_GroupGoods
set NAME=:Param1,
FIELD_1=:Param2,
FIELD_2=:Param3,
FIELD_3=:Param4,
ID_PRICETYPE=:Param5,
PERSENT=:Param6
where ID=:Param7
если значение Param1 уже есть в таблице то соответственно - возникает исключительная ситуация.
Её можно избежать с помощью вставки в запрос "ignore".
Но мне нужно предупредить пользователя что такая запись уже есть - например, выдать MessageBox.
Так вот вопрос в том как поймать это событие отмены апдейта если запрос выполняется с помощью ExecSQL???
← →
Курдль © (2005-10-13 17:27) [1]О такой фитче слышали?
try
...
except
...
end;
← →
ANB © (2005-10-13 17:50) [2]Наиболее кузяво было бы проверять дубли и другую некорректность данных ДО выполнения DML. Потому как ошибка может произойти по еще куче причин и неплохо бы экстремальные ошибки (все тяжело корректно обработать) - выдать пользователю как есть, а предугаданные - выдать по русски с объяснением причины и чего делать.
← →
evvcom © (2005-10-14 16:31) [3]
> ANB © (13.10.05 17:50) [2]
Вот он и спрашивает, ЧаВо ему делать? :)
> Jioniro (13.10.05 17:23)
Расшифрую ANB: Проверяешь, имеется ли такая запись if EXISTS(select ...) или как там на MySQL, если находишь, то генеришь ошибку с русским текстом. Опять же не знаю возможностей MySQL, но на Оракле такой апдейт заключаешь в begin exception end; блок и точно так же, анализируя код ошибки, возбуждаю исключение, но уже с русским текстом.
Можно еще попробовать позволить серверу сгенерить исключительную ситуацию и прочитать код ошибки уже на клиенте и перевести сообщение для пользователя на русский (см. [1]). Но в свое время с MSSQL у меня такой трюк не прошел.
← →
Курдль © (2005-10-14 16:38) [4]
> Можно еще попробовать позволить серверу сгенерить исключительную
> ситуацию и прочитать код ошибки уже на клиенте и перевести
> сообщение для пользователя на русский (см. [1]). Но в свое
> время с MSSQL у меня такой трюк не прошел.
А почему? MS SQL наверняка публикует числовые эквиваленты серверных ошибок. Кроме того, можно анализировать наличие того или иного имени внешнего ключа (констрэйнта и т.п.). Иногда простым селектом предвосхитить ошибку весьма сложно. Напр. если с удаляемой записью в одной таблице связано большое кол-во других таблиц.
← →
evvcom © (2005-10-14 17:08) [5]
> А почему? MS SQL наверняка публикует числовые эквиваленты
> серверных ошибок
Коды есть. Не в том дело. Давно это было. Уж лет 8 минуло. Может на руки можно погрешить, может это были баги третьей дельфы (а может еще 2-ой), но exception из MSSQL 6.0 я не мог перехватить в try except. Может сейчас уже все это хорошо ловится, я не пробовал. Я сейчас на другой СУБД.
← →
Ольга (2005-10-14 17:24) [6]Вариант 1:
Сделать проверку перед записью:
SELECT count(*) FROM Tmp_MasterAss_GroupGoods WHERE Name=:Param1
Вариант 2 (для ленивых):
if Query.ExecSql=0 then
ShowMessage("Ошибка при записи...");
Вариант 3 (для ленивых):
try
Query.ExecSql;
except
on E: Exception do
ShowMessage("Ошибка при записи : " + E.ClassName + ". " + E.Message);
end;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c