Frage

Ich muss SQL-Server-Timeout-Ausnahmen gezielt abfangen, damit sie anders behandelt werden können.Ich weiß, dass ich die SqlException abfangen und dann prüfen könnte, ob die Nachrichtenzeichenfolge „Timeout“ enthält, aber ich habe mich 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;
    }
}
War es hilfreich?

Lösung

Um nach einer Zeitüberschreitung zu suchen, überprüfen Sie meiner Meinung nach den Wert von ex.Number.Wenn es -2 ist, liegt eine Timeout-Situation vor.

-2 ist der Fehlercode für eine Zeitüberschreitung, der von DBNETLIB, dem MDAC-Treiber für SQL Server, zurückgegeben wird.Dies kann durch Herunterladen eingesehen werden Reflektor, und suchen Sie unter System.Data.SqlClient.TdsEnums nach TIMEOUT_EXPIRED.

Ihr Code würde lauten:

if (ex.Number == -2)
{
     //handle timeout
}

Code zum Nachweis des Fehlers:

try
{
    SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;");
    sql.Open();

    SqlCommand cmd = sql.CreateCommand();
    cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END";
    cmd.ExecuteNonQuery(); // This line will timeout.

    cmd.Dispose();
    sql.Close();
}
catch (SqlException ex)
{
    if (ex.Number == -2) {
        Console.WriteLine ("Timeout occurred");
    }
}

Andere Tipps

Hier: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html

Das können Sie auch lesen Thomas Weingartner schrieb:

Auszeit:SqlException.Number == -2 (Dies ist ein ADO.NET-Fehlercode)
Allgemeiner Netzwerkfehler:SqlException.Number == 11
Sackgasse:SqlException.Number == 1205 (Dies ist ein SQL Server-Fehlercode)

...

Wir behandeln den „Allgemeinen Netzwerkfehler“ auch als Timeout-Ausnahme.Es kommt nur in seltenen Fällen vor, z.B.wenn Ihre Aktualisierungs-/Einfüge-/Löschabfrage einen lang andauernden Auslöser auslöst.

Aktualisiert für c# 6:

    try
    {
        // some code
    }
    catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
    {
        // handle timeout
    }

Sehr schlicht und schön anzusehen!!

Was ist der Wert für die SqlException.ErrorCode-Eigenschaft?Kannst du damit arbeiten?

Bei Zeitüberschreitungen kann es sich lohnen, den Code zu überprüfen -2146232060.

Ich würde dies als statische Konstante in Ihrem Datencode einrichten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top