Cómo atrapar excepciones de tiempo de espera de SQLServer

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

try { //some code } catch (SqlException ex) { if (ex.Message.Contains("Timeout")) { //handle timeout } else { throw; } } 

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

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

Tu código diría:

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

Código para demostrar la falla:

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

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

También puedes leer que Thomas Weingartner escribió:

Timeout: SqlException.Number == -2 (Este es un código de error ADO.NET)
Error general de red: SqlException.Number == 11
Deadlock: SqlException.Number == 1205 (Este es un código de error de SQL Server)

Manejamos el “Error general de red” como una excepción de tiempo de espera también. Solo ocurre en circunstancias excepcionales, por ejemplo, cuando su consulta de actualización / inserción / eliminación generará un desencadenante de ejecución prolongada.

¿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 .

Lo configuraría como una constante estática en tu código de datos.