【问题标题】:How to prevent a stored proc error from throwing exception in SqlClient?如何防止存储过程错误在 SqlClient 中引发异常?
【发布时间】:2010-09-06 19:49:46
【问题描述】:

假设我有一个将一些数据插入到表中的存储过程。如果数据重复,则会导致 sql server 错误(因为我在某些列上有唯一索引),并且此错误会导致 SqlClient 中出现异常。我可以在存储过程中做什么来处理错误,这样我的数据访问代码中就不会产生异常?

【问题讨论】:

    标签: c# tsql ado.net


    【解决方案1】:

    您可以在存储过程中使用TRY CATCH

    这将允许您使用 SQL Server 进行错误处理,而不会将错误暴露给调用代码。

    当然,如果您的 CATCH 语句本身导致异常/错误,它们将暴露给客户端。

    但是,您需要问自己是否真的不想知道此类错误 - 它们表明您的数据库/代码库中存在问题。

    【讨论】:

      【解决方案2】:

      当您创建唯一索引时,您可以告诉它静默忽略任何重复项:

      CREATE UNIQUE INDEX UIX_YourTable
        ON (SomeColumn) WITH IGNORE_DUP_KEY = ON
      

      这是否是一个好主意由您决定。如果您有这样一个唯一索引,那么您尝试插入的任何重复项都不会导致异常,也不会被插入 - 它们只是默默地失败。

      专业人士:也不例外

      缺点:真的很难调试那些你挠头想知道为什么实际上没有将给定行插入到表中的情况,而且你没有异常,没有错误,什么都没有。 ...(事实上,我今天刚刚发生)

      【讨论】:

        【解决方案3】:

        我不想这么说,但这里的理想答案是不让存储过程导致错误,而是验证插入。或者更好的是,代码调用 sproc 只要求它处理有效数据。掩盖裂缝只会让事情变得更丑 - 它会故意引发异常(高于某个错误级别)。

        【讨论】:

        • 这是我的示例,说明何时不正确 - 我的表在一个字段上具有唯一约束。根据该字段的性质,客户端应用程序几乎总是会插入唯一值。但是偶尔它会尝试插入一个已经存在的值。因此,防止它的一种方法是每次在插入之前检查列中的这个值,这不是最佳的。让它抛出一个独特的约束错误并优雅地处理它要容易得多(对于实现和性能),因为它可能每 100,000 次插入就会发生一次
        【解决方案4】:

        使用MERGE 代替 INSERT

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-17
          • 1970-01-01
          • 2011-06-27
          • 2021-07-30
          • 2011-01-30
          • 2017-12-26
          相关资源
          最近更新 更多