Главная страница
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.03 c
3-1129419653
Postal
2005-10-16 03:40
2005.11.27
Каскадное удаление


4-1127473166
Still Swamp
2005-09-23 14:59
2005.11.27
keybd_event и GetKeyStatus отказываются работать в терминальном


5-1112861007
TForm
2005-04-07 12:03
2005.11.27
Наследование свойств другого класса


1-1130933195
s_t_d
2005-11-02 15:06
2005.11.27
QReport в Delphi-7


14-1131054381
Германн
2005-11-04 00:46
2005.11.27
У меня сегодня юбилей