Использование MySQLConnection в C # не закрывается должным образом

Окончательное решение:

Соединение было добавлено в пул соединений. Я закрыл его, но физически он все еще оставался открытым. С помощью параметра 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;
                }
            }
        }
    }

Он работает так, как я могу получить данные, но у меня все еще есть та же проблема: соединение не закрывается должным образом. : (

16
задан George Stocker 11 March 2013 в 16:00
поделиться