Как присваивается номер SqlException
SqlException имеет свойство Number.
Тогда есть это: http://msdn.microsoft.com/en-us/library/cc645603.aspx
и это: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
И, кажется, один или другой
ВОПРОС:
Как это решено, какой?
ПРИЧИНА ДЛЯ ЗАПРОСА:
Мне нужно поймать определенные исключения SqlException и решить, как с ними работать, основываясь на свойстве Number, но я не знаю, какой список мне следует посмотреть, когда мне кажется, что система использует сообщения от обоих, и я не знаю, по каким критериям используется для выбора.
Например:
- Номер 53 - из списка сообщений об ошибках сервера (существует на обоих)
- Номер 10054 - из списка сообщений об ошибках системы (существует на обоих)
- Номер -1 - из списка сообщений об ошибках сервера (существует только в списке серверов)
- Номер 121 - из списка сообщений об ошибках системы (существует на обоих) ......
2 ответа
Теория гласит, что это номер ошибки SQL, например. сторона сервера ERROR_NUMBER()
, Другими словами, первый список.
Однако есть ряд исключений, о которых сообщает SqlClient, которые происходят на стороне клиента, а не на стороне сервера. Типичным примером может служить ошибка, например, сбой подключения к серверу, поскольку вы не подключились, и об ошибке на стороне сервера говорить не приходится. Например, неверное имя сервера (не разрешается в DNS), в таких случаях InnerException
будет указывать на Win32Exception
с NativeErrorCode
ценность ERROR_BAD_NETPATH
, В этом случае 53, код системной ошибки ОС, будет сообщаться как номер ошибки SqlException.
В других случаях ошибка, сообщаемая SqlClient, является ошибкой сокета, как внезапное отключение. Опять же, об ошибке "на стороне сервера" говорить не приходится, и SqlException обернет InnerException типа SocketException
(подкласс Win32Error) с NativeErrorCode
одного из хорошо известных номеров ошибок WSA, таких как WSAECONNRESET
, В этом случае SqlException.ErrorNumber
будет 10054, но это 10054 из диапазона WSA, а не 10054 из диапазона ошибок SQL Server. Я знаю...
Так что ты должен делать? Убедитесь, что вы проверите InnerException
, если это Win32Exception
тогда ErrorNumber
исходит из системного кода ошибки (ошибка ОС). В противном случае это должен быть номер ошибки SQL Server.
Ох, и тогда есть -1
... Я думаю, что об этом сообщает сам SqlClient (например, некоторые внутренние ошибки состояния), но я не уверен.
Я бы посмотрел документацию для свойства SqlException.Number.
Вот что говорит
Это оболочка для свойства Number первого SqlError в свойстве Errors. Дополнительные сведения об ошибках механизма SQL Server см. В электронной документации по SQL Server.