|
|
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Не знаю, может не по форуму, но проблема в следующем: Имеется хранимая процедура на SQL-сервере, которую я запускаю из своего приложения (используется ADO, запускаю методом Execute класса (интерфейса) _CommandPtr ). В хранимой процедуре идет некоторая обработка данных: создается курсор и в цикле по курсору производятся необходимые операции. Цикл находится в транзакции (begin transaction ... commit tran).Также выполняются всякие проверки. Так вот, если проверка выдает отрицательный (положительный - в зависимости от условия) результат, то транзакция откатывается и вызывается raiserror(@msg,16,1), где @msg- сообщение об ошибке. Так вот данное сообщение игнорируется ,т.е. не возникает исключения в секции Код: plaintext В чем может быть причина: в SQL или ADO (ну или в том, кто сидит в машине ) ? Спасибо за внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 10:18 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Поставте , в начале своей процедуры Код: plaintext 1. ш (';') (V),(V),, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 10:54 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Поставте , в начале своей процедуры пример. Код: plaintext 1. 2. 3. 4. 5. ш (';') (V),(V),, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 10:55 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
СПАСИБО! ЗАРАБОТАЛО! И все-таки почему после начатых транзакций не выводит, при отсутствии - и без set nocount on работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 11:48 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Alex_VCСПАСИБО! ЗАРАБОТАЛО! И все-таки почему после начатых транзакций не выводит, при отсутствии - и без set nocount on работает? в данной цитате не стоит обращать внимание на "TADOStoredProc.ExecProc" так как эта проблема относится не только к Делфи итд . pkarklin Давайте разберемся со следствием. Когда на клиенте вы делаете TADOStoredProc.ExecProc, то после каждой инструкции в хп на клиента приходит с сервера сообщение DONE_IN_PROC и клиент считает, что работа на сервере уже закончена и перестает "слушать", что дальше идет с сервера, а там как раз пойдут RAISERROR. SET NOCOUNT ON подавляет отправку этого сообщения после каждой инструкции. Алексей К или тупо в начало каждой процедуры/триггера ставить? SET NOCOUNT ON должен присутствовать в каждой хп, имеющей более чем 1 инструкцию DML и в каждом триггере. Если хотите, можно такую установку делать для сессии при старте клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 12:45 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Про SET NOCOUNT ON конечно правильно, но только надо читать так : "SET NOCOUNT ON должен присутствовать в каждой хп или триггере". Без каких-либо условий. А вот что ADO на raiserror выкидывает exception - полный идиотизм. Кстати, а это как-то управляется ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 17:46 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Ok, понятно. MasterZiv А вот что ADO на raiserror выкидывает exception - полный идиотизм. raiserror генерирует ошибку sql-сервера, и ADO это тоже понимает (правда, не всегда). Поэтому, я считаю, что тут все нормально. MasterZivКстати, а это как-то управляется ? Управляется что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2005, 18:56 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
MasterZivПро SET NOCOUNT ON конечно правильно, но только надо читать так : "SET NOCOUNT ON должен присутствовать в каждой хп или триггере". Без каких-либо условий. А вот что ADO на raiserror выкидывает exception - полный идиотизм. Кстати, а это как-то управляется ? Что управляется ? ошибку ? конечно ее можно обработать на стороне клиента обычным try ... catch если я прально тобя понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2005, 13:57 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Alex_VC raiserror генерирует ошибку sql-сервера, и ADO это тоже понимает (правда, не всегда). Поэтому, я считаю, что тут все нормально. raiserror генерирует сообщение с сервера, а не ошибку. Это может быть ошибкой, а может быть предупреждением или вообще просто информацией. Как минимум клиент должен смотреть на severity этого сообщения, но даже при высоком severity это может быть НЕ ошибка. К тому же даже если это ошибка, не факт, что прерывать поток управления клиентского приложения в этом случае правильно. Кстати, такой финт учудили не только в ADO, в JDK то же самое делают. Alex_VC MasterZivКстати, а это как-то управляется ? Управляется что? Выкидывание exception ADO/OLEDB при получении raiserror. Можно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2005, 11:18 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
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-файл, который затем можно открыть и прочитать все ошибки обработки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2005, 12:08 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
MasterZiv Alex_VC raiserror генерирует ошибку sql-сервера, и ADO это тоже понимает (правда, не всегда). Поэтому, я считаю, что тут все нормально. raiserror генерирует сообщение с сервера, а не ошибку. Это может быть ошибкой, а может быть предупреждением или вообще просто информацией. Как минимум клиент должен смотреть на severity этого сообщения, но даже при высоком severity это может быть НЕ ошибка. К тому же даже если это ошибка, не факт, что прерывать поток управления клиентского приложения в этом случае правильно. Кстати, такой финт учудили не только в ADO, в JDK то же самое делают. Alex_VC MasterZivКстати, а это как-то управляется ? Управляется что? Выкидывание exception ADO/OLEDB при получении raiserror. Можно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки. Насколько я помню ADO не генерит исключению в некоторых значениях severity ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2005, 12:37 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
Alex_VC Если я правильно перевел последнее предложение, то в нем говорится, что Ты можешь говорить хоть двести раз "мёд", но от этого во рту слаще не станет. Да, написано, да ты перевел правильно, но суть от этого не меняется. К тому же то, что приходит клиенту как результат raiserror возникает не только в результате raiserror. А например в результате PRINT. Alex_VC MasterZivМожно ли сделать так, чтобы не выбрасывался бы exception при получении данных от raiserror, а эти данные, например, складывались бы в какой-то массив, доступный приложению для обработки. Да, наверное, можно: не выдавать на экран сообщение в виде MessageBox'a, из параметра e (catch(_com_error &e)) записывать сообщения в отдельный массив (при этом цикл обработки можно не не прекращать). Я, например, пишу в log-файл, который затем можно открыть и прочитать все ошибки обработки... Не, ты не понял - чтобы не выбрасывался бы exception вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2005, 22:06 |
|
||
|
Не срабатывает raiserror
|
|||
|---|---|---|---|
|
#18+
JibSkeart Насколько я помню ADO не генерит исключению в некоторых значениях severity Хорошо хоть так. Но вот например в ASE нельзя в RAISERROR задавать severity - оно строго фиксированное, кажется 20, и соответствует уровню "нефатальная ошибка". Так что если тебе хочется выдать из сервера предупреждение ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2005, 22:09 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32901093&tid=2033733]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
172ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 495ms |

| 0 / 0 |
