2010-02-15 16 views
6

Estoy obteniendo un SqlException en los registros de la aplicación .NET 3.5, estoy buscando el número correspondiente (valor de la propiedad SqlException.Number).Cómo atrapar correctamente una SqlException: Se ha producido un error en el nivel de transporte

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 

También estoy consiguiendo error tales como:

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. 

¿Alguien sabe cómo atrapar adecuadamente esas excepciones? (también puede publicar su respuesta here)

Respuesta

5

Ese error en particular no proviene de sys.messages en SQL Server, ya que es un problema con la conexión. Entonces no tengo el número a mano.

TBH, lo mejor que debe hacer es asegurarse de que el número se escriba en el registro con la excepción, de esa manera, siempre tendrá el número y el mensaje uno al lado del otro en los registros. Puede que no responda a su pregunta actual, pero será lo mejor en mi humilde opinión. No solo SqlException.Number sino SqlException.ErrorCode también - en casos como este creo que .ErrorCode puede ser el que realmente necesita (no estoy seguro sin consultarlo).

4

No encontrará un número de error de SQL asociado para este: en pocas palabras, el error se produce porque hubo un problema al conectarse al servidor.

Como el código no se puede conectar a SQL Server, no tendrá un error de SQL para informar.

Desde el artículo de MSDN sobre SQLException.Number:

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

Para excepciones que no tienen un número de errores de SQL asociado, puede ser capaz de utilizar el código de error de Windows HRESULT que estará en la propiedad ErrorCode del objeto de excepción.

+0

¿Cuál es la forma "segura" de detectar este error? Estoy desarrollando una aplicación en Windows Azure, y este tipo de error debe ser detectado por la política de reintento. –

+0

Tendrá que analizar el mensaje de error para algo como 'Se ha producido un error de nivel de transporte al recibir los resultados del servidor' y decidir en consecuencia. – Oded

+3

Hum, eso es realmente feo. En particular, ni siquiera funciona en mi máquina que arroje un mensaje de error localizado (francés) ... –

2

Gente, por favor, examine la pila de excepciones reales antes de afirmar ciegamente que SqlException no tiene .Número simplemente porque alguna página MSDN tiene un texto repetitivo. .ErrorCode generalmente obtiene un único valor genérico (establecido por CTOR privado). Para este error patricular se puede ver la pila de excepciones aquí:

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

y si lo siguen verá que el código que se está preparando es llena en todo, pero es un poco complicado para rastrear Actuall número de error en el reflector .

De modo que, quien vea las cosas a continuación, publicará el número de error real (o números). Estos errores tienden a ser bastante raros y transitorios, y sería bueno tener números, ya que en el momento en que un servidor ve el error de conexión, es demasiado tarde para perseguir sus números.

Cuestiones relacionadas