Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Вниз

Перехват исключения от сервера БД   Найти похожие ветки 

 
qwerty2   (2003-01-21 12:44) [0]

Данный вопрос похоже уже не раз поднимался на форуме но вразумительного ответа не было дано. Итак ситуация: пользователь вводит данные не соответствуюцие Constraint-ам для некоторых полей. Доступ к базе происходит исключительно через TQuery. Post сохраняет данные естественно без проблем(так что OnPostError ничем помочь не может) а вот когда очередь доходит до Applyupdates то сервер БД то сервер возвращает ошибку которая появляется у пользователя в виде мало о чем ему говорящего сообщения на английском. Так вот - где можно отловить в общем случае исключение пришедшее от сервера БД, независимо от типа БД?


 
Johnmen   (2003-01-21 12:49) [1]

try
...
Applyupdates
...
except
end


 
qwerty2   (2003-01-21 12:55) [2]

в случае
try
...
Applyupdates
...
except
end

исключение конечно же отловится. Перехватываться будет любое возникшее исключение. Но пользователю нужно мне в этом случае сказать в чем причина неудачи. Например - в каком столбце неверное значение.


 
passm   (2003-01-21 12:57) [3]

qwerty2 (21.01.03 12:44)> Универсальный обработчик для различных СУБД IMHO невозможен.
TApplication.OnException
Например:
...
const
DB2ErrorID = "[IBM][CLI Driver][DB2/NT]";
begin
if (E is EDBEngineError) and (Pos(DB2ErrorID, E.Message) > 0) then
...


 
BorisUK   (2003-01-21 13:00) [4]

Procedure OnExceptMy(cod:integer);
begin
Case Cod of
xxx: Showmessage("Shitt №1 Hapend!!!");
yyy: Showmessage("Shitt №2 Hapend!!!");
end;

.....
try
...
Applyupdates
...
except
on E:Exception do
OnExceptMy(e.Cod);
end;

Только так наверно...
Все ошибки тебе надо знать по кодам... Тоесть естественно, что ты можешь писать обработчики на те ошибки, которые ты выявил и хочешь чтоб при них юзеры поступали соответствующим образом... Например пишишь звоните тудато... или нажмите тото... итд.
ИМХО - по другому никак.. Все ручками.
ЗЫ если работаещь с ХП на сервере, то можно поднимать ошибку прям оттуда, с уже нормальным - понятным текстом.


 
passm   (2003-01-21 13:00) [5]

qwerty2 (21.01.03 12:55)> А для этого можно завести таблицы с описанием ошибок. При исключении - небольшой синтаксический анализ и посылка запроса на сервер, возвращающий понятное для пользователя сообщение.


 
Reindeer Moss Eater   (2003-01-21 13:03) [6]

Если используется CachedUpdates, ловим ошибки сохранения (и обрабатываем их)в OnUpdateError
Если нет - в OnPostError


 
passm   (2003-01-21 13:04) [7]

BorisUK © (21.01.03 13:00)> В общем случае это не пойдет. Поскольку обин и тот же запрос может отваливаться по разным причинам.


 
Reindeer Moss Eater   (2003-01-21 13:05) [8]

Если используется CachedUpdates, ловим ошибки сохранения каждой записи (и обрабатываем их) в OnUpdateError
Если нет - в OnPostError



 
BorisUK   (2003-01-21 13:35) [9]


> passm © (21.01.03 13:04)

А где ты увидел вопрос про общий случай ? :)
Человек так и написал

> ...то сервер возвращает ошибку которая появляется у пользователя
> в виде мало о чем ему говорящего сообщения на английском

Следовательно он хочет отобразить их по русски... Может даже с руководством г действию.

а про...

Вот так и надо.
ИМХО - обращятся к таблице на сервер может не получится.
Другое дело что при коннекте обновлять их в локальную таблу . Потому как можно обрабатывать и ощибки по которым коннект не произошел.

> Поскольку обин и тот же запрос может отваливаться по разным
> причинам.

На самом деле они не бесконечны - эти причины. Просто надо знать в какой ситуации что заставить делать пользователя - и обрабатывать уже соответст ошибку.

Но на самом деле каждый делает как хочет - Я так сделал. Меня устраевает.
Главное же знать что хочешь - ведь так? :)


 
PONTIY   (2003-01-21 13:42) [10]

А я обрабатываю текст сообщения исключения. Например так:

try
...
except on E:EDataBaseError do //можно просто Except
begin
if Pos("UNIQUE KEY constraint", E.Message) <> 0 then
Application.MessageBox("Повтор данных уникального полня", "Ошибка", MB_ICONWARNING+MB_OK);
if Pos("COLUMN CHECK constraint", E.Message) <> 0 then
Application.MessageBox("Формат данных неверен", "Ошибка", MB_ICONWARNING+MB_OK);
end;
end;


 
Reindeer Moss Eater   (2003-01-21 13:52) [11]

Выставлено кэширование изменений.
Пользователь изменил несколько записей (долго и усердно долбая по кнопкам)
Вызываем ApplyUpdates, обернутый в try except.
В одной записи пользователь допустил ошибку, вызвавшую исключение. Он видит сообщение на родном языке и, наверное, слышит, как сервер делает Rollback всех усердно измененных записей.
А ведь такой хороший пример в Demos"ах лежит.


 
passm   (2003-01-21 13:55) [12]

BorisUK © (21.01.03 13:35)>
> А где ты увидел вопрос про общий случай ? :)
> Человек так и написал
>
> > ...то сервер возвращает ошибку которая появляется у пользователя
>
> > в виде мало о чем ему говорящего сообщения на английском
>
> Следовательно он хочет отобразить их по русски... Может
> даже с руководством г действию.

Позволь аргументировать на примере системы над которой сейчас работаю (Торговля).
Допустим, проводится операция приходования. БД вызвала исключение на запросе: "UPDATE GOODS.BUY_GOODS V SET V.RUN_GOODS = "Y" WHERE V.ID = :ID". На данное изменение имеется несколько триггеров, вызывающих исключение. Рабочий день закрыт, идет инвентаризация... Выход - найти имя триггера, вызвавшего ошибку в Exception.Message и попататься найти в БД описание ошибки понятное для пользователя.

> ИМХО - обращятся к таблице на сервер может не получится.
> Другое дело что при коннекте обновлять их в локальную таблу
> . Потому как можно обрабатывать и ощибки по которым коннект
> не произошел.

Это на любителя :) Для большой системы НД будет большим и поиск локальный... Разрыв коннекта можно рассмотреть отдельно - опять же при синтаксическом анализе.

> Но на самом деле каждый делает как хочет - Я так сделал.
> Меня устраевает.
> Главное же знать что хочешь - ведь так? :)

Конечно, каждый пользуется тем, что его устраивает :)


 
Fiend   (2003-01-21 14:01) [13]

То qwerty2:
если у вас MS SQL, то можно жестоко поменять текст сообщений в системной таблице, и тогда всем будет всё хоть по монгольски отвечать об ошибках.

Я такое использую еще с 6.5 сервера.
За другие сервера ответить не могу, но думаю шо там такое решение скорее всего тоже прокатит, тока надо найти у них таблицу с системными сообщениями. Как говорил Урий: где у него кнопка!
:)


 
passm   (2003-01-21 14:32) [14]

Fiend © (21.01.03 14:01)> Имеется в виду не только перевод текста ошибки на русский/монгольский... Но и перевод ошибки на язык, понятный пользователю.
От сообщения
General SQL error.
[IBM][CLI Driver][DB2/NT] SQL0532N A parent row cannot be deleted because the relationship
"EXP.NEW_PRICE_BODY.SQL020603092419460" restricts the deletion. SQLSTATE=23001

переведенного на русский язык пользователю легче не станет.
Лучше, если он увидет:
Ошибка удаления товара.
Причина: товар прошел переоценку.

ЗЫ: Возможно, я недооценил возможности MS SQL в данном плане.


 
Fiend   (2003-01-21 14:38) [15]

То passm
На счёт MS SQL: он ваще меня всегда приятно удивлял, что у него всё можно найти в таблицах. Ну буквально всё!

Но не факт, что вы переведете это сообщение буквально. Надо типа: На удаляемую запись ссылаются данные, тра ляля, удаление невозможно.

Да и еще: если вы работаете сквозь АДО, то можно туда загрузить тескты всех ошибок в коллекцию рекордсета Errors.
тобишь перевести их хоть монгольский, хоть татарский. И даже динамически подгружать их в зависимости от локализации выбранной полшьзователем в вашем софте.


 
passm   (2003-01-21 14:44) [16]

Fiend © (21.01.03 14:38)>
> На счёт MS SQL: он ваще меня всегда приятно удивлял, что
> у него всё можно найти в таблицах. Ну буквально всё!

В DB2 тоже много чего находится в системных таблицах/просмотрах :)

> Но не факт, что вы переведете это сообщение буквально. Надо
> типа: На удаляемую запись ссылаются данные, тра ляля, удаление
> невозможно.

Как раз это и имел в виду.


 
xGrey   (2003-01-21 16:32) [17]

>>qwerty2
IMHO,
- "не соответствие Constraint-ам полей" лучше вообще закрыть интерфейсом;
- операции с данными и управление транзакциями перенести в UDP.
Там же формировать осмысленный для пользователя текст ошибки.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
1-15690
Евгений Тарабановский
2003-01-27 14:43
2003.02.06
Антиалиасинг


14-15876
Сергей Чурсин
2003-01-19 15:47
2003.02.06
Андрей Паршев. Почему Россия не Америка


1-15718
REA
2003-01-27 19:00
2003.02.06
Как сложить динамические массивы?


1-15601
Serghei
2003-01-23 17:01
2003.02.06
Имя ЛЮБОГО обьекта под курсором Application Events


3-15404
OlkaGTS
2003-01-21 16:42
2003.02.06
Дать возможность повторно вводить пароль при ошибках соединения





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