У меня есть метод, который возвращает, можно ли открыть соединение.Получить причину ошибки SqlConnection
Однако в случае отказа мне необходимо уведомить пользователей о том, предоставили ли они плохие учетные данные или были проблемы с базой данных.
Текущий код:
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
Bad базы данных:
- Сообщение:
A network something or other
- Класс:
20
- Номер:
-1
- Состояние:
0
... Так что да, есть различия, но я не конечно, я могу положиться на эти цифры (и проверка строкового значения сообщения заставляет меня чувствовать, что мне нужно принять душ).
Согласно MSDN, то Number
свойства может быть кодом ошибки Win32 или код ошибки сервера, Class
обозначает серьезность и State
может дать различным кодам ошибок разных значений.
Есть ли лучший способ определить сбой соединения?
Хороший ответ, но это также должно обрабатывать такие вещи, как сетевые проблемы. – usr
@usr Я предполагаю, что в этих случаях возникает исключение IOException, правильно? – rene
Все SqlException. Для этого есть недокументированный код ошибки. – usr