Pregunta

El siguiente código ejecuta un comando de inserción simple. Si se llama 2,000 veces consecutivas (para insertar 2,000 filas), una excepción OleDbException con el mensaje = " Recursos del sistema excedidos " es aventado. ¿Hay algo más que deba hacer para liberar recursos?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
¿Fue útil?

Solución

El error de los recursos del sistema superado no proviene del código administrado, sino que proviene de que está matando su base de datos (JET?)

Estás abriendo camino a muchas conexiones, a manera rápida ...

Algunos consejos:

  • Evite los viajes de ida y vuelta al no abrir una nueva conexión para cada comando y realice las inserciones utilizando una sola conexión.
  • Asegúrese de que la agrupación de conexiones de la base de datos esté funcionando (no estoy seguro de que funcione con las conexiones OLEDB).
  • Considere usar una forma más optimizada para insertar los datos.

¿Has probado esto?

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}

Otros consejos

Probé este código con una base de datos de Access 2007 sin excepciones (fui tan alto como 13000 inserciones).

Sin embargo, lo que noté es que es terriblemente lento ya que estás creando una conexión cada vez. Si pones el " utilizando (conexión) " Fuera del bucle, va mucho más rápido.

Además de lo anterior (se conecta a la base de datos solo una vez), también me gustaría asegurarme de que está cerrando y eliminando sus conexiones. Como la mayoría de los objetos en c # se gestionan en la memoria, las conexiones y los flujos no siempre tienen este lujo, por lo que si no se eliminan objetos como este, no se garantiza que se limpien. Esto tiene el efecto adicional de dejar esa conexión abierta durante la vida útil de su programa.

También, si es posible, buscaría usar Transacciones. No puedo saber para qué está usando este código, pero OleDbTransactions es útil cuando inserta y actualiza muchas filas en una base de datos.

No estoy seguro de los detalles, pero me he encontrado con un problema similar. Utilizamos una base de datos de Access con IIS para servir a nuestros clientes. No tenemos muchos clientes, pero hay muchas conexiones que se abren y cierran durante una sola sesión. Después de aproximadamente una semana de trabajo, recibimos el mismo error y todos los intentos de conexión fallan. Para corregir el problema, todo lo que tuvimos que hacer fue reiniciar los procesos de trabajo.

Después de algunas investigaciones, descubrí (por supuesto) que Access no funciona bien en este entorno. Los recursos no se liberan correctamente y, con el tiempo, el ejecutable se agotará. Para resolver este problema, vamos a pasar a una base de datos Oracle. Si esto no soluciona el problema, lo mantendré informado sobre mis conclusiones.

Esto podría estar ocurriendo porque no está desechando el objeto de Conexión y Comando creado. Siempre desecha el objeto al final.

OledbCommand.Dispose();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top