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

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

Создание исключения при добавлении данных в БД [D6, Firebird]


marcel ©   (2006-05-05 10:11:00) 

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

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]);

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

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


Val   (2006-05-05 14:06:00) [1]

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


ANB   (2006-05-05 12:04:00) [2]


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

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


marcel   (2006-05-05 11:49:00) [3]

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

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

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

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

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


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


Johnmen   (2006-05-05 10:37:00) [4]


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


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


Val   (2006-05-05 10:37:00) [5]

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


ANB   (2006-05-05 10:30:00) [6]


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

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


marcel   (2006-05-05 10:29:00) [7]

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


marcel   (2006-05-05 10:28:00) [8]

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


Johnmen   (2006-05-05 10:21:00) [9]


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


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


Наверх

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