Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
2-1150014942
Mozgan
2006-06-11 12:35
2006.07.02
TreeView - сломать голову или как правильно работать


2-1150294685
Megabyte
2006-06-14 18:18
2006.07.02
Как "урезать" лишние знаки после запятой у чисел типа real?


2-1150091357
QuickReport
2006-06-12 09:49
2006.07.02
Установить QuickReport в D7?


3-1146655202
comtat
2006-05-03 15:20
2006.07.02
TMySQLClient, Как пользоваться ???


1-1148544805
Juice
2006-05-25 12:13
2006.07.02
Несколько вопросов по панелям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский