【问题标题】:How to handle SqlException [duplicate]如何处理 SqlException [重复]
【发布时间】:2013-03-16 14:25:52
【问题描述】:

我有一些 C# 中的 SQL 处理代码,在处理 UNION 子句时会抛出许多异常。我想检测正在抛出哪个特定异常以便相应地处理它。在测试我的应用程序时,会抛出以下两个错误:

我如何区分每一个并识别出哪一个被抛出?我不能简单地复制/粘贴错误消息并将其放在 if-statement 中,因为字段名称和架构并不总是相同。

try
 {
   adapter.Fill(dtResults);
 }
 catch (SqlException ex)
 {
 }

【问题讨论】:

    标签: c# .net sql sql-server database


    【解决方案1】:

    您捕获的 SqlException 包含丰富的信息,例如错误号。这允许您单独处理条件:

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.number.aspx

    【讨论】:

    • @DotNET:您应该提到(或 byranmac)该数字只是 first 异常的包装。您可以循环ex.Errors,如上面的链接所示。这可能是您在两个错误中得到相同数字的原因。
    【解决方案2】:

    在您的 catch 语句中,您可以使用:

       if (ex.ToLower.Contains("conversion failed")
           MessageBox.Show("Error: a conversion failed");
       if (ex.ToLower.Contains("multi-part identifier")
           MessageBox.Show("this is the other error!");
    

    只是解决此问题的众多方法中的一种:)

    【讨论】:

    • 不是一个好方法。现在您的代码不必要地依赖于语言(甚至可能依赖于 db-version,因为消息不是一成不变的)。
    • 这是我知道的唯一捕获特定错误的方法。我只是提供了一种替代方法来实现相同的结果——现在我意识到有更好的方法来做到这一点。回答问题也是一种学习体验。
    【解决方案3】:

    SqlException 有一个您可以检查的 Number 属性 (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.number.aspx)。

    详细看这个答案,好像是一样的:https://stackoverflow.com/a/6222003/1758762

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2021-04-22
      • 2021-10-23
      • 1970-01-01
      • 2015-06-07
      • 2016-05-26
      相关资源
      最近更新 更多