如何确定出现SqlException的真实问题?

7

我希望在进行数据库操作时,能够针对不同的问题采取不同的处理方式。

例如,操作可能因为错误的数据库凭据或网络问题而失败。或者,如果在int类型列中传递了字符串值,则操作可能会失败,因为查询不正确。

在我的C#代码中,我们只有一个SqlException,其中包含了SqlErrors的集合。然而,有许多严重程度级别。

如何轻松地确定SqlException的原因?如何确定异常是由于连接问题、身份验证失败还是由于查询问题引起的?

我正在使用SQL Server 2005。


我也尝试寻找通用解决方案。我的目标是向最终用户呈现更加用户友好的错误信息。但是到目前为止,我还没有找到可行的解决方案。 - Uwe Keim
2个回答

10

尝试像这样做,这将帮助您处理不同的条件。

使用以下try catch块:

try    
{
  ...
  ...
}
catch (SqlException ex)
{
  switch (ex.Number) 
    { 
        case 4060: // Invalid Database 
                  ....
                  break;

        case 18456: // Login Failed 

                  ....

                  break;

        case 547: // ForeignKey Violation 

                  ....

                  break;

        case 2627: 
                // Unique Index/ Primary key Violation/ Constriant Violation 

                  ....

                  break;

        case 2601: // Unique Index/Constriant Violation 

                  ....

                  break;

        default: 

                  ....

                  break;    

       } 
}

2
你从哪里得到这些用于注释的具体数字?我需要类似于网络故障等其他原因的数字。 SQL中的系统消息表提供了数千条消息,所以对我来说不太方便。 - Learner
@CSharpLearner:我从各种来源(如博客和项目中早期的代码等)收到了这些错误消息。也许你可以从你的数据库中获取这些错误代码,尝试这个查询语句:“SELECT * FROM sysmessages”。 - JPReddy
1
这个答案应该提到SqlException.Number只是ex.Errors中的第一个异常的包装器。因此,您必须循环遍历该集合。 - Tim Schmelter

0

SQLException公开了属性Class,它应该为您提供严重级别。

更多信息在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接