c# - with - Comment intercepter les exceptions de délai d'attente SQLServer




throw exception c# with message (2)

J'ai besoin d'intercepter les exceptions de dépassement de délai du serveur SQL afin qu'elles puissent être traitées différemment. Je sais que je pourrais attraper le SqlException et ensuite vérifier si la chaîne de message contient "Timeout", mais se demandait s'il y avait une meilleure façon de le faire?

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

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}

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

-2 est le code d'erreur pour timeout, renvoyé par DBNETLIB, le pilote MDAC pour SQL Server. Cela peut être vu en téléchargeant Reflector , et en regardant sous System.Data.SqlClient.TdsEnums pour 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");
    }
}

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

Lorsque vous avez des délais d'attente, il peut être utile de vérifier le code pour -2146232060 .

Je définirais cela comme un const statique dans votre code de données.







error-handling