![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему IF @@ERROR <> 0 не выполняется [MSSQL]
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??