Соединение было добавлено в пул соединений. Я закрыл его, но физически он все еще оставался открытым. С помощью параметра ConnectionString «Pooling = false» или статических методов MySqlConnection.ClearPool (connection) и MySqlConnection.ClearAllPools можно избежать проблемы. Обратите внимание, что проблема заключалась в том, что соединение было все еще живым, когда я закрыл приложение. Хоть и закрыл. Так что либо я не не использовать пул соединений вообще, или я очищаю конкретный пул перед закрытием соединения, и проблема решается. Я не тороплюсь, чтобы найти лучшее решение в моем случае.
Спасибо всем, кто ответил! Это помогло мне лучше понять концепции C #, и я многому научился из полезного материала. :)
===
Я долго искал и не нашел решения моей проблемы: Я новичок в C # и пытаюсь написать класс, чтобы упростить MySql Connections. Моя проблема в том, что после того, как я открываю соединение и закрываю его. Он все еще открыт в базе данных и прерывается.
Я, конечно, использую «оператор using», но соединение все еще открыто и прерывается после выхода из программы.
Вот как выглядит мой код например:
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
}
}
}
Менеджер баз данных класса открывает соединение и закрывает его при удалении:
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);
//}
Итак, я проверил его в отладчике, и метод Dispose () вызывается и выполняется правильно. Что мне не хватает? Я что-то сделал неправильно или неправильно понял?
Любая помощь приветствуется!
Приветствую, Саймон
PS: На всякий случай DataReader () - метод (обновленная версия):
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;
}
}
}
}
Хорошо, я попытался использовать yield return:
foreach (MySqlDataReader result in db.DataReader("SELECT * FROM module WHERE Active=1 ORDER BY Sequence ASC"))
{
//...
}
И я изменил 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;
}
}
}
}
Он работает так, как я могу получить данные, но у меня все еще есть та же проблема: соединение не закрывается должным образом. : (