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

最终解决方案

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

任何帮助表示赞赏!

问候,西蒙

PS:以防万一,DataReader() – 方法(更新版本):

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

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

我不确定mysqlconnection,但sql server计数器部分使用连接池,并且当你调用close而不关闭它而不是它将它放在连接池中!

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

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

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

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

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

看看使用这样的东西:

 private static IEnumerable SqlRetrieve( string ConnectionString, string StoredProcName, Action 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; } } }