Solución final:
La conexión se agregó al grupo de conexiones. Así que lo cerré, pero aún así permaneció físicamente abierto. Con el parámetro ConnectionString "Pooling = false" o los métodos estáticos MySqlConnection.ClearPool (conexión) y MySqlConnection.ClearAllPools se puede evitar el problema. Tenga en cuenta que el problema era que la conexión todavía estaba activa cuando cerré la aplicación. Aunque lo cerré. Entonces, o no uso la agrupación de conexiones o borro el grupo específico antes de cerrar la conexión y el problema está resuelto. Me tomaré mi tiempo para averiguar cuál es la mejor solución en mi caso.El uso de MySQLConnection en C# no se cierra correctamente
Gracias a todos los que respondieron! Me ayudó a comprender mejor los conceptos de C# y aprendí mucho de la información útil. :)
===
problema original:
He buscado desde hace un tiempo y no he encontrado la solución para mi problema: Soy nuevo en C# y trato de escribir una clase para facilitar las conexiones de MySql. Mi problema es, después de abrir una conexión y cerrarla. Todavía está abierto en la base de datos y se cancela.
Estoy usando la 'utilización' de la declaración 'por supuesto, pero la conexión sigue abierta y se cancela después de que salga del programa.
Esto es lo que se ve mi código como:
using (DatabaseManager db = new DatabaseManager())
{
using (MySqlDataReader result = db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//Do stuff here
}
}
}
El gestor de base de datos de clase abre la conexión y la cierra cuando son desechados:
public DatabaseManager()
{
this.connectionString = new MySqlConnectionStringBuilder("Server=localhost;Database=businessplan;Uid=root;");
connect();
}
private bool connect()
{
bool returnValue = true;
connection = new MySqlConnection(connectionString.GetConnectionString(false));
connection.Open();
}
public void Dispose()
{
Dispose(true);
}
public void Dispose(bool disposing)
{
if (disposing)
{
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
connection.Dispose();
}
}
//GC.SuppressFinalize(this);//Updated
}
//Updated
//~DatabaseManager()
//{
// Dispose(false);
//}
Por lo tanto, he comprobado en el depurador y el Desechar () -method se llama y se ejecuta correctamente. ¿Qué me estoy perdiendo? ¿Hay algo que hice mal o mal entendido?
¡Se agradece cualquier ayuda!
Saludos, Simon
PS: Por si acaso, el DataReader() - Método (Versión actualizada):
public IEnumerable<IDataReader> DataReader(String query)
{
using (MySqlCommand com = new MySqlCommand())
{
com.Connection = connection;
com.CommandText = query;
using (MySqlDataReader result = com.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
{
while (result.Read())
{
yield return (IDataReader)result;
}
}
}
}
Ok, me trataron de usar el regreso rendimiento:
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//...
}
Y cambié el método DataReader:
public IEnumerable<IDataReader> DataReader(String query)
{
using (MySqlCommand com = new MySqlCommand())
{
com.Connection = connection;
com.CommandText = query;
using (MySqlDataReader result = com.ExecuteReader())
{
while (result.Read())
{
yield return (IDataReader)result;
}
}
}
}
Funciona en la forma en que puedo recuperar los datos, sin embargo, todavía tengo el mismo problema: La conexión no se cierra correctamente. :(
Como no tiene ningún recurso no administrado, no necesita un finalizador. – SLaks
Eso es verdad. Pero no está doliendo actualmente, ¿no es así? Corrígeme si estoy equivocado. El objetivo principal es cerrar las conexiones no utilizadas tan pronto como ya no sean necesarias. Este patrón parecía ser una forma fácil de lograr este objetivo. Lo implementé tal como se mostró en muchos ejemplos en la web. Eventualmente lo cambiaré para deshacerme del código redundante. – Skalli
Es un golpe de rendimiento, pero de lo contrario, no. – SLaks