none
error al momento de eliminar una linea RRS feed

  • Pregunta

  • buenos dias tengo un error que me salta cada vez que intento eliminar una linea de la tabla el cual es que me dice que el tiempo se agotado y aparte sale que hay muchas conexiones ala vez  no lo soporta  pongo el codigo aver si esta mal mi codigo  o es que llamo mucho a esa variable 
        foreach (string idp in variables.listaIdsPedidos.ToList())
                            {
                                string pathToDelete = P.combi(idp, variables.ruta);
                                if (Directory.Exists(pathToDelete))
                                {
                                 Directory.Delete(pathToDelete, true);
                                 variables.ultimoborrado = pathToDelete;
                                }
                              //P.pedidosborrados(idp);
                        //P.pedidosborrados2(idp);
                            }

        public void pedidosborrados(string id)
            {
                SqlConnection con = new SqlConnection(CONN);
                SqlCommand comando = new SqlCommand();
                comando.Connection = con;
                comando.CommandText = @" DELETE FROM  tblinea_pedido WHERE  idpedido=@id";
                con.Open();    //Abrimos la conexion a nuestra base de datos
                comando.Parameters.Clear();
                comando.Parameters.AddWithValue("@id", id);
                comando.ExecuteNonQuery();
            }
           

          public void pedidosborrados2(string id)
            {
                SqlConnection con = new SqlConnection(CONN);
                SqlCommand comando = new SqlCommand();
                comando.Connection = con;
                comando.CommandText = @" DELETE FROM tbpedido WHERE idpedido=@id";
                con.Open();    //Abrimos la conexion a nuestra base de datos
                comando.Parameters.Clear();
                comando.Parameters.AddWithValue("@id", id);
                comando.ExecuteNonQuery();
            }

    jueves, 12 de noviembre de 2015 7:46

Respuestas

  • Aunque la solución es, efectivamente, cerrar la conexión, es bueno que comprendas lo que está sucediendo para que sepas por qué sale el error que sale.

    Lo que hace el sistema cada vez que llamas al Open del SqlConnection es que intenta sacar una conexión del Pool de conexiones, y si no hay ninguna, entonces añade una nueva. Cuando cierras la conexión, no se cierra de verdad, sino que se devuelve al pool, de tal manera que la siguiente vez que la abres la apertura es muy rápida porque no tiene que abrirla de verdad, sino que recupera del Pool la que ya estaba abierta.

    Como en tu caso no cerrabas las conexiones, nunca se devolvían al pool, sino que cada vez que la abrías se añadía una nueva conexión al pool. Esto funciona hasta que se agota el tamaño máximo del pool (que es del orden de unas 150 conexiones aproximadamente de manera predeterminada). Una vez agotado el número máximo, la siguiente vez que intentas abrir una conexión se queda el programa parado esperando a que se cierre una de las conexiones existentes, para tomarla del pool en ese momento. Como tu programa nunca las cierra, eventualmente se produce un error de TimeOut en el proceso que estaba a la espera, y ese es precisamente el error que estabas viendo.

    • Propuesto como respuesta Sergio Parra jueves, 12 de noviembre de 2015 11:06
    • Marcado como respuesta carlos carpio2 jueves, 12 de noviembre de 2015 11:17
    jueves, 12 de noviembre de 2015 11:04
  • con.close(); ?

    el objeto conexion deberia destruirse, pero la conexion puede ser persistente en la BBDD , yo cerraria la conexion una vez usada.

    • Marcado como respuesta carlos carpio2 jueves, 12 de noviembre de 2015 11:17
    jueves, 12 de noviembre de 2015 8:58
  • Para complementar lo dicho por Alberto, te recomiendo emplees los bloques using(){} para asegurar que la conexión se cierra y se devuelve al pool de conexiones.

    Te paso un ejemplo sobre tu código para que veas cómo se hace

    public void pedidosborrados(string id)
    {
    	using(SqlConnection con = new SqlConnection(CONN))
    	{
    		using(SqlCommand comando = new SqlCommand())
    		{
    			comando.Connection = con;
    			comando.CommandText = @" DELETE FROM  tblinea_pedido WHERE  idpedido=@id";
    			con.Open();    //Abrimos la conexion a nuestra base de datos
    			comando.Parameters.Clear();
    			comando.Parameters.AddWithValue("@id", id);
    			comando.ExecuteNonQuery();
    			
    			// en principio no haría falta ya que cuando la ejecución 
    			// sale del bloque using(), la conexión se cierra
    			con.Close(); 
    		}
    	}
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta carlos carpio2 jueves, 12 de noviembre de 2015 11:17
    jueves, 12 de noviembre de 2015 11:09

Todas las respuestas

  • con.close(); ?

    el objeto conexion deberia destruirse, pero la conexion puede ser persistente en la BBDD , yo cerraria la conexion una vez usada.

    • Marcado como respuesta carlos carpio2 jueves, 12 de noviembre de 2015 11:17
    jueves, 12 de noviembre de 2015 8:58
  • muchas gracias eso harea aver si el problema se soluciona asi  esto era lo que salia 
    An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll

    Additional information: Valor de tiempo de espera caducado. El período de tiempo de espera expiró antes de obtener una conexión del grupo. Esto puede suceder porque todas las conexiones de la agrupación estaban en uso y se alcanzó el máximo tamaño del grupo.
    jueves, 12 de noviembre de 2015 9:35
  • Aunque la solución es, efectivamente, cerrar la conexión, es bueno que comprendas lo que está sucediendo para que sepas por qué sale el error que sale.

    Lo que hace el sistema cada vez que llamas al Open del SqlConnection es que intenta sacar una conexión del Pool de conexiones, y si no hay ninguna, entonces añade una nueva. Cuando cierras la conexión, no se cierra de verdad, sino que se devuelve al pool, de tal manera que la siguiente vez que la abres la apertura es muy rápida porque no tiene que abrirla de verdad, sino que recupera del Pool la que ya estaba abierta.

    Como en tu caso no cerrabas las conexiones, nunca se devolvían al pool, sino que cada vez que la abrías se añadía una nueva conexión al pool. Esto funciona hasta que se agota el tamaño máximo del pool (que es del orden de unas 150 conexiones aproximadamente de manera predeterminada). Una vez agotado el número máximo, la siguiente vez que intentas abrir una conexión se queda el programa parado esperando a que se cierre una de las conexiones existentes, para tomarla del pool en ese momento. Como tu programa nunca las cierra, eventualmente se produce un error de TimeOut en el proceso que estaba a la espera, y ese es precisamente el error que estabas viendo.

    • Propuesto como respuesta Sergio Parra jueves, 12 de noviembre de 2015 11:06
    • Marcado como respuesta carlos carpio2 jueves, 12 de noviembre de 2015 11:17
    jueves, 12 de noviembre de 2015 11:04
  • Para complementar lo dicho por Alberto, te recomiendo emplees los bloques using(){} para asegurar que la conexión se cierra y se devuelve al pool de conexiones.

    Te paso un ejemplo sobre tu código para que veas cómo se hace

    public void pedidosborrados(string id)
    {
    	using(SqlConnection con = new SqlConnection(CONN))
    	{
    		using(SqlCommand comando = new SqlCommand())
    		{
    			comando.Connection = con;
    			comando.CommandText = @" DELETE FROM  tblinea_pedido WHERE  idpedido=@id";
    			con.Open();    //Abrimos la conexion a nuestra base de datos
    			comando.Parameters.Clear();
    			comando.Parameters.AddWithValue("@id", id);
    			comando.ExecuteNonQuery();
    			
    			// en principio no haría falta ya que cuando la ejecución 
    			// sale del bloque using(), la conexión se cierra
    			con.Close(); 
    		}
    	}
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta carlos carpio2 jueves, 12 de noviembre de 2015 11:17
    jueves, 12 de noviembre de 2015 11:09