Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Как поймать событие отмены апдейта если запрос выполняется с   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.055 c
2-1131597121
Yus
2005-11-10 07:32
2005.11.27
Удалить директорию


14-1131011570
КаПиБаРа
2005-11-03 12:52
2005.11.27
Задача с ядовитой змеей


14-1130827728
igi
2005-11-01 09:48
2005.11.27
Регулярные выражения


14-1131354766
DiamondShark
2005-11-07 12:12
2005.11.27
За природу -- борись!


14-1130920332
kaif
2005-11-02 11:32
2005.11.27
Задачка про доску