Chcę ponownie zgłosić ten sam wyjątek w SQL Server, który właśnie wystąpił w moim bloku try. Mogę wysłać tę samą wiadomość, ale chcę zgłosić ten sam błąd.
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO Tags.tblDomain (DomainName, SubDomainId, DomainCode, Description)
VALUES(@DomainName, @SubDomainId, @DomainCode, @Description)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
declare @severity int;
declare @state int;
select @severity=error_severity(), @state=error_state();
RAISERROR(@@Error,@ErrorSeverity,@state);
ROLLBACK TRANSACTION
END CATCH
RAISERROR(@@Error, @ErrorSeverity, @state);
Ta linia pokaże błąd, ale chcę mieć taką funkcjonalność. Rodzi to błąd z numerem błędu 50000, ale chcę, aby był wyrzucany numer błędu, który mijam @@error
,
Chcę uchwycić ten błąd nie na frontendzie.
to znaczy
catch (SqlException ex)
{
if ex.number==2627
MessageBox.show("Duplicate value cannot be inserted");
}
Chcę mieć tę funkcjonalność. czego nie można osiągnąć za pomocą raiseerror
. Nie chcę wyświetlać niestandardowego komunikatu o błędzie na zapleczu.
RAISEERROR
Powinien zwrócić poniżej wspomniany błąd, gdy przekażę ErrorNo do wrzucenia do połowu
Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
Wiersz 14 Naruszenie ograniczenia UNIQUE KEY „UK_DomainCode”. Nie można wstawić zduplikowanego klucza w obiekcie „Tags.tblDomain”. Oświadczenie zostało zakończone.
EDYTOWAĆ:
Jaka może być wada nieużywania bloku try catch, jeśli chcę, aby wyjątek był obsługiwany na interfejsie użytkownika, biorąc pod uwagę, że procedura składowana zawiera wiele zapytań, które należy wykonać?
raiserror
, co różni się od sposobu, w jaki C # kończy działanie po plikuthrow
. Więc dodałemreturn
wewnątrz,catch
ponieważ chciałem dopasować to zachowanie.