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

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

Почему IF @@ERROR <> 0 не выполняется [MSSQL]


Страницы:   1 2 3

Vedem ©   (2006-09-18 17:56:00) 

Берем пример из BOL и немного его модифицируем
Examples
A. Use @@ERROR to detect a specific error
This example uses @@ERROR to check for a check constraint violation (error #547) in an UPDATE statement.

use pubs
go

declare @t table (msg varchar(255))

UPDATE authors SET au_id = '172 32 1176'
WHERE au_id = '172-32-1176'

IF @@ERROR = 547
  insert into @t values('A check constraint violation occurred')
ELSE
  insert into @t values('Все ОК!')

SELECT * FROM @t


Задача в следующем:
Нужно вернуть сообщения (и о нормальной работе и о возникших ошибках) в датасете.

При выполнении запроса в QA получаем 2 вкладки Grids и Messages

Messages:

Server: Msg 547, Level 16, State 1, Line 1
UPDATE statement conflicted with COLUMN CHECK constraint 'CK__authors__au_id__77BFCB91'.
The conflict occurred in database 'pubs', table 'authors', column 'au_id'.
The statement has been terminated.

(1 row(s) affected)

(1 row(s) affected)

Grids:

A check constraint violation occurred

При выполнении этого же запроса из приложения имеем Exception

UPDATE statement conflicted with COLUMN CHECK constraint 'CK__authors__au_id__77BFCB91'.
The conflict occurred in database 'pubs', table 'authors', column 'au_id'.
и отсутствие датасета.

То же самое произходит при выполнении ХП, при наличии ошибки выполнение ХП прерывается.

Вопрос: как получить датасет не зависимо от наличия ошибки?

BDS2006 + ADO + MSSQL 2000


Zz_   (2006-09-18 19:57:00) [41]

>>Вопрос: как получить датасет не зависимо от наличия ошибки?

Посмотреть NextRecordset


Ega23   (2006-09-18 19:56:00) [42]


> Fay ©   (18.09.06 19:54) [14]


Ну и что? первым всё равно сообщение об ошибке в QA идёт, как ни крутись...


Fay   (2006-09-18 19:54:00) [43]

Примерно так
use pubs
go
set xact_abort off

declare @t table (msg varchar(255))

begin tran

UPDATE authors SET au_id = '172 32 1176'
WHERE au_id = '172-32-1176'

IF @@ERROR = 0 begin
 commit tran      
 insert into @t values('OK!')
end ELSE begin
 rollback tran      
 insert into @t values('Fuck!')
end

SELECT * FROM @t


Ega23   (2006-09-18 19:46:00) [44]


> Тогда делаем финт с "лишним" recordset-ом
> set nocount OFF


Это я уже проверил, не канает...  :о)
Только сообщение на insert уберёт...


Fay   (2006-09-18 19:37:00) [45]

Не, нифига... 8))


Fay   (2006-09-18 19:36:00) [46]

Тогда делаем финт с "лишним" recordset-ом
set nocount OFF
....


Ega23   (2006-09-18 19:13:00) [47]


> так может проще проверку сделать на наличие /отсутствие
> нужной записи?


Ты посмотри внимательней, там check на constraint наложен


> set xact_abort off


Не поможет, один хрен raise идёт...


Fay   (2006-09-18 18:49:00) [48]

set xact_abort off


stud   (2006-09-18 18:48:00) [49]

так может проще проверку сделать на наличие /отсутствие нужной записи?
чтобы без исключений


Ega23   (2006-09-18 18:46:00) [50]

Хрен его знает. А если как ХП оформить с ouput-параметром?


vedem   (2006-09-18 18:25:00) [51]

declare @t table (msg varchar(255))

begin tran
UPDATE authors SET au_id = '172 32 1176'
WHERE au_id = '172-32-1176'
IF @@ERROR = 547 begin
  Rollback tran
  insert into @t values('A check constraint violation occurred')
end ELSE begin
commit tran
  insert into @t values('Все ОК!')
end

SELECT * FROM @t


результат тот=же :(


Ega23   (2006-09-18 18:19:00) [52]

Begin tran ....
.....
if @@ERROR<>0 Goto RollBackTran

.......

Commit Tran
Goto Fin

:RollBackTran
RollBack Tran ....
Goto Fin

:Fin
Select * from ....


Не проверял, но вроде принудительных Raiserror нету....


vedem   (2006-09-18 18:16:00) [53]

Из-за пары запросов менять средсво доступа - как-то не прикольно.
Проверял это на BDE, ODBC - результат тот же.
При использовании компонет Zeos, при "прямом доступе" (собственно посредством DBLIB) - работает как надо.
Неужели в АДО нет средств настроить нужное поведение?


ANB   (2006-09-18 18:05:00) [54]


> stud ©   (18.09.06 17:59) [1]

Последним идет селект.


> Вопрос: как получить датасет не зависимо от наличия ошибки?

Это глюк АДО. Он не дожидается завершения пакета / ХП считая первую же ошибку исключением. Лезь к серверу напрямую (например, используя DBLIB). Впрочем, может спецы по АДО подскажут лучшее решение ?


vedem   (2006-09-18 18:05:00) [55]

SELECT * FROM @t
в конце запроса....


stud   (2006-09-18 17:59:00) [56]

Vedem ©   (18.09.06 17:56)
Вопрос: как получить датасет не зависимо от наличия ошибки?

а какой датасет при update??


Страницы:   1 2 3

Наверх

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