获取 SqlConnection 失败原因

Get SqlConnection failure reason

我有一个方法returns是否可以打开连接。

但是,如果出现故障,我需要通知用户他们是否提供了错误的登录凭据或者数据库是否存在问题。

当前代码:

try 
{
    Database db = new SqlDatabase(connectionString);
    using(var connection = db.CreateConnection())
    {
        connection.Open();
        return true;
    }
}
catch (Exception ex)
{
    return false;
}

无论是凭据问题还是数据库问题,异常总是SqlException

但是,我注意到以下差异:

凭据错误:

数据库错误:

...所以是的,存在差异,但我不确定我是否可以依赖这些数字(并且检查消息的字符串值让我觉得我需要洗个澡)。

根据 MSDN,Number 属性 可以是 Win32 错误代码或服务器错误代码,Class 表示严重程度,State 可以给出不同的错误代码不同的意思。

有没有更好的判断连接失败的方法?

Sql 服务器错误代码是 documented,您绝对可以信赖它们!

作为 SQL 服务器报告的错误的 Class property maps to the Severity,您可以使用它来确定需要采取什么措施。

从 SQL 服务器严重性 table 我们了解到:

  • 11-16 指出用户可以更正的错误。
  • 14 表示与安全相关的错误,例如权限被拒绝。
  • 20 表示系统问题,属于致命错误...

您的方法可以 return 一个状态代码,具体取决于严重程度是否可以由用户修复。哪些代码属于该类别取决于您的具体要求,但您可以想象这样的事情:

    public enum Status
    {
        Success = 0,
        None,
        RetryUser,
        RetryInfra,
        Network,
        Boom,
        MAX
    }

    public Status ConnectionStatus()
    {
        Status status = Status.None;

        try
        {
            Database db = new SqlDatabase(connectionString);

            using (var connection = db.CreateConnection())
            {
                connection.Open();
                status = Status.Success;
            }
        }
        catch (SqlException ex)
        {
            switch (ex.Class)
            {
                case 11:
                case 12:
                case 13:
                case 14:
                    status = Status.RetryUser;
                    break;

                case 20:
                    status = Status.RetryInfra;
                    break;

                default:
                    status = Status.Boom;
                    break;
            }
        }

        return status;
    }

从 MSDN 的 Understanding Database Engine Errors 我们了解到 State 可能不是确定正确下一步的好候选者:

Some error messages can be raised at multiple points in the code for the Database Engine. For example, an 1105 error can be raised for several different conditions. Each specific condition that raises an error assigns a unique state code.