在C#中使用MySQLConnection无法正常关闭

时间:2011-04-06 13:25:59

标签: c# mysqlconnection mysqldatareader

最终解决方案:

连接已添加到连接池中。所以我关闭它,但它仍然保持身体开放。使用ConnectionString参数“Pooling = false”或静态方法MySqlConnection.ClearPool(连接)和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()方法并正确执行。 我错过了什么?有什么我做错了或被误解了吗?

感谢任何帮助!

问候, 西蒙

P.S .: 以防万一,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;
                }
            }
        }
    }

它以我可以检索数据的方式工作,但我仍然遇到同样的问题:连接未正确关闭。 :(

4 个答案:

答案 0 :(得分:16)

我不确定mysqlconnection,但是sql server计数器部分使用连接池,当你调用close而不关闭它时它会关闭它而不会关闭它!

编辑:确保丢弃Reader,Command和Connection对象!

编辑:解决了ConnectionString参数“Pooling = false”或静态方法MySqlConnection.ClearPool(connection)和MySqlConnection.ClearAllPools()

答案 1 :(得分:5)

您还需要在using语句中包装Command和DataReader。

答案 2 :(得分:2)

根据mysql文档,MySQLConnection在超出范围时不会关闭。因此,您不得在使用中使用它。

...引用 &#34;如果MySqlConnection超出范围,则不会关闭。因此,您必须通过调用MySqlConnection.Close或MySqlConnection.Dispose显式关闭连接。&#34;

答案 3 :(得分:-1)

看看使用这样的东西:

private static IEnumerable<IDataRecord> SqlRetrieve(
    string ConnectionString, 
    string StoredProcName,
    Action<SqlCommand> AddParameters)
{
    using (var cn = new SqlConnection(ConnectionString))
    using (var cmd = new SqlCommand(StoredProcName, cn))
    {
        cn.Open();
        cmd.CommandType = CommandType.StoredProcedure;

        if (AddParameters != null)
        {
            AddParameters(cmd);
        }

        using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            while (rdr.Read())
                yield return rdr;
        }
    }
}