Главная страница
    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.015 c
9-1120952011
Тестер1
2005-07-10 03:33
2005.11.27
Кто нибудь пытался выдрать анимацию из игры Братья Пилоты ?


3-1129631803
Андрей__
2005-10-18 14:36
2005.11.27
Interbase и кириллица


14-1131118960
Константинов
2005-11-04 18:42
2005.11.27
Оплата труда


2-1131304186
ЯТутаНовичек
2005-11-06 22:09
2005.11.27
Помогите с TDate


2-1131306176
ruslan.q
2005-11-06 22:42
2005.11.27
E-mail





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский