Форум: "Базы";
Текущий архив: 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.008 c