Inicio › Foros › Lenguajes de programación, desarrollo, código fuente › .Net C# VB y PowerShell › System.ObjectDisposedException No se puede obtener acceso al objeto desechado › Respuesta a: System.ObjectDisposedException No se puede obtener acceso al objeto desechado
El causante del problema puede ser el parámetro pooling=false de tu string de conexión. Cuando usas este parámetro a false estás indicando al motor de base de datos que cuando cierres la conexión con el servidor, en tu caso cuando haces:
conexionBD.Close();
Se cierra completamente, por lo que en la siguiente consulta has de volver a conectarte al servidor por completo y esto suele ser muy costoso. Si en todos tus procedimientos, como en el que nos has pasado de ejemplo, haces un:
conexionBD.Close();
y un
conexionBD.Open();
Por cada proceso de cada usuario que use tu aplicación y por cada procedimiento/función que internamente use la base de datos hará un close y un open, con el consiguiente consumo de recursos, pudiendo llegar a probar el error que nos comentas.
Puedes probar a cambiar el parámetro pooling a true, quedando tu código así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public void conectarBD() { if (conexionBD != null) conexionBD.Close(); string connStr = String.Format("server={0};port={1};user id={2}; password={3}; " + "database={4}; pooling=true;" + "Allow Zero Datetime=False;Convert Zero Datetime=True", this.servidor, this.puerto, this.usuario, this.contrasena, this.bd); try { conexionBD = new MySqlConnection(connStr); conexionBD.Open(); new EscribirLog("Conectado a servidor BD " + this.servidor + " [" + this.bd + "]", true); //Conectamos a la BD (catálogo) //conexionBD.ChangeDatabase(this.bd); } catch (MySqlException ex) { new EscribirLog("Error al conectar al servidor de BD " + this.servidor + " [" + this.bd + "] " + ex.Message, true); } catch (ObjectDisposedException ex) { new EscribirLog("Error al conectar al servidor de BD " + this.servidor + "[" + this.bd + "] " + ex.Message, true); } } |
Aunque deberías revisar el código para no hacer un close y open con cada consulta que ejecutas. Sería mucho más eficiente hacer un único open de la conexión durante una sesión.