Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.014 c
3-1129579565
Jioniro
2005-10-18 00:06
2005.11.27
Сохранение настроек DbGrid в Blob поле.


14-1130868063
Bogdan1024
2005-11-01 21:01
2005.11.27
Помогите собрать комп!!!


14-1131312974
Gero
2005-11-07 00:36
2005.11.27
Блокнот -> Перейти


14-1131195081
Axis_of_Evil
2005-11-05 15:51
2005.11.27
Wi-Fi


14-1131304107
Gero
2005-11-06 22:08
2005.11.27
Бесплатная программа для виртуальных CD-приводов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский