2010-02-15 13 views
6

Ricevo un SqlException nei registri dell'app .NET 3.5, sto cercando il numero corrispondente (valore della proprietà SqlException.Number).Come rilevare correttamente un SqlException: Si è verificato un errore a livello di trasporto

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 

Inoltre sto ottenendo l'errore come ad esempio:

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. 

Qualcuno sa come catturare correttamente tali eccezioni? (puoi anche inviare la tua risposta here)

risposta

5

Questo particolare errore non viene da sys.messages in SQL Server, poiché si tratta di un problema con la connessione. Quindi non ho il numero da consegnare.

TBH, la cosa migliore da fare è assicurarsi che il numero sia scritto nel registro con l'eccezione - in questo modo, nei registri avrete sempre il numero e il messaggio affiancati. Potrebbe non rispondere alla tua domanda attuale, ma sarà la cosa migliore da fare. Non solo SqlException.Number ma anche SqlException.ErrorCode - in casi come questo penso che lo .ErrorCode potrebbe essere quello che effettivamente ti serve (non sono sicuro senza controllo).

4

Non troverai un numero di errore SQL associato per questo - semplicemente, l'errore si verifica perché c'è stato un problema con la connessione al server.

Poiché il codice non può connettersi a SQL Server, non presenterà un errore SQL da segnalare.

Dall'articolo di MSDN su SQLException.Number:

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

Per le eccezioni che non hanno un numero di SQL errore associato, si può essere in grado di utilizzare il codice di errore di Windows HRESULT che sarà nella proprietà ErrorCode dell'oggetto di eccezione.

+0

Qual è il modo "sicuro" per rilevare questo errore? Sto sviluppando un'applicazione su Windows Azure e questo tipo di errore dovrebbe essere rilevato dalla politica di riprova. –

+0

È necessario analizzare il messaggio di errore per qualcosa come "Si è verificato un errore di livello di trasporto quando si ricevono i risultati dal server' e si decide di conseguenza. – Oded

+3

Hum, è davvero brutto. In particolare, non funziona nemmeno sulla mia macchina che capita di lanciare un messaggio di errore localizzato (francese) ... –

2

Personalmente, si prega di esaminare lo stack di eccezioni effettivo prima di affermare ciecamente che SqlException non ha. Il numero solo che alcune pagine MSDN hanno un testo standard. .ErrorCode di solito ottiene un singolo valore generico (impostato da CTOR privato). Per questo errore patricular potete vedere eccezione di stack qui:

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

e se si segue vedrete che il codice che sta preparando è colma in ogni cosa, ma è un po 'contorto per tracciare actuall numero di errore in riflettore .

Quindi, chi vede le cose dopo invia il numero di errore effettivo (oi numeri). Questi errori tendono ad essere abbastanza rari e transitori e sarebbe bello avere dei numeri da quando un server vede la connessione di singhiozzo è troppo tardi per andare a inseguire i loro numeri.

Problemi correlati