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

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

2000 Вернуть сообщение об ошибке [MSSQL]


KAA ©   (2002-07-03 21:12:00) 

Из одной хранимой процедуры вызываются другие, одна за другой. В одной из вызываемых процедур произошла ошибка и выскочило сообщение об ошибке. Если основная процедура будет запущена из под Queryanalyzer, то будет выдано сообщение об ошибке. Но если эту процедуру запустить из клиентского приложения (в частности приложение написано на Delphi 5) под конструкцией try .. except, туда сообщение об ошибке уже не приходит.
Что делать?


KAA   (2002-07-05 10:46:00) [1]

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


TSV   (2002-07-05 10:32:00) [2]

Ну так по логике вещей сначала данные проверяют, а уж потом, если они правильные, применяет их в БД. А если неправильные, генерят ошибку...


KAA   (2002-07-05 09:22:00) [3]

В INSERT нет никакой ошибки, он отрабатывает правильно и добавляет запись. Просто если я перед ним просто вызову RAISERROR, он вернется клиенту, если после, то уже не вернется.
Ошибка - это не обязательно системная ошибка, я генерю ошибки, например, если данные переданные в процедуру оказались неправильные.


Alex-A   (2002-07-05 07:33:00) [4]

2TSV
Не-а, не получиться так, я уже пробовал!


TSV   (2002-07-04 21:08:00) [5]

Сразу после Insert:

if @@ERROR <> 0
begin
RAISERROR("Ошибка.", 16, 10) WITH SETERROR
RETURN -1
end


KAA   (2002-07-04 20:29:00) [6]

В вызываемой процедуре выполняется команда INSERT. Если до этого инсерта сделать RAISERROR, ошибка вернется в клиентское приложение. Если после инсерта, то уже не возвращается.


Alex-A   (2002-07-04 14:53:00) [7]

WITH SETERROR устанавливает значение гловальной переменной @@ERROR в код ошибки, независимо от уровня "серьезности" этой ошибки

А вопрос про который упомянул TSV задавал я, там речь шла немного о другом, но этот способ тебе тоже поможет после вызова процедуры в цикле посмотри свойство Errors у ADOConnection - там все ошибки и обнаружишь если по try ... except не получилось.


KAA   (2002-07-04 12:05:00) [8]

так а что конкретно WITH SETERROR делает?

А название той ветви не помните?


TSV   (2002-07-04 11:51:00) [9]

Обрати внимание на опцию WITH SETERROR .

Также недавно в форуме проскакивало, что если идет работа с ADO, то нужно в цикле просмотреть свойство Errors или что-то в этом роде...


KAA   (2002-07-04 10:52:00) [10]

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


TSV   (2002-07-04 10:38:00) [11]

В общем-то принцип тот же самый - "отрейзить" ошибку на более верхний уровень...


TSV   (2002-07-04 10:36:00) [12]

Ну, примерно так:

CREATE PROCEDURE dbo.Proc1
AS BEGIN
...
execute Proc2
if @@ERROR <> 0
begin
RAISERROR("Ошибка выполнения процедуры [proc2]", 16, 10) WITH SETERROR
RETURN -1
end

...
END


Наверх

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