Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как поймать событие отмены апдейта если запрос выполняется с [D7, MySQL]


Jioniro ©   (2005-10-13 17:23:00) 

Привет всем - пользуюсь 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-14 17:24:00) [1]

Вариант 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;


evvcom   (2005-10-14 17:08:00) [2]


> А почему? MS SQL наверняка публикует числовые эквиваленты
> серверных ошибок

Коды есть. Не в том дело. Давно это было. Уж лет 8 минуло. Может на руки можно погрешить, может это были баги третьей дельфы (а может еще 2-ой), но exception из MSSQL 6.0 я не мог перехватить в try except. Может сейчас уже все это хорошо ловится, я не пробовал. Я сейчас на другой СУБД.


Курдль   (2005-10-14 16:38:00) [3]


> Можно еще попробовать позволить серверу сгенерить исключительную
> ситуацию и прочитать код ошибки уже на клиенте и перевести
> сообщение для пользователя на русский (см. [1]). Но в свое
> время с MSSQL у меня такой трюк не прошел.


А почему? MS SQL наверняка публикует числовые эквиваленты серверных ошибок. Кроме того, можно анализировать наличие того или иного имени внешнего ключа (констрэйнта и т.п.). Иногда простым селектом предвосхитить ошибку весьма сложно. Напр. если с удаляемой записью в одной таблице связано большое кол-во других таблиц.


evvcom   (2005-10-14 16:31:00) [4]


> ANB ©   (13.10.05 17:50) [2]

Вот он и спрашивает, ЧаВо ему делать? :)

> Jioniro   (13.10.05 17:23)

Расшифрую ANB: Проверяешь, имеется ли такая запись if EXISTS(select ...) или как там на MySQL, если находишь, то генеришь ошибку с русским текстом. Опять же не знаю возможностей MySQL, но на Оракле такой апдейт заключаешь в begin exception end; блок и точно так же, анализируя код ошибки, возбуждаю исключение, но уже с русским текстом.
Можно еще попробовать позволить серверу сгенерить исключительную ситуацию и прочитать код ошибки уже на клиенте и перевести сообщение для пользователя на русский (см. [1]). Но в свое время с MSSQL у меня такой трюк не прошел.


ANB   (2005-10-13 17:50:00) [5]

Наиболее кузяво было бы проверять дубли и другую некорректность данных ДО выполнения DML. Потому как ошибка может произойти по еще куче причин и неплохо бы экстремальные ошибки (все тяжело корректно обработать) - выдать пользователю как есть, а предугаданные - выдать по русски с объяснением причины и чего делать.


Курдль   (2005-10-13 17:27:00) [6]

О такой фитче слышали?

try
...
except
...
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо