Главная страница
    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.47 MB
Время: 0.009 c
2-1149766211
Roman_ln
2006-06-08 15:30
2006.07.02
Защита проги от плагиата


15-1149641654
tButton
2006-06-07 04:54
2006.07.02
радио


15-1149483514
Ega23
2006-06-05 08:58
2006.07.02
С Днём рождения! 4 июня


15-1149438789
Колдун
2006-06-04 20:33
2006.07.02
Вопрос про Властелина Колец


2-1149975785
learner
2006-06-11 01:43
2006.07.02
Правильное закрытие Handl - а





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский