SQL Server中的错误处理问题
本文关键字:错误 处理问题 Server SQL | 更新日期: 2023-09-27 18:08:03
我使用c#和一个类型的数据集,它链接到SQL Server Express数据库中的存储过程。在存储过程中,我使用try catch
进行错误处理。
这是我的catch块:
begin catch
select
error_number() as errorNumber,
error_severity() as errorSeverity,
error_state() as errorState,
error_procedure() as errorProcedure,
error_line() as errorLine,
error_message() as errorMessage
end catch
try catch
是处理数据库错误的最好方法吗??因为SQL Server将返回错误信息作为一个表,我如何识别如果返回的表充满了数据或它包含错误信息??
编辑: ok,所以我得到异常,我重新抛出它??但是为什么呢?我的意思是,如果我一开始没有抓住它,它会冒泡到我的应用程序中,我可以在那里管理它。所以我为什么要用try catch??
这个可以是处理存储过程中的错误的好方法,但是通常情况下您会这样做以将错误记录到表中:
begin catch
insert into ErrorLog
select
error_number() as errorNumber,
error_severity() as errorSeverity,
error_state() as errorState,
error_procedure() as errorProcedure,
error_line() as errorLine,
error_message() as errorMessage
end catch
然而,基于异常应该只在特殊情况下发生的事实,您几乎肯定希望重新抛出错误,以便您的代码能够以最合理的方式处理此异常。
在sql server中使用RAISERROR
(docs)命令来实现。
你的代码最终看起来像:
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- You could log the error here
INSERT INTO ErrorLog(message, severity, state)
VALUES(@ErrorMessage, @ErrorSeverity, @ErrorState)
-- Use RAISERROR inside the CATCH block to return error
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
请记住,如果您需要向应用程序报告异常(如c#中的catch (SQLException ex)),您的SPROC catch块将需要重新抛出(RAISERROR)异常,并确保严重性级别> 10 TRY和RAISERROR在T-SQL
还要注意,如果您的事务被回滚,您的日志记录也会被回滚-最终没有日志条目…