在我的存储过程中,当业务规则被破坏时,我会引发一个错误,该错误会冒泡到 C# 客户端应用程序并显示给用户。例如
RAISERROR('Hey, you cannot do that because blah blah blah', 16, 1);
我想将我引发的错误与其他 SQL Server 错误区分开来,因为我只想显示我的错误。
我认为这些是向客户端应用程序发送消息的唯一方法,这是要显示的用户消息:严重级别、状态、返回代码。但我认为我应该离开严重级别。
- 如何告诉我的客户端应用程序?
- 我应该使用什么尚未使用的代码或号码?
- 或者有没有我没有考虑过的另一种方式?
或者我应该这样做:
THROW 50000, 'Hey, you cannot do that!', 1;
编辑(2022 年 4 月 13 日) 我问 Erland Sommarskog,他的回答帮助我意识到,如果你使用这个
RAISERROR('Hey, you cannot do that because blah blah blah', 16, 1);
...然后客户端应用程序将始终获得 50000 作为错误号。使用 RAISERROR,您可以使用参数化消息。您只需要注意 RAISERROR 不会退出批处理。所以,对我来说,RAISERROR 赢了。
THROW
无论如何,您都应该使用,因为Microsoft 的文档有些不推荐RAISERROR
使用:根据上的文档
THROW
,该error_number
参数必须是大于或等于 50000 且小于或等于 2147483647 的数字。(前 49,999 个错误代码已保留用于本机 SQL Server 生成的错误。)如果您在客户端应用程序中使用 C#,那么当您的应用程序代码从 SQL Server 接收到异常时,该异常对象将被强制转换为一个
SQLException
对象。(System.Data.SqlException
对象,如果您仍在使用旧的程序集引用。)这将公开您抛出的自定义异常的所有属性,特别是该Number
属性将包含您的自定义错误代码。就个人而言,我喜欢为我在 SQL Server 实例中使用的每个用户定义的错误代码保留一个枚举集合。
如果您确实选择继续使用
RAISERROR
,您还可以考虑创建和使用您自己的用户定义的错误消息,sp_addmessage
以将实际消息重构为 SQL Server 中的自定义错误代码,以便您每次都可以引用相同的对象你抛出同样的异常。(虽然我个人以前从未使用过此功能。)但我个人建议坚持使用THROW
.