Я хочу повторно вызвать то же исключение в 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 Нарушение ограничения UNIQUE KEY 'UK_DomainCode'. Невозможно вставить повторяющийся ключ в объект Tags.tblDomain. Заявление было прекращено.
РЕДАКТИРОВАТЬ:
В чем может быть недостаток неиспользования блока try catch, если я хочу, чтобы исключение обрабатывалось во внешнем интерфейсе, учитывая, что хранимая процедура содержит несколько запросов, которые необходимо выполнить?
raiserror
, что отличается от того, как C # завершает работу послеthrow
. Поэтому я добавилreturn
внутри,catch
потому что хотел соответствовать этому поведению.