Question

Je dois spécifiquement intercepter les exceptions de délai d'attente du serveur SQL afin qu'elles puissent être gérées différemment.Je sais que je pourrais intercepter l'exception SqlException, puis vérifier si la chaîne du message contient « Timeout », mais je me demandais s'il existe une meilleure façon de le faire ?

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}
Était-ce utile?

La solution

Pour vérifier un délai d'attente, je pense que vous vérifiez la valeur de ex.Number.Si c'est -2, alors vous avez une situation de timeout.

-2 est le code d'erreur de délai d'attente, renvoyé par DBNETLIB, le pilote MDAC pour SQL Server.Cela peut être vu en téléchargeant Réflecteur, et en recherchant sous System.Data.SqlClient.TdsEnums TIMEOUT_EXPIRED.

Votre code serait :

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

Code pour démontrer l'échec :

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");
    }
}

Autres conseils

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

Tu peux lire aussi ça Thomas Weingartner a écrit:

Temps mort:SqlException.Number == -2 (Il s'agit d'un code d'erreur ADO.NET)
Erreur réseau générale :SqlException.Number == 11
Impasse:SqlException.Number == 1205 (Il s'agit d'un code d'erreur SQL Server)

...

Nous traitons également "l'erreur réseau générale" comme une exception de délai d'attente.Cela ne se produit que dans de rares circonstances, par ex.lorsque votre requête de mise à jour/insertion/suppression déclenchera un déclencheur de longue durée.

Mis à jour pour c# 6 :

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

Très simple et agréable à regarder !!

Quelle est la valeur de la propriété SqlException.ErrorCode ?Pouvez-vous travailler avec ça ?

En cas de dépassement de délai, il peut être utile de vérifier le code pour -2146232060.

Je configurerais cela comme une const statique dans votre code de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top