在我的存储过程中,当业务规则被打破时,我会引发一个错误,该错误会弹出到C#客户端应用程序并显示给用户。例如:
RAISERROR('Hey, you cannot do that because blah blah blah', 16, 1);我希望区分我引发的错误和其他Server错误,因为我只希望显示我的错误。
我认为这是向客户端应用程序发送消息的唯一方法,这是要显示的用户消息:严重性级别、状态、返回代码。但我觉得我应该离开严重程度。
或者我应该这么做:
THROW 50000, 'Hey, you cannot do that!', 1; 编辑(13-4月-2022年)我问Erland Sommarskog,他的回答帮助我意识到如果你用这个
RAISERROR('Hey, you cannot do that because blah blah blah', 16, 1);客户端应用程序...then将始终获得50000作为错误号。使用RAISERROR,您可以使用参数化消息。您只需要知道RAISERROR不会退出批处理。所以,对我来说,瑞瑟尔赢了。
发布于 2022-04-04 12:11:31
无论如何,您应该使用THROW,因为微软的文档中有些不推荐使用RAISERROR:
RAISERROR语句不支持SET XACT_ABORT。新的应用程序应该使用抛出而不是RAISERROR。
根据THROW上的文档,error_number参数必须大于或等于50000,小于或等于2147483647。(前49 999个错误代码已为本机服务器生成的错误保留。)
如果在客户端应用程序中使用C#,那么当应用程序代码从Server接收到异常时,该异常对象将传递给SQLException对象。(如果仍然使用旧的程序集引用,则为System.Data.SqlException对象。)这将公开您抛出的自定义异常的所有属性,特别是Number属性将包含您的自定义错误代码。
就我个人而言,我喜欢为我在Server实例中使用的每个用户定义的错误代码保留一个Enum集合。
如果您确实选择继续使用RAISERROR,则还可以考虑使用sp_addmessage创建和使用自己的用户定义错误消息,以此将实际消息重构为Server中的自定义错误代码,以便每次抛出相同的异常时都可以引用相同的对象。(不过,我个人从未使用过这个特性。)但我个人建议坚持使用THROW。
https://dba.stackexchange.com/questions/310513
复制相似问题