Pregunta

Necesito detectar específicamente las excepciones de tiempo de espera del servidor SQL para que puedan manejarse de manera diferente.Sé que podría detectar SqlException y luego verificar si la cadena del mensaje contiene "Tiempo de espera", pero me preguntaba si hay una mejor manera de hacerlo.

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

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}
¿Fue útil?

Solución

Para verificar el tiempo de espera, creo que debes verificar el valor de ex.Number.Si es -2, entonces tienes una situación de tiempo de espera.

-2 es el código de error de tiempo de espera, devuelto por DBNETLIB, el controlador MDAC para SQL Server.Esto se puede ver descargando Reflector, y busque en System.Data.SqlClient.TdsEnums TIMEOUT_EXPIRED.

Su código diría:

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

Código para demostrar el fracaso:

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

Otros consejos

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

Puedes leer también que Thomas Weingartner escribió:

Se acabó el tiempo:SqlException.Number == -2 (Este es un código de error de ADO.NET)
Error general de red:SqlException.Número == 11
Punto muerto:SqlException.Number == 1205 (Este es un código de error de SQL Server)

...

También manejamos el "Error general de red" como una excepción de tiempo de espera.Sólo ocurre en circunstancias excepcionales, p.cuando su consulta de actualización/inserción/eliminación generará un activador de larga duración.

Actualizado para c# 6:

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

¡¡Muy simple y agradable de ver!!

¿Cuál es el valor de la propiedad SqlException.ErrorCode?¿Puedes trabajar con eso?

Al tener tiempos de espera, puede valer la pena verificar el código para -2146232060.

Configuraría esto como una constante estática en su código de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top