powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не срабатывает raiserror
13 сообщений из 13, страница 1 из 1
Не срабатывает raiserror
    #32900707
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, может не по форуму, но проблема в следующем:
Имеется хранимая процедура на SQL-сервере, которую я запускаю из своего приложения (используется ADO, запускаю методом Execute класса (интерфейса) _CommandPtr ). В хранимой процедуре идет некоторая обработка данных: создается курсор и в цикле по курсору производятся необходимые операции. Цикл находится в транзакции (begin transaction ... commit tran).Также выполняются всякие проверки. Так вот, если проверка выдает отрицательный (положительный - в зависимости от условия) результат, то транзакция откатывается и вызывается raiserror(@msg,16,1), где @msg- сообщение об ошибке. Так вот данное сообщение игнорируется ,т.е. не возникает исключения в секции
Код: plaintext
try{ spCMD->Execute(...)} catch(_com_error &e){...}.
Было замечено следующее: если в открытой транзакции не было никаких выполненных транзакций (insert, update...), то raiserror срабатывает, если были- то нет.
В чем может быть причина: в SQL или ADO (ну или в том, кто сидит в машине ) ?

Спасибо за внимание.
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32900783
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставте , в начале своей процедуры
Код: plaintext
1.
set noucount on 
и все будет ок .


 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32900785
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставте , в начале своей процедуры
пример.
Код: plaintext
1.
2.
3.
4.
5.
create procedure dbo.my_proc
...
as
 set noucount on 
...
и все будет ок .


 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32900926
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО! ЗАРАБОТАЛО!
И все-таки почему после начатых транзакций не выводит, при отсутствии - и без set nocount on работает?
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32901093
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_VCСПАСИБО! ЗАРАБОТАЛО!
И все-таки почему после начатых транзакций не выводит, при отсутствии - и без set nocount on работает?

в данной цитате не стоит обращать внимание на "TADOStoredProc.ExecProc"

так как эта проблема относится не только к Делфи итд .

pkarklin
Давайте разберемся со следствием. Когда на клиенте вы делаете TADOStoredProc.ExecProc, то после каждой инструкции в хп на клиента приходит с сервера сообщение DONE_IN_PROC и клиент считает, что работа на сервере уже закончена и перестает "слушать", что дальше идет с сервера, а там как раз пойдут RAISERROR. SET NOCOUNT ON подавляет отправку этого сообщения после каждой инструкции.

Алексей К
или тупо в начало каждой процедуры/триггера ставить?

SET NOCOUNT ON должен присутствовать в каждой хп, имеющей более чем 1 инструкцию DML и в каждом триггере. Если хотите, можно такую установку делать для сессии при старте клиента.
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32902071
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про SET NOCOUNT ON конечно правильно, но только надо читать так :
"SET NOCOUNT ON должен присутствовать в каждой хп или триггере".
Без каких-либо условий.

А вот что ADO на raiserror выкидывает exception - полный идиотизм.

Кстати, а это как-то управляется ?
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32902202
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok, понятно.
MasterZiv
А вот что ADO на raiserror выкидывает exception - полный идиотизм.
raiserror генерирует ошибку sql-сервера, и ADO это тоже понимает (правда, не всегда). Поэтому, я считаю, что тут все нормально.
MasterZivКстати, а это как-то управляется ?
Управляется что?
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32902574
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПро SET NOCOUNT ON конечно правильно, но только надо читать так :
"SET NOCOUNT ON должен присутствовать в каждой хп или триггере".
Без каких-либо условий.

А вот что ADO на raiserror выкидывает exception - полный идиотизм.

Кстати, а это как-то управляется ?


Что управляется ?

ошибку ?
конечно ее можно обработать на стороне клиента
обычным

try ... catch

если я прально тобя понял
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32903613
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_VC
raiserror генерирует ошибку sql-сервера, и ADO это тоже понимает (правда, не всегда). Поэтому, я считаю, что тут все нормально.


raiserror генерирует сообщение с сервера, а не ошибку. Это может быть ошибкой, а может быть предупреждением или вообще просто информацией.
Как минимум клиент должен смотреть на severity этого сообщения, но даже при высоком severity это может быть НЕ ошибка. К тому же даже если это ошибка, не факт, что прерывать поток управления клиентского приложения в этом случае правильно.

Кстати, такой финт учудили не только в ADO, в JDK то же самое делают.

Alex_VC
MasterZivКстати, а это как-то управляется ?
Управляется что?

Выкидывание exception ADO/OLEDB при получении raiserror.
Можно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки.
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32903765
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RAISERROR
Returns a user-defined error message and sets a system flag to record
that an error has occurred. Using RAISERROR, the client can either
retrieve an entry from the sysmessages table or build a message
dynamically with user-specified severity and state information.
After the message is defined it is sent back
to the client
as a server error message.

Syntax
RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]...

Если я правильно перевел последнее предложение, то в нем говорится, что сообщение отправляется как сообщение об ошибке сервера. Значимость ошибки определяется параметром severity, со значения 20 до 25, кажется - обозначаются фатальные ошибки.

MasterZivМожно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки.
Да, наверное, можно: не выдавать на экран сообщение в виде MessageBox'a,
из параметра e (catch(_com_error &e)) записывать сообщения в отдельный массив (при этом цикл обработки можно не не прекращать). Я, например, пишу в log-файл, который затем можно открыть и прочитать все ошибки обработки...
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32903826
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv Alex_VC
raiserror генерирует ошибку sql-сервера, и ADO это тоже понимает (правда, не всегда). Поэтому, я считаю, что тут все нормально.


raiserror генерирует сообщение с сервера, а не ошибку. Это может быть ошибкой, а может быть предупреждением или вообще просто информацией.
Как минимум клиент должен смотреть на severity этого сообщения, но даже при высоком severity это может быть НЕ ошибка. К тому же даже если это ошибка, не факт, что прерывать поток управления клиентского приложения в этом случае правильно.

Кстати, такой финт учудили не только в ADO, в JDK то же самое делают.

Alex_VC
MasterZivКстати, а это как-то управляется ?
Управляется что?

Выкидывание exception ADO/OLEDB при получении raiserror.
Можно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки.

Насколько я помню ADO не генерит исключению в некоторых значениях
severity
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32911141
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_VC
Если я правильно перевел последнее предложение, то в нем говорится, что


Ты можешь говорить хоть двести раз "мёд", но от этого во рту слаще не
станет. Да, написано, да ты перевел правильно, но суть от этого не
меняется. К тому же то, что приходит клиенту как результат
raiserror возникает не только в результате raiserror. А например в результате PRINT.

Alex_VC

MasterZivМожно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки.

Да, наверное, можно: не выдавать на экран сообщение в виде MessageBox'a,
из параметра e (catch(_com_error &e)) записывать сообщения в отдельный массив (при этом цикл обработки можно не не прекращать). Я, например, пишу в log-файл, который затем можно открыть и прочитать все ошибки обработки...


Не, ты не понял - чтобы не выбрасывался бы exception вообще.
...
Рейтинг: 0 / 0
Не срабатывает raiserror
    #32911143
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JibSkeart
Насколько я помню ADO не генерит исключению в некоторых значениях
severity


Хорошо хоть так.
Но вот например в ASE нельзя в RAISERROR задавать severity - оно строго фиксированное, кажется 20, и соответствует уровню "нефатальная ошибка".
Так что если тебе хочется выдать из сервера предупреждение ...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не срабатывает raiserror
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]