在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显式关闭连接。”
看看使用这样的东西:
上述就是C#学习教程:在C#中使用MySQLConnection无法正常关闭分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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; } } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/986874.html