[英]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严重性表中我们了解到:
您的方法可以返回状态代码,具体取决于用户是否可以修复严重性。 该类别中的哪些代码符合您的特定要求,但您可以想象如下:
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.