c# oledbexception

c# - Se excedieron los recursos del sistema OleDbException



(5)

El siguiente código ejecuta un simple comando de inserción. Si se llama 2.000 veces consecutivamente (para insertar 2.000 filas), se lanza una OleDbException con el mensaje = "Excedidos los recursos del sistema". ¿Hay algo más que debería hacer para liberar recursos?

using (OleDbConnection conn = new OleDbConnection(connectionString)) using (OleDbCommand cmd = new OleDbCommand(commandText, conn)) { conn.Open(); cmd.ExecuteNonQuery(); }


Además de lo anterior (conectarse a la base de datos solo una vez), también me gustaría asegurarme de que está cerrando y desechando sus conexiones. Como la mayoría de los objetos en c # se administran en la memoria wrt, las conexiones y las transmisiones no tienen este lujo siempre, 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 de su programa.

Además, si es posible, analizaría el uso de Transacciones. No puedo decir para qué está usando este código, pero OleDbTransactions es útil al insertar y actualizar muchas filas en una base de datos.


Los recursos del sistema que se han excedido, el error no proviene del código administrado, sino que proviene de la muerte de su base de datos (JET?)

Estás abriendo camino a muchas conexiones, camino a rápido ...

Algunos consejos:

  • Evite viajes de ida y vuelta sin abrir una nueva conexión para cada comando y realice las inserciones con una sola conexión.
  • Asegúrese de que la agrupación de conexiones de la base de datos esté funcionando (no estoy seguro si eso funciona 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(); } } }


Probé este código con una base de datos de Access 2007 sin excepciones (llegué a 13000 inserciones).

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


No estoy seguro de los detalles, pero me encontré 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 abiertas y cerradas 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 teníamos que hacer era 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, nos moveremos a una base de datos Oracle. Si esto no soluciona el problema, lo mantendré informado sobre mis hallazgos.


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

OledbCommand.Dispose();