数据库连接 - 在 C# 中使用 MySQLConnection 无法正确关闭
本文关键字:MySQLConnection 数据库连接 | 更新日期: 2023-09-27 17:48:54
我尝试编写一个类以使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;
}
}
}
}
它的工作方式是我可以检索数据,但我仍然遇到同样的问题:连接未正确关闭。
我不确定 mysqlconnection,但 sql 服务器计数器部分使用连接池,并且在调用 close 时不会关闭,而是将其放入连接池中!
编辑:确保释放读取器、命令和连接对象!
编辑:使用 ConnectionString 参数"Pooling=false"或静态方法 MySqlConnection.ClearPool(connection) 和 MySqlConnection.ClearAllPools() 解决
您还需要将 Command 和 DataReader 包装在 using
语句中。
根据 mysql 文档,MySQLConnection 在超出范围时不会关闭。因此,您不得在内部使用它。
报价。。。"如果MySqlConnection超出范围,它就不会关闭。因此,您必须通过调用 MySqlConnection.Close 或 MySqlConnection.Dispose 来显式关闭连接。
看看使用这样的东西:
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;
}
}
}