Przechwycenie błędu z MSSQL

0

Chciałem przechwycić wyjątek z MSSQL, w związku z tym napisalem kawałek procedury który generuje wyjątek

 
alter PROCEDURE dbo.DodajTest
	@cos int
AS
BEGIN
	declare @r varchar(500)
	begin transaction
	begin try
		insert into dbo.Tabelka(id) values('dupa');
		commit transaction
	end try
	
	begin catch
		set @r = 'Błąd #' + cast(ERROR_NUMBER()	as varchar(10)) + ' w procedurze ' + ERROR_PROCEDURE() + CHAR(13) + CHAR(10)
				+ 'Treść błędu - ' + ERROR_MESSAGE();
		raiserror(@r,10,1);
		rollback transaction;
		return -1;
	end catch	
END

Przy wywołaniu z Management Studio dostaje piękny komunikat błędu

 
exec Import.dbo.dodajTest 20

Teraz chciałbym w delphi uzyskać to samo, niestety poniższy kod nie przechwytuje wyjątku

 
  qX.SQL.Clear;  //qX = TADOQuery
  qX.SQL.Add('exec Import.dbo.DodajTest 20');
try
  qX.ExecSQL;
except
  on E: Exception do
    ShowMessage(E.Message);
end;

Co robię nie tak?

0

niestety poniższy kod nie przechwytuje wyjątku

a co robi?

0

nie wchodzi w ogóle do bloku except

0

tylko co?

0

eeee... nie bardzo rozumiem :(
Procedura składowana jest tak napisana aby zawsze rzuciła wyjątek i wywołana z SSMS rzuca wyjątkiem - tak jak oczekiwałem.
Kod w delphi woła tą samą procedurę i oczekiwałem że dostanę komunikat błędu niemniej tak się nie dzieje, liczyłem że po qX.ExecSQL; zostanie rzucony wyjątek i przechwycony w bloku except.
Wywołanie procedury się wykonuje ale program nie wchodzi w blok except - tak jak by nie było wyjątku.

0

czyli po execsql od razu skacze do end?

0

dokładnie tak

0

Wyglada na to że wyjątku nie ma :(
Po wywołaniu procedury składowanej w delphi wykonałem:
ADOConnection1.Errors.Count - zwraca 0
select @@error - zwraca 0

Wywoałnie w SSMS
exec Import.dbo.DodajTest 20
select @@ERROR

zwraca w Messages
(0 row(s) affected)
Msg 50000, Level 16, State 1, Procedure DodajTest, Line 20
Błąd #544 w procedurze DodajTest
Treść błędu - Cannot insert explicit value for identity column in table 'Tabelka' when IDENTITY_INSERT is set to OFF.

(1 row(s) affected)

w Results - jeden rekord z wartością 0

Dla pewności zmodyfikowałem procedurę składowaną aby poprawnie wykonywała insert i odpaliłem ją w delphi - wykonało się poprawnie.

0

Jakaś pierdzielona magia... nagle wszystko zaczeło śmigać i to ni z gruchy ni z pietruchy.
Wirusy jakieś czy cuś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1