Как правильно перехватить SqlException: произошла ошибка транспортного уровня - PullRequest
6 голосов
/ 15 февраля 2010

Я получаю SqlException в журналах приложения .NET 3.5, я ищу соответствующий номер (значение свойства SqlException.Number).

System.Data.SqlClient.SqlException: A transport-level error has occurred 
when receiving results from the server. (provider: TCP Provider, error: 0 
- The specified network name is no longer available.) at
System.Data.SqlClient.SqlConnection.OnError

Я также получаю сообщение об ошибке, например:

System.Data.SqlClient.SqlException: A network-related or instance-specific error 
occurred while establishing a connection to SQL Server. The server was not found 
or was not accessible. Verify that the instance name is correct and that SQL Server
is configured to allow remote connections.

Кто-нибудь знает, как правильно отлавливать эти исключения? (Вы также можете опубликовать свой ответ здесь )

Ответы [ 3 ]

5 голосов
/ 15 февраля 2010

Эта конкретная ошибка не возникает из sys.messages в SQL Server - так как это проблема с соединением. Так что у меня нет номера под рукой.

TBH, лучшее, что вы должны сделать, это убедиться, что номер записан в журнал, за исключением - таким образом, вы всегда будете иметь номер и сообщение рядом в журналах. Возможно, не ответит на ваш текущий вопрос, но это будет лучший шаг вперед ИМХО. Не только SqlException.Number, но и SqlException.ErrorCode - в подобных случаях, я думаю, .ErrorCode может быть тем, что вам действительно нужно (не уверен, если не проверять).

4 голосов
/ 15 февраля 2010

Вы не найдете соответствующий номер ошибки SQL для этого - проще говоря, ошибка происходит из-за проблемы с подключением к серверу.

Поскольку код не может подключиться к SQL Server, он не будет иметь ошибки SQL для отчета.

Из статьи MSDN о SQLException.Number :

This number corresponds to an entry in the master.dbo.sysmessages table.

Для исключений, не связанных с номером ошибки SQL, вы можете использовать код ошибки Windows HRESULT, который будет находиться в свойстве ErrorCode объекта исключения.

2 голосов
/ 23 июля 2010

Ребята, пожалуйста, изучите фактический стек исключений, прежде чем вслепую утверждать, что SqlException не имеет .Number просто потому, что некоторые страницы MSDN содержат шаблонный текст. .ErrorCode обычно получает одно единственное универсальное значение (устанавливается частным CTOR). Для этой типичной ошибки вы можете увидеть здесь стек исключений:

http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/cb61ec85-c0d4-4a26-90e0-8c98cd28332f

и если вы последуете ей, вы увидите, что код, который готовится, заполняет все, но он немного запутан, чтобы отследить фактическое число ошибок в отражателе.

Так что, кто бы ни увидел вещи, которые будут дальше, отправьте фактический номер ошибки (или цифры). Эти ошибки, как правило, довольно редки и временны, и было бы хорошо иметь числа, так как в то время, когда сервер видит сбой соединения, уже слишком поздно, чтобы преследовать их числа.

...