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łemreturnwewnątrz,catchponieważ chciałem dopasować to zachowanie.