从 .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 对象(SqlConnection
、SqlCommand
等)则不会。因此,如果您遇到异常,则要么是使用这些对象将消息转换为异常的额外代码,要么是正在使用的其他一些库/堆栈执行此操作。在//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 中的用户定义函数中“捕获”错误