2009-09-14 98 views
0

尽管验证可以防止大多数SQL错误,但有些情况根本无法防止。我可以想到其中两个:一些列的唯一性和错误的外键:验证不能有效,因为一个对象可以在验证之后和db插入之前由其他方创建或删除。所以有(至少)两个SQL错误应该导致无效的用户输入消息。解析ASP.NET(MVC)应用程序中的SQLException错误?

SQLException有一个Number属性的错误类型,但我不知道如何找出哪列重复或哪个外键错误,而不尝试解析实际的错误消息文本,这恰好是本地化的。

除了解析错误信息(这意味着至少严格为SQL Server选择一种语言并始终使用它),是否有任何方法可以识别违规列?

编辑:

我要指出,我来自RubyOnRails,这里的做法是:让我们假设所有的数据库不存在:没有约束,没有DB-强制执行外键等。我m接近ASP.NET MVC,我想摆脱轨道的偏见,并接受数据库确实存在的事实。

回答

0

你确定这两种情况绝对不能防止吗?

通过使用Identity(数据库生成的)主键列,可以避免对Insert执行唯一约束SQLexception。 SQL Server将保证该值是唯一的。

将相关行插入到由外键链接的表中也是如此。在主表格中插入一行之前,首先在每个引用的表格中插入一行。使用IDENTITY_INSERT获取每个自动生成的主键的值,并将其用作主表中的外键。

您还应该将这些单独的语句包装在一个事务中,以确保所有表都能成功插入或不插入任何表。该事务还将这些更改与所有其他并发数据库访问隔离(隐藏),直到事务提交。

+0

如果您不需要确保某个列是唯一的,那么第一个解决方案很好,但是当然如果我问的是因为我需要避免重复的名称。第二种解决方案很好,当你总是插入新的不相关的东西时,但是:有,例如,类别;您为所选(从下拉/选择)类别创建一个项目,但与此同时该类别被删除。这不是一个常见的情况,但它仍然是可能的。 – giorgian 2009-09-14 20:55:30