SQL Server中的错误处理问题

时间:2011-09-07 07:34:30

标签: c# sql-server database

我正在使用C#和一个类型化的数据集,该数据集链接到SQL Server Express数据库中的存储过程。在存储过程中,我使用try 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处理db ??

  2. 中错误的最佳方法
  3. 因为SQL Server会将错误信息作为表返回,如何识别返回的表是否已满数据还是包含错误信息?

  4. 编辑:好的,所以我得到了异常,我重新抛出它?但为什么?我的意思是,如果我没有在第一个地方抓住它,它将冒泡到我的应用程序,我可以在那里管理它。那我为什么要用try catch ??

4 个答案:

答案 0 :(得分:2)

请阅读本文Error Handling in SQL 2005 and Later 由SQL Server MVP的Erland Sommarskog编写。

答案 1 :(得分:1)

请记住,如果需要向应用程序报告异常(如在C#中的catch(SQLException ex)中),则SPROC catch块将需要重新抛出(RAISERROR)异常,并确保严重性级别是> 10 TRY and RAISERROR in T-SQL

答案 2 :(得分:1)

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

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中,这是使用RAISERRORdocs)命令实现的。

您的代码最终会看起来像:

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;

答案 3 :(得分:0)

另请注意,如果您的事务被回滚,您的日志记录也是如此 - 最终没有日志条目......