【问题标题】:parsing SQLException errors in an ASP.NET (MVC) application?在 ASP.NET (MVC) 应用程序中解析 SQLException 错误?
【发布时间】:2010-11-28 04:00:07
【问题描述】:

虽然验证可以防止大多数SQL 错误,但有些情况根本无法防止。我可以想到其中的两个:某些列的唯一性和错误的外键:验证不能有效,因为在验证之后和插入数据库之前,其他方可以创建或删除一个对象。因此,(至少)有两个 SQL 错误会导致用户输入无效的消息。

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

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

编辑:

我应该提到我来自 RubyOnRails,方法是:假设数据库不存在:没有约束,没有 db 强制外键等。当我接近 ASP.NET MVC 时,我会喜欢摆脱 rails 的偏见,接受 db 确实存在的事实。

【问题讨论】:

    标签: asp.net sql sql-server validation exception


    【解决方案1】:

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

    您可以通过使用标识(数据库生成)主键列来避免插入时出现唯一约束 SQLexceptions。 SQL Server 将保证该值是唯一的。

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

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

    【讨论】:

    • 如果您不需要确保列是唯一的,那么第一个解决方案很好,但当然如果我问的是因为我需要避免重复名称。当您总是插入新的不相关的东西时,第二种解决方案很好,但是:比如说,有类别;您为选定的(从下拉/选择)类别创建一个项目,但同时该类别被删除。这种情况并不常见,但仍有可能。
    猜你喜欢
    • 2010-11-12
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多