Я хочу відновити той самий виняток у SQL Server, який щойно стався у моєму блоці try. Я можу скинути одне і те ж повідомлення, але хочу викинути ту саму помилку.
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);
У цьому рядку буде показано помилку, але я хочу щось подібне до функціональності. Це спричиняє помилку з номером помилки 50000, але я хочу, щоб номер помилки був виданий я передаю @@error
,
Я хочу зафіксувати цю помилку на фронтенді.
тобто
catch (SqlException ex)
{
if ex.number==2627
MessageBox.show("Duplicate value cannot be inserted");
}
Я хочу цю функціональність. чого неможливо досягти за допомогою raiseerror
. Я не хочу видавати власне повідомлення про помилку на задній панелі.
RAISEERROR
повинен повернутися нижче згаданої помилки, коли я передаю ErrorNo, щоб бути кинутим в catch
Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
Рядок 14 Порушення УНІКАЛЬНОГО КЛЮЧОВОГО обмеження 'UK_DomainCode'. Не вдається вставити дублікат ключа в об'єкт 'Tags.tblDomain'. Заява припинена.
РЕДАГУВАТИ:
Що може бути недоліком невикористання блоку try catch, якщо я хочу, щоб виняток оброблявся на фронтенді, враховуючи, що збережена процедура містить кілька запитів, які потрібно виконати?
raiserror
, що відрізняється від того, як c # виходить після athrow
. Тому я додавreturn
внутрішнюcatch
частину, тому що хотів відповідати цій поведінці.