连接已添加到连接池中。所以我关闭它,但它仍然保持身体开放。使用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;
}
}
}
}
它以我可以检索数据的方式工作,但我仍然遇到同样的问题:连接未正确关闭。 :(
答案 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;
}
}
}