Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.07;
Скачать: CL | DM;

Вниз

Обработка ошибки при неверном добавлении записи в БД.   Найти похожие ветки 

 
Гость   (2009-04-21 10:21) [0]

Добрый день.
Ситуация след-я.
При добавлении новой записи в табличку, если не все поля заполнены вылезает ошибка примерно такая:

Project Project1.exe raised exception class EFIBInterBaseError with message "DMForm.ClassDSet.InsertQuery:
The insert failed because a column definition includes validation constraints.Validation error for column ID_MODEL, value "*** null ***".
".
Хочется обработать ее и выдать собственное сообщение пользователю.
Кидаю на форму ErrorHandler1. Пишу обработчик:
procedure TDMForm.ErrorHandler1FIBErrorEvent(Sender: TObject;
 ErrorValue: EFIBError; KindIBError: TKindIBError; var DoRaise: Boolean);
begin
 DoRaise := True;
 if (Sender is TFIBQuery) and
    (ErrorHandler1.LastError = keOther) // Она почему то именно этого типа.
 then
 begin
   MessageDlg("Все поля новой записи должны быть заполнены!!", mtError,[mbOK], 0);
   DoRaise := False;
 end;
end;

Так вот, если ошибка возникает в следствии попытки пользователя перейти на с новой недозаполненной записи на другую, то сообщение то я получаю свое, но вот переход на другую запись осуществляется и получается в табличке на форме неверная строка!!
Если же [b]DoRaise[/b] ставить в true, то остается текущей неверная строчка, что и требуется, но при этом вслед за моим сообщением вылезает ошибка с сервера.
(FB, FIB, Delphi 2007)


 
Sergey13 ©   (2009-04-21 10:30) [1]

Я предпочитаю не допускать до сервера не проверенные (хотя бы прмитивненько) данные.
Во первых можно проверить данные перед POST-ом. Во вторых можно (и очень желательно) сделать ввод сложных и/или объемных данных на отдельной форме и проверять по кнопке "Сохранить".
А отлов исключений сервера - это последний рубеж обороны, который никогда не должен срабатывать. 8-)


 
Гость   (2009-04-21 11:32) [2]

Sergey13, согласен полностью.
Подскажи, pls, как мне обработать эту ошибку перед добавлением записи.
Я пробовал сделать в методе BeforePost. Но не могу сообразить как отменить этот самый Post и вернуть пользователя на неверную строку, а не просто отменить с удалением этой строки, что делает DataSet.Cancel.


 
Sergey13 ©   (2009-04-21 12:44) [3]

> [2] Гость   (21.04.09 11:32)

Abort


 
sniknik ©   (2009-04-21 13:12) [4]

прятать оригинальную строку с ошибкой ни в коем случае нельзя! самые большие проблемы с поддержкой не изза того, что чего-то не работает, а из-за того, что ошибка не выдается или "переводится" (а то еще одной фразой целый класс ошибок. русификаторы блин).


 
Anatoly Podgoretsky ©   (2009-04-21 13:19) [5]

Стрелять из рогатки.


 
clickmaker ©   (2009-04-21 13:21) [6]

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

не очень продвинутые пользователи пугаются таких строк ) уж не говоря о том, что не все в состоянии будут, например, по телефону произнести внятно текст экцепшена. который в первом посте.
можно вести лог, в случае сбоя просить выслать его техподдержке


 
Anatoly Podgoretsky ©   (2009-04-21 13:24) [7]

> clickmaker  (21.04.2009 13:21:06)  [6]

Так есть же другой метод, когда текста два, свой и оригинальный. И нашим и вашим.


 
clickmaker ©   (2009-04-21 14:56) [8]

> Так есть же другой метод, когда текста два, свой и оригинальный

это и имелось в виду под ведением лога. Разумеется, юзеру надо как-то сказать об ошибке


 
Anatoly Podgoretsky ©   (2009-04-21 15:15) [9]

> clickmaker  (21.04.2009 14:56:08)  [8]

Можно и так, а можно и в сообщение. Вариантов то много. Важно не скрывать, а то концов не найти.


 
Гость   (2009-04-21 15:19) [10]

Sergey13, спасибо. Аборт помог ))
Для лога использую отдельную функцию:

procedure AddToLog(s:string);
var
fn:string;
F:TextFile;
begin
 Fn:=ExtractFilePath(ParamStr(0))+"ARM_log.txt";
 assignFile(f,fn);
 if FileExists(fn) then Append(f) else Rewrite(f);
 Write(f,DateTimeToStr(Now));
 Writeln(f,"> "+ s);
 Flush(f);
 Closefile(f);
end;



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

Текущий архив: 2009.06.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
2-1240333672
Дмитрий
2009-04-21 21:07
2009.06.07
Не работает программа.


15-1238953192
ЭРИКА
2009-04-05 21:39
2009.06.07
С ДНЕМ РОЖДЕНИЯ!


3-1222169341
Ega23
2008-09-23 15:29
2009.06.07
ODBC DSN с сохранением пароля


2-1240231874
night_light
2009-04-20 16:51
2009.06.07
сжатие и отправкакартинки по сети


2-1240454821
vegarulez
2009-04-23 06:47
2009.06.07
Вопрос про Zquery+ while not EOF