Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизПерехват исключения от сервера БД Найти похожие ветки
← →
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;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.011 c