Форум: "Базы";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
ВнизСерьёзный вопрос: отображение текста Exception после Suspend; Найти похожие ветки
← →
VID (2004-01-02 03:04) [0]Допустим есть хранимая процедура P1 (один выходной параметр OUT_ID), и исключение E1 (с каким-нибудь текстом):
begin
OUT_ID = -1;
Suspend;
Exception E1;
end /*Конец процедуры*/
У меня FIBPlus 4.8.0
При вызове этой процедуры методом
Select "OUT_ID" from P1 я получаю в качестве возвращаемого результата OUT_ID равный -1, но не вижу текста сообщения об ошибке!
Вызов процедуры происходит так
function CreateQ (var aIBDB:TpFIBDatabase; aSQL: string): TpFIBQuery;
begin
Result := nil;
IF aIBDB = nil then Exit;
result:= TpFIBQuery.Create(aIBDB);
result.options:=[qoStartTransaction];
result.database:=aIBDB;
Result.Transaction:=aIBDB.DefaultTransaction;
result.SQL.Text:=aSQL;
Result.GoToFirstRecordOnExecute := True;
result.tag:=Integer(result);
end;
// а вот сам вызов
With CreateQ(IBDB, "Select "OUT_ID" from P1") do
try
try
ExecQuery;
Transaction.CommitRetaining;
ShowMessage(FieldByName["OUT_ID"].AsString);
Except
on E:Exception do ShowMessage(E.Message);
end;
finally
Free;
end;
Т.е. по логике вещей, я должен был увидеть сообщение об ошибке!
Что интересно в IBExpert при выполнении такого же запроса, средствами его SQL-редактора, всё работает корректно: возвращается результат ХП, а также отображается сообщение об ошибке.
Что и как надо сделать что бы была возможность отображения текста Exception после вызова Suspend; ?
← →
kaif (2004-01-03 01:00) [1]Может быть дело в однократности Fetch ?
Может быть попробовать:
try
ExecQuery;
Fetch; //что-то в этом духе. Я с FIB не работал...
Transaction.CommitRetaining;
ShowMessage(FieldByName["OUT_ID"].AsString);
Except
on E:Exception do ShowMessage(E.Message);
end;
Хотя странно это все.
← →
VID (2004-01-04 14:25) [2]В-общем... проблема была действительно сложной, пришлось на два часа впасть в транс :) зато потом всё-таки нашёл выход из довольно-таки паршивой ситуации.
А вообще вот что скажу: Когда в TpFIBDataSet (fibplus 4.8.0) в Insert-SQL пишешь такой скрипт:
Select "OUT_ID" FROM INSERTTOTABLE1(:F1, :F2, :F3);
то возвращается именно ПЕРВАЯ строка результатов этого запроса.
А Ведь действительно, для того что бы появился текст EXCEPTION надо после выполнения запроса реализовать fetch. Т.е. в TpFIBQuery конечно нет метода fetchall но его аналогом может быть код
while not eof do next;
и таким образом код должен выглядеть так
try
ExecQuery;
Transaction.CommitRetaining;
ShowMessage(FieldByName["OUT_ID"].AsString);
While not EOF do Next; //Для того что бы дело дошло до появления текста EXCEPTION.
Except
on E:Exception do ShowMessage(E.Message);
end;
Лично я склонен считать такую реализуцию Select-запросов в INSERT-SQL глюком. Может быть в 5х версиях фибов это исправлено, а может они и не считают это ошибкой...
Так или иначе проблема решена. Всем спасибо за внимание.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c