【问题标题】:Handling Constraint SqlException in Asp.net在 Asp.net 中处理约束 SqlException
【发布时间】:2011-01-17 19:15:50
【问题描述】:

假设我有一个用户表,它与许多其他表创建了强关系(强制外键约束)。这样的订单表..

如果我们尝试删除带有某些订单的用户,则会出现 SqlException.. 我怎样才能捕捉到这个异常并正确处理它?

这就是策略吗?

1)先尝试delete动作,如果有异常发生处理呢?

2) 或者可能在删除操作之前使用经过改编的代码来确保后代记录在整个数据库中并根据..这项工作发出警报...

那该怎么做呢?

--编辑:

目标不是从数据库中删除记录!目标是通知用户该记录具有引用记录。我是否需要让 sql 执行删除命令并尝试捕获 SqlException?如果是,如何检测是REFERENCE约束SqlException?

或者 - 我是否需要编写一些代码来检测在删除命令之前是否有引用记录。最后一种方法给了我更多,但对每个实体实施这种验证很痛苦..

谢谢

【问题讨论】:

    标签: asp.net sql exception-handling


    【解决方案1】:

    您是否真的想要真正删除用户记录?相反,我建议在您的数据库中使用“已删除”标志,因此当您通过 UI“删除”用户时,它所做的只是更新该记录以将标志设置为 1。毕竟,您不会想要删除有订单等的用户。

    然后,您只需要在适当的区域支持此标志(即不要在 UI 中显示“已删除”的用户)。

    编辑:
    “...但只是为了概念,假设我确实想删除用户我该怎么做?”
    您需要先从引用该用户的其他表中删除记录,然后再删除用户记录(即先删除引用记录,然后删除引用记录) .但对我来说这没有意义,因为你会删除例如订单数据。

    编辑 2:
    “如果是,如何检测是 REFERENCE 约束 SqlException?”
    要检测此特定错误,您只需检查 SqlException.Number - 我认为对于此错误,您需要检查 547(这是 SQL 2005 上的错误号)。或者,如果使用 SQL 2005 及更高版本,您可以使用TRY...CATCH 支持完全在 SQL 中处理此错误:

    BEGIN TRY
        DELETE FROM User WHERE UserId = @MyUserId
    END TRY
    BEGIN CATCH
       IF (ERROR_NUMBER() = 547)
            BEGIN
                -- Foreign key constraint violation. Handle as you wish
            END
    END CATCH
    

    但是,我会按照您的建议亲自执行预检查,以保存异常。使用这样的 EXISTS 检查很容易完成:

    IF NOT EXISTS(SELECT * FROM [Orders] WHERE UserId=@YourUserId)
        BEGIN
            -- User is not referenced
        END
    

    如果有更多表引用用户,那么您还需要将这些表包括在检查中。

    【讨论】:

    • @AdaTheDev,感谢您的重播。你实际上是正确的用户场景..但只是为了这个概念,假设我确实想删除用户我该怎么做?
    • @AdaTheDev,我们的目标不是从数据库中删除它们!目标是通知用户该记录具有引用记录。我将编辑上面的问题..
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多