从 .NET 中的 SQL Server 捕获 RAISERROR

Posted

技术标签:

【中文标题】从 .NET 中的 SQL Server 捕获 RAISERROR【英文标题】:Catch RAISERROR from SQL Server in .NET 【发布时间】:2022-01-09 20:09:25 【问题描述】:

我在 SQL Server 中有一个存储过程,只要遇到条件就会引发错误。为了捕获此错误并将其显示给用户,我使用

try 

   //code
 
catch (Exception e)

   return BadRequest(e.Message);

这会捕获大多数情况,但另一方面,此过程有一些print 消息也会被此Exception 捕获。有没有办法捕获仅从 RAISERROR 引发的异常并忽略来自 SQL Server 的 print 消息?

【问题讨论】:

PRINT 从不产生异常。可能发生的情况是,当引发具有高严重性的消息时,较早的低严重性PRINT 消息会滚动到错误中。您应该能够通过专门捕获SqlException 并使用Errors 属性来区分和过滤这些。可以想象,您还可以通过将事件处理程序连接到 SqlConnection.InfoMessage 来先发制人地过滤它们(免责声明:未经测试,由于缓冲,这可能不会做任何事情)。 print 来自 SQL Server 的消息不应生成异常,如果您仅使用 ADO.Net 对象(SqlConnectionSqlCommand 等)则不会。因此,如果您遇到异常,则要么是使用这些对象将消息转换为异常的额外代码,要么是正在使用的其他一些库/堆栈执行此操作。在//code 中我们都看不到。 看:***.com/a/22126876/5967360 这能回答你的问题吗? Need to get the SQL Server "PRINT" value in C# 您是否真的使用 RAISERROR 来立即“打印”消息? 【参考方案1】:

在命令执行期间生成的所有信息和错误消息都被缓冲并在捕获SqlException 时可用。 Message 属性包括所有信息消息的文本(打印语句和严重性小于 11 的错误)以及导致异常的警告/错误。

要忽略信息消息,请使用 SqlException 错误集合并仅处理严重性(SqlError.Class 属性)为 11 或更高的那些:

catch (SqlException e)

   var sb = new StringBuilder();
   foreach(var error in e.Errors)
   
       if(error.Class > 10) sb.AppendLine(error.message);
   
   return BadRequest(sb.ToString());

【讨论】:

以上是关于从 .NET 中的 SQL Server 捕获 RAISERROR的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 json 从 sql server ASP.net 中检索数据

从 SQL Server 2005 中的用户定义函数中“捕获”错误

无法从 R 中的 DF 更新 SQL Server 中的值

从 VB.NET 中的 SQL Server 中提取值

从 ASP.NET 中的 SQL Server 获取汇总/排序的数据

从 vb.net 中的 datetime sql server 类型操作日期和时间