O uso do MySQLConnection em C # não fecha corretamente
A conexão foi adicionada ao pool de conexões. Então eu fechei, mas ele ainda permaneceu fisicamente aberto. Com o parâmetro ConnectionString "Pooling = false" ou os métodos estáticos MySqlConnection.ClearPool (connection) e MySqlConnection.ClearAllPools, o problema pode ser evitado. Observe que o problema era que a conexão ainda estava ativa quando fechei o aplicativo. Mesmo que eu fechei. Portanto, ou eu não uso o pool de conexões ou limpo o pool específico antes de fechar a conexão e o problema é resolvido. Levarei um tempo para descobrir qual é a melhor solução no meu caso.
Obrigado a todos que responderam! Isso ajudou a entender melhor os conceitos de C # e aprendi muito com as informações úteis. :)
===
Problema original:Pesquisei há um tempo e não encontrei a solução para o meu problema: sou novo em C # e tento escrever uma classe para facilitar o MySql Connections. Meu problema é que, após abrir uma conexão e fechá-la. Ele ainda está aberto no banco de dados e é abortad
Estou usando a instrução 'using', é claro, mas a conexão ainda está aberta e é interrompida depois que eu saio do program
Aqui está a aparência do meu código:
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
}
}
}
O gerenciador de banco de dados da classe abre a conexão e a fecha quando descartada:
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);
//}
Então, eu verifiquei no depurador e o Dispose () - método é chamado e executa corretamente. o que estou perdendo? Existe algo que fiz errado ou mal entendido?
Qualquer ajuda é apreciada!
Saudações, Simon
P.S .: Apenas no caso, o DataReader () - método (versão atualizada):
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, tentei usar o retorno de rendimento:
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//...
}
E eu mudei o 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 da maneira que posso recuperar os dados, mas ainda tenho o mesmo problema: a conexão não está fechada corretamente. :