2010-02-17 43 views
1

假设我有一个用户表,它创建了很多附加表的强关系(强制外键约束)。这样的订单表..Asp.net中处理约束SqlException

如果我们试图用某些命令删除一个用户,那么会出现SqlException ..我怎样才能捕捉到这个异常并正确处理它?

这个策略究竟是什么?

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

2)或使用代码删除操作调整,以确保整个数据库,并警告该后代的记录根据。这件作品......

那么该怎么办呢,也许过吗?

- 编辑:

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

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

感谢

回答

1

你竟然真的实际删除用户记录?相反,我建议在你的数据库中有一个“已删除”标志,所以当你通过UI“删除”一个用户时,它所做的只是更新该记录以将标志设置为1.毕竟,你不想删除有订单等的用户。

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

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

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

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 [email protected]) 
    BEGIN 
     -- User is not referenced 
    END 

如果有引用用户更多的表,那么你还需要包括那些检查。

+0

@AdaTheDev,感谢您的重播。你实际上正确的用户场景..但只是为了这个概念,假设我想删除用户,我该怎么做? – ari 2010-02-17 13:15:06

+0

@AdaTheDev,目标不是从数据库中删除它们!目标是通知用户该记录具有引用记录。 我会编辑上面的问题.. – ari 2010-02-18 05:37:13