c# - SQL Server 中的错误处理问题

标签 c# sql-server database

我正在使用 C# 和一个链接到 SQL Server Express 数据库中的存储过程的类型化数据集。在存储过程中,我使用 try catch 进行错误处理。

这是我的捕获 block :

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 会将错误信息以表格的形式返回,我如何识别返回的表格是充满数据还是包含错误信息?

编辑: 好的,所以我得到异常并重新抛出它?但为什么?我的意思是,如果我一开始没有捕获它,它就会冒泡到我的应用程序中,我可以在那里进行管理。那我为什么要使用 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# - SQL Server 中的错误处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330333/

相关文章:

mysql - 合并 SQL 中 Distinct、Count 和 Select 的概念

c# - 为什么 "as"运算符在 C# 中不使用隐式转换运算符?

c# - Postgresql 和 .Net - 具有多个端点的连接池

c# - PayPal Adaptive Payments - 通过 IPN/API 检索发件人的账单地址?

sql - 使用选项创建 View (maxrecursion)

c# - 在 SSIS 中将月份名称转换为月份编号

sql - SQL Server 中基于函数的索引

mysql - 如何加密mysql数据库中的数据?

database - Redshift 中的高效 ETL 更新插入

c# - 使用特殊分隔符将字符串转换为 double