在Asp.net中处理约束SqlException

时间:2010-02-17 10:31:29

标签: asp.net sql exception-handling

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

如果我们尝试删除具有某些订单的用户,则会出现SqlException ..如何捕获此异常并对其进行正确处理?

这个策略是什么?

1)如果发生异常,首先尝试删除操作吗?

2)或者可能在删除操作之前使用适合的代码来确保整个数据库中的后代记录并根据...这项工作提醒...

那怎么办呢?

- 编辑:

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

你真的希望实际删除用户记录吗?相反,我建议你的数据库中有一个“删除”标志,所以当你通过用户界面“删除”用户时,它所做的就是更新该记录,将标志设置为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

如果有更多表引用用户,那么您还需要在支票中包含这些表。