2010-02-15 3 views
6

Ich bekomme eine SqlException in den Protokollen von .NET 3.5 App, ich bin auf der Suche nach der entsprechenden Anzahl (Wert der Eigenschaft SqlException.Number).So fangen Sie richtig eine SqlException: Ein Transport-Level-Fehler ist aufgetreten

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 

Ich bin auch Fehler wie immer:

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. 

Wer weiß, wie richtig diese Ausnahmen zu fangen? (Sie können auch Ihre Antwort here)

Antwort

5

Dieser bestimmte Fehler stammt nicht von sys.messages in SQL Server - da es ein Problem mit der Verbindung ist. Also habe ich die Nummer nicht zur Hand.

TBH, die beste Sache, die Sie tun sollten, ist sicherzustellen, dass die Nummer in das Protokoll mit Ausnahme geschrieben wird - so haben Sie immer die Nummer und die Nachricht nebeneinander in den Protokollen. Kann deine aktuelle Frage nicht beantworten, aber es wird das Beste sein, vorwärts zu gehen IMHO. Nicht nur SqlException.Number, sondern SqlException.ErrorCode auch - in Fällen wie diesem denke ich .ErrorCode kann derjenige sein, den Sie tatsächlich brauchen (nicht sicher, ohne zu überprüfen).

4

Sie werden keine zugehörige SQL Error-Nummer für diese eine finden - einfach gesagt, der Fehler auftritt, weil ein Problem mit der Verbindung mit dem Server aufgetreten ist.

Da der Code keine Verbindung zu SQL Server herstellen kann, wird kein SQL-Fehler gemeldet.

Aus dem MSDN-Artikel über SQLException.Number:

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

Für Ausnahmen, die in der ErrorCode Eigenschaft wird nicht eine zugehörige SQL-Fehler-Nummer haben, können Sie in der Lage sein, die Fenster HRESULT Fehlercode zu verwenden, des Ausnahmeobjekts.

+0

Was ist der "sichere" Weg, um diesen Fehler dann zu erfassen? Ich entwickle eine App auf Windows Azure, und diese Art von Fehler sollte von der Wiederholungsrichtlinie abgefangen werden. –

+0

Sie müssen die Fehlermeldung für etwas wie 'Ein Transportebenenfehler ist aufgetreten beim Empfang von Ergebnissen vom Server' parsen und entsprechend entscheiden. – Oded

+3

Hum, das ist wirklich hässlich. Insbesondere funktioniert es nicht einmal auf meiner Maschine, die zufällig eine lokalisierte (französische) Fehlermeldung ausgibt ... –

2

Leute, überprüfen Sie bitte tatsächlichen Ausnahme-Stack vor blind behauptet, dass SqlException nicht .Number nur einige MSDN-Seite hat einen Textbaustein hat. .ErrorCode erhält normalerweise einen einzigen generischen Wert (durch den privaten CTOR gesetzt). Aus diesem patricular Fehler können Sie Ausnahme-Stack hier sehen:

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

und wenn Sie es folgen Sie sehen, dass der Code, der die Vorbereitung ist füllt alles ist, aber es ist ein bisschen gewunden Actuall Fehlernummer im Reflektor verfolgen .

Also, wer die Dinge als nächstes sieht, pleace post tatsächlichen Fehler Nummer (oder Zahlen). Diese Fehler sind eher selten und vorübergehend, und es wäre gut, Nummern zu haben, da zu der Zeit, wenn ein Server einen Schluckauf sieht, es zu spät ist, um seine Zahlen zu verfolgen.

Verwandte Themen