ссылка

ательное решение:

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

Любая помощь приветствуется!

Привет, Саймон

П.С .: На всякий случай, 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;
                }
            }
        }
    }

Хорошо, я попытался использовать возвращение доходности:

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;
                }
            }
        }
    }

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

Ответы на вопрос(4)

Ваш ответ на вопрос