【发布时间】:2010-09-06 19:49:46
【问题描述】:
假设我有一个将一些数据插入到表中的存储过程。如果数据重复,则会导致 sql server 错误(因为我在某些列上有唯一索引),并且此错误会导致 SqlClient 中出现异常。我可以在存储过程中做什么来处理错误,这样我的数据访问代码中就不会产生异常?
【问题讨论】:
假设我有一个将一些数据插入到表中的存储过程。如果数据重复,则会导致 sql server 错误(因为我在某些列上有唯一索引),并且此错误会导致 SqlClient 中出现异常。我可以在存储过程中做什么来处理错误,这样我的数据访问代码中就不会产生异常?
【问题讨论】:
您可以在存储过程中使用TRY CATCH。
这将允许您使用 SQL Server 进行错误处理,而不会将错误暴露给调用代码。
当然,如果您的 CATCH 语句本身导致异常/错误,它们将暴露给客户端。
但是,您需要问自己是否真的不想知道此类错误 - 它们表明您的数据库/代码库中存在问题。
【讨论】:
当您创建唯一索引时,您可以告诉它静默忽略任何重复项:
CREATE UNIQUE INDEX UIX_YourTable
ON (SomeColumn) WITH IGNORE_DUP_KEY = ON
这是否是一个好主意由您决定。如果您有这样一个唯一索引,那么您尝试插入的任何重复项都不会导致异常,也不会被插入 - 它们只是默默地失败。
专业人士:也不例外
缺点:真的很难调试那些你挠头想知道为什么实际上没有将给定行插入到表中的情况,而且你没有异常,没有错误,什么都没有。 ...(事实上,我今天刚刚发生)
【讨论】:
我不想这么说,但这里的理想答案是不让存储过程导致错误,而是验证插入。或者更好的是,代码调用 sproc 只要求它处理有效数据。掩盖裂缝只会让事情变得更丑 - 它会故意引发异常(高于某个错误级别)。
【讨论】:
使用MERGE 代替 INSERT
【讨论】: