Как присваивается номер 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.

Другие вопросы по тегам