繁体   English   中英

获取SqlConnection失败的原因

[英]Get SqlConnection failure reason

我有一个方法,返回是否可以打开连接。

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

当前代码:

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

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

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

凭据错误

  • 消息: Login failed for user 'whatever'
  • 等级: 14
  • 编号: 18456
  • 州: 1

坏数据库

  • 消息: A network something or other
  • 等级: 20
  • 数量: -1
  • 州: 0

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

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

有没有更好的方法来确定连接失败?

Sql Server错误代码已记录在案 ,您绝对可以依赖它们!

由于Class属性映射到SQL Server报告的错误的严重性 ,您可以使用它来确定所需的操作。

从SQL Server严重性表中我们了解到:

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

您的方法可以返回状态代码,具体取决于用户是否可以修复严重性。 该类别中的哪些代码符合您的特定要求,但您可以想象如下:

    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上的数据库引擎错误 ,我们了解到State可能不是确定正确下一步的好选择:

可以在数据库引擎的代码中的多个点处引发一些错误消息。 例如,可以针对几种不同的条件引发1105错误。 引发错误的每个特定条件都会分配一个唯一的状态代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM