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

Вниз

Создание исключения при добавлении данных в БД   Найти похожие ветки 

 
marcel   (2006-05-05 10:11) [0]

Здраствуйте.
Сервер приложений содержит следующий код.

function Tcbgs1.ConfirmArrival(Delta: OleVariant): OleVariant;
var i,ErrorCount:integer;
   s,p1:string;
   CDSCommon:TClientDataSet;
begin
 ....
 CDSCommon.Data:=Delta;
 while not CDSCommon.eof do begin
   ...
   // Кусок 1 - начало
   IBQVerify.Close;
   IBQVerify.SQL.Text:="select * ...";
   IBQVerify.ParamByName("p1").AsString:=p1;
   IBQVerify.Open;
   IBQVerify.FetchAll;
   if IBQVerify.RecordCount>0 then
     Raise EUpdateError.CreateFmt("Не выолнено условие %s...",[p1]);
   IBQVerify.Close;
   // Кусок 1 - конец
   CDSCommon.Next;
 end;
 // DSPVagsInWay - DataSetProvider
 Result:=DSPVagsInWay.ApplyUpdates(Delta,-1,ErrorCount);
 ...
end;
...
// Обработка исключений при добавлении.
procedure Tcbgs1.DSPVagsInWayUpdateError(Sender: TObject;
 DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
 var Response: TResolverResponse);
begin
 // Ф-ция журналирования
 FMain.Log(ClientDesc.IP+" "+ClientDesc.Name+" Ошибка "+E.ClassName+" "+E.Context+" "+IntToStr(E.ErrorCode)+" "+E.Message);
end;

Что сейчас.
Клиентское приложений вызывает ConfirmArrival().
Данные записываются в БД (Result:=DSPVagsInWay.ApplyUpdates(Delta,-1,ErrorCount);)
Если происходит ошибка при добавлении (нарушение ограничений описанных в БД, например первичного ключа) вызывается
DSPVagsInWayUpdateError и тип ошибки записывается в журнал, у клиента появляется окно с описанием этой ошибки, остальные записи, не нарушающие ограничений добавляются в БД.

Что хочу.
Кроме ограничений, описанных в таблицах БД, надо выполнять дополнительные проверки перед записью данных (Кусок 1). При выполнении условия генерировать ошибку, которая приводила бы к действиям, описанным выше.

Что не получается.
При выполнении  if IBQVerify.RecordCount>0 then
     Raise EUpdateError.CreateFmt("Не выолнено условие %s...",[p1]);

выполнение дальнейшего участка кода прерывается, и соответственно не выполняется что хочу.

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


 
Johnmen ©   (2006-05-05 10:21) [1]


>    IBQVerify.Open;
>    IBQVerify.FetchAll;
>    if IBQVerify.RecordCount>0 then
>      Raise EUpdateError.CreateFmt("Не выолнено условие %s.
> ..",[p1]);
>    IBQVerify.Close;


Т.е. всё это делается только чтобы узнать количество записей????????????


 
marcel   (2006-05-05 10:28) [2]

Да. В данном случае количество записей сопределенным условием.
В другом что-то еще.Что здесь странного?
Просто есть ограничения, которые я не могу описать на уровне БД. Поэтому перед вставкой хочу сделать вот такую проверку.


 
marcel   (2006-05-05 10:29) [3]

Да. В данном случае количество записей с определенным условием.
В другом что-то еще.Что здесь странного?
Просто есть ограничения, которые я не могу описать на уровне БД. Поэтому перед вставкой хочу сделать вот такую проверку.


 
ANB ©   (2006-05-05 10:30) [4]


> Что не получается.
> При выполнении  if IBQVerify.RecordCount>0 then
>      Raise EUpdateError.CreateFmt("Не выолнено условие %s.
> ..",[p1]);
> выполнение дальнейшего участка кода прерывается, и соответственно
> не выполняется что хочу.

Сначала сделай все проверки, потом анализируй результат и генери исключения.


 
Johnmen ©   (2006-05-05 10:37) [5]


> Да. В данном случае количество записей сопределенным условием.
> В другом что-то еще.Что здесь странного?


Здесь странно, или, точнее, просто абсурдно (не буду говорить бредово:)), тащить на клиента (клиента БД) записи только для того, чтобы узнать их количество!!!!!!!!!
А почему бы не сделать SELECT COUNT(*) ?


 
Val ©   (2006-05-05 10:37) [6]

э..так зачем генерировать ошибку, если нужно продолжать выполнение? может просто вызывать DSPVagsInWayUpdateError чтоб в лог писал и продолжать дальше работать?


 
marcel   (2006-05-05 11:49) [7]

> ANB
Так я так и делаю. Вся разница как раз в том, что если исключение происходит из-за ограничений БД, то все работает как надо. А если исключение сгенерировано мной, то выполнение кода прервается, и не срабатывает DSPVagsInWayUpdateError().

> Johnmen
Запрос привел для примера. Мне понадобится в дальнейшем значения полей,кроме count(*).

> Val
Сечас конечно попоробую. Но я так рассуждал, что DSPVagsInWayUpdateError() есть следствие исключения и не приведет к отправке сообщения об ошибке клиенту сервера приложения.

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

Запись № 1 не добавлена  по причине нарушения первичного ключа
Запись № 2 не добавлена  по причине моего плохого настроения.


При этом Запись №1 не добавлена по причине ограничений БД, а Запись №2 по причине ограничений сгенерированых при "ручной" проверке даных.


 
ANB ©   (2006-05-05 12:04) [8]


> А если исключение сгенерировано мной

Ну так не генери его, пока все не обработаешь.
А в конце, если были ошибки - сгенери одно большое.


 
Val ©   (2006-05-05 14:06) [9]

да можно и генерить(да и нужно, скорее всего) для каждого, но обрабатывать его в try except, оттуда вовне не передавать, чтобы не прерывалась работа, а просто вызывать запись в лог.



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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
2-1150105269
Fiallo4ka
2006-06-12 13:41
2006.07.02
не работает навигатор


2-1149857266
webpauk
2006-06-09 16:47
2006.07.02
Установить курсор на кнопку


2-1150194681
ййййййййй
2006-06-13 14:31
2006.07.02
А что функция beep в win2000 не работает? :(


15-1149527219
pGn-BrutaL
2006-06-05 21:06
2006.07.02
церковники запретили продажу кода да винчи...


15-1149689255
Ega23
2006-06-07 18:07
2006.07.02
Модераторы! Загляните в Базы.