Abortar conexión SQL SERVER desde .NET




En ocasiones, las consultas a base de datos quedan en ejecución o en espera ocupando recursos de los servidores SQL e incluso bloqueando la base de datos, por ello, es recomendable configurar el timeout para cada consulta según su tiempo de ejecución.


En el siguiente ejemplo se muestra como configurar el timeout a través de SqlCommand:

Try                                                                                         
{                                                                        
       //Consulta SQL                                                    
var sql = "SELECT * FROM USUARIO";                                       
//Conexión SQL                                                    
using (SqlConnection connection = new SqlConnection(connString))                
{                                                                 
              //Comando para ejecutar la consulta                               
              using (SqlCommand command = new SqlCommand(sql, connection))      
              {                                                                 
                        //Configuración del Timeout                             
                        command.CommandTimeout = 1; // En segundos                    
                        //Ejecución del comando                                       
                        SqlDataReader dataReader = command.ExecuteReader();           
               }                                                                
        }                                                                
}                                                                        
catch (Exception ex)                                                     
{                                                                        
     //Al generarse una excepción por exceder el timeout, automáticamente se cancela    la consulta a base de datos                               
}      

En el ejemplo anterior, se ha configurado el “CommandTimeout” en 1 segundo, si la consulta tarda más tiempo se generará una excepción y automáticamente se cancelará la consulta a nivel de aplicación y de base de datos. 

Para no dejar conexiones o consultas abiertas, es recomendable usar “using” que automáticamente, ejecuta las sentencias close y dispose.

Consideraciones:
·         Si se configura el CommandTimeout a 0, el timeout será infinito.  El tiempo de espera será el configurado en la base de datos (Generalmente 10 minutos).
·         En caso de no configurar el timeout, el valor por defecto es de 30 segundos.

Para cerrar físicamente la conexión a base de datos, se podría utilizar “ClearPool”, en el siguiente ejemplo se usa el comando dentro del catch para que cierre la conexión si se produce algún error en la aplicación.

catch (Exception ex)
{
      SqlConnection.ClearPool(connection);
}