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

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

Обработка ошибок БД [D7, MSSQL]


DimonNew ©   (2005-08-15 13:59:00) 

Привет, помогите разобраться с обработкой ошибок БД.
При возникновении ошибки, напрмер при сохранении данных в БД возникает исключение типа EDataBaseError или EUpdateError. Одно исключение, но разные сообщения в Message. Но хотелось бы на некоторые ошибки написать сообщение пользователю на русском языке, чтобы он мог как-то отреагировать и сделать правильно. Как отловить конкретные ошибки?


Dimous   (2005-08-16 10:22:00) [1]

Я, например, поступаю следующим образом. Все действия с БД обрамляю в try... except... end, т.е. отдельные блоки на вставку, изменение и т.д. Пользователю показываю что-типа "При вставке (изменении...) записи произошла ошибка.... ", причем в своем диалоге, имеющем кнопку [Подробнее], где можно узнать класс ошибки, Original Message, адрес и т.п.
Такой подход обеспечивает независимость обработчика от типа СУБД и механизма доступа.
IMHO, при нарушении ссылочной целостности обычный юзер ничего сделать не сможет - нужно постараться исключить такие случаи...


MOA   (2005-08-16 09:14:00) [2]

>Перевести на русский таблицу master..sysmessages?
О!. На скульру ~ в 2001 это была очень популярная тема. Даже первоапрельский розыгрыш такой был - пост "Мелкософт выложил локализованный русский sysmessages и русский BOL" ;).
Полезно почитать - к сожалению, перевод sysmessages тоже имеет свои минусы. Главный - что скажет юзеру сообщение "Нарушение ссылочной целостности FK_InvToCli_ID_ITC в таблице InvToCli" :)? Или "Нарушение ограничения PRIMARY KEY 'PK_TabSb'. Не могу вставить дублирующийся ключ в объект 'TabSb'. Оператор был завершён."?


sniknik   (2005-08-15 17:57:00) [3]

> Я не заметил , что эти типы ошибок только для BDE, хотя я использую     ADO.
в 95% случаев (имхо) если не написано чем пользуется -> = начинающий и = BDE.

> Ошибки ADO ловяться E : EOleException, только E.ErrorCode возвращает одно и тоже значение при разных сообщениях.
ErrorCode
при ошибке см. ADOConnection1.Errors[0].NativeError это "родной" из MSSQL, только их может быть несколько (может поэтому и не дают номер, а дают ссылку н список?)

> Перевести на русский таблицу master..sysmessages?
по моему лучший вариант. только переводит(или ищет готовые переводы) пусть сам клиент.


Nikolay M.   (2005-08-15 16:18:00) [4]


> хотелось бы на некоторые ошибки написать сообщение пользователю
> на русском языке, чтобы он мог как-то отреагировать и сделать
> правильно

Перевести на русский таблицу master..sysmessages?


DimonNew   (2005-08-15 15:26:00) [5]

Я не заметил , что эти типы ошибок только для BDE, хотя я использую     ADO.
Ошибки ADO ловяться E : EOleException, только E.ErrorCode возвращает одно и тоже значение при разных сообщениях.


sniknik   (2005-08-15 14:50:00) [6]

у EDataBaseError кода нету.

а вообще это блаж, никто эти ошибки, понятным языком написанные, не читает. а тот кто читает, тот и на английском разберется, и даже лучше чем на русском, перевод не "сгладит" разные мелкие но важные детали.

если уж так необходимо то пусть юзеры сами переводят первоисточник (MSSQL), и заменяют сообщения в нем русскими (есть даже готовые переводы/апдейты. частично)

а еще сколько можно повторять, не связывайтесь с BDE для доступа MSSQL. (вот есть такое подозрение на него ;)


DenK_vrtz   (2005-08-15 14:34:00) [7]

>DimonNew   (15.08.05 14:15) [3]
>Одно исключение типа EDataBaseError, но разные Message.

Анализировать КОД ошибки и по коду выдавать соответствующее сообщение.


DimonNew   (2005-08-15 14:15:00) [8]

На исключение типа EDataBaseError может быть несколько разных сообщений, например ошибка нарушения ссылочной целостности или ошибка дупликата первичного ключа и т.п. Одно исключение типа EDataBaseError, но разные Message. Как отловить например только ошибку ссылочной целостности?


Fay   (2005-08-15 14:04:00) [9]

DimonNew   (15.08.05 13:59)

set nocount on

declare
 @rc int,
 @err int

update Table1 set
 NAME = 'Name'
where ID = 1

select
 @rc = @@rowcount,
 @err = @@error

if (@@error <> 1) or (@rc = 0)
 raiserror 50001 'Ошибка, блин!'


alex_***   (2005-08-15 14:04:00) [10]

пишешь свое сообщение на каждый класс ошибки:

except on e: EDataBaseError do
...
end;

except on e: Exception do
Begin
 if e is EDatabaseEror then
 Begin
 End
...
...
End;
end


Наверх

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