1
5
我们不在数据库中执行业务逻辑,但我们有所有的验证服务器端,低级DB CRUD操作与高级业务逻辑和控制器代码分离。
我们试图在内部做的是传递一个验证对象,其中包含如下函数
这可以很容易地在客户端进行处理,以显示与单个字段以及常规消息相关的消息。
|
2
3
正当 我认为2和3的组合可能是最好的选择。 通过预防错误,您可以创建一组过程,这些过程可以从面向UI的代码中调用,以向用户提供详细的特定于实现的反馈。您不一定需要逐个字段地使用ajax来实现这一点,但您可以这样做。 数据库中的唯一约束和其他规则随后成为所有数据的最终健全性检查,并且可以假设数据在发送之前是良好的,并理所当然地抛出异常(前提是这些过程应始终使用有效数据调用,因此无效数据是一种例外情况)。 |
3
2
为了防御#4,SQL Server预定义了一个相当有序的错误严重性级别层次结构。正如您所指出的,在逻辑所在的地方处理错误是很好的,因此我倾向于按照SP和UI抽象之间的约定来处理这个问题,而不是添加一些额外的耦合。尤其是因为可以同时使用值和字符串引发错误。 |
4
1
|
5
1
存储过程可以使用RAISERROR语句向调用方返回错误信息。这可以通过允许用户界面决定错误将如何出现的方式使用,同时允许存储过程提供错误的详细信息。 RAISERROR可以用 msg_id ,严重性和状态,并带有一组错误参数。当以这种方式使用时,具有给定 必须已使用sp_addmessage系统存储过程输入数据库。这 msg_id 可以作为SqlException中的ErrorNumber属性检索,该属性将在调用存储过程的.NET代码中引发。然后,用户界面可以决定显示何种消息或其他指示。 错误参数被替换到生成的错误消息中,类似于 printf RAISERROR也可以用于存储过程中的TRY CATCH块中。这将允许您捕获重复密钥错误,并将其替换为您自己的错误号,即代码中的“插入时重复密钥”,并且它可以包含实际的密钥值。您的UI可以使用它显示“订单号已存在”,其中“x”是提供的键值。 |
6
1
这就是我做事的方式,尽管这对你来说可能不是最好的:
对于我(在我的环境中),检查中间(业务对象)层中的大多数错误是有意义的。这是所有其他特定于业务的逻辑发生的地方,因此我也尽量在这里保留其余的逻辑。我认为数据库是保存对象的地方。 当涉及到验证时,最容易的错误可能会出现在javascript中(格式、字段长度等),当然,您永远不会假设发生了这些错误检查。这些错误也会在更安全、更可控的服务器端代码世界中得到检查。
因此,我的数据库只会保护自己不受简单的、以数据为中心的规则的影响,而这些规则是它能够很好地处理的;更多变量、面向业务的规则存在于对象的领域,而不是记录的领域。 |
user755806 · 从Rest服务返回JSON响应? 6 年前 |