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
  1. try catch是处理数据库错误的最好方法吗??

  2. 因为SQL Server将返回错误信息作为一个表,我如何识别如果返回的表充满了数据或它包含错误信息??

编辑: ok,所以我得到异常,我重新抛出它??但是为什么呢?我的意思是,如果我一开始没有抓住它,它会冒泡到我的应用程序中,我可以在那里管理它。所以我为什么要用try catch??

SQL Server中的错误处理问题

这个可以是处理存储过程中的错误的好方法,但是通常情况下您会这样做以将错误记录到表中:

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

还要注意,如果您的事务被回滚,您的日志记录也会被回滚-最终没有日志条目…