Ich muss speziell SQL Server-Timeout-Ausnahmen abfangen, damit sie unterschiedlich behandelt werden können. Ich weiß, dass ich die SqlException abfangen und dann überprüfen kann, ob die Nachrichtenzeichenfolge "Timeout" enthält, habe mich aber gefragt, ob es einen besseren Weg gibt, dies zu tun.
try
{
//some code
}
catch (SqlException ex)
{
if (ex.Message.Contains("Timeout"))
{
//handle timeout
}
else
{
throw;
}
}
c#
.net
sql-server
error-handling
brodie
quelle
quelle
Antworten:
Ich glaube, Sie überprüfen den Wert von ex.Number, um nach einer Zeitüberschreitung zu suchen. Wenn es -2 ist, haben Sie eine Zeitüberschreitungssituation.
-2 ist der Fehlercode für das Zeitlimit, der von DBNETLIB, dem MDAC-Treiber für SQL Server, zurückgegeben wird. Dies können Sie sehen, indem Sie Reflector herunterladen und unter System.Data.SqlClient.TdsEnums nach TIMEOUT_EXPIRED suchen.
Ihr Code würde lauten:
Code zum Nachweis eines Fehlers:
quelle
hier: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html
Sie können auch lesen, dass Thomas Weingartner schrieb:
...
quelle
Aktualisiert für c # 6:
Sehr einfach und schön anzusehen !!
quelle
Was ist der Wert für die SqlException.ErrorCode-Eigenschaft? Kannst du damit arbeiten?
Bei Zeitüberschreitungen kann es sich lohnen, den Code auf -2146232060 zu überprüfen .
Ich würde dies als statische Konstante in Ihrem Datencode einrichten.
quelle
Ich bin nicht sicher, aber wenn wir eine Zeitüberschreitung bei der Ausführung oder eine Befehlszeitüberschreitung haben Der Client sendet ein "ABORT" an SQL Server und gibt dann einfach die Abfrageverarbeitung auf. Es wird keine Transaktion zurückgesetzt, es werden keine Sperren freigegeben. Um dieses Problem zu lösen, entferne ich die Transaktion in der gespeicherten Prozedur und verwende die SQL-Transaktion in meinem .NET-Code, um die sqlException zu verwalten
quelle
Wenn ein Client ABORT sendet, werden keine Transaktionen zurückgesetzt. Um dieses Verhalten zu vermeiden, müssen wir SET_XACT_ABORT ON https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15 verwenden
quelle