我想在try块中重新抛出SQL Server中刚刚发生的相同异常。我可以抛出相同的消息,但我想抛出相同的错误。
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时,应该返回下面提到的错误
Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
第14行违反UNIQUE KEY约束“ UK_DomainCode”。无法在对象“ Tags.tblDomain”中插入重复的密钥。该语句已终止。
编辑:
考虑到存储过程包含多个需要执行的查询,如果我希望在前端处理异常,不使用try catch块有什么缺点?
raiserror
c之后继续执行,这与c#在a之后退出的方式不同throw
。因此,我添加了一个return
,catch
因为我想匹配该行为。