【发布时间】:2020-01-09 00:33:11
【问题描述】:
错误信息: MySqlException
异常类型: MySql.Data.MySqlClient.MySqlException
错误位置:已经有与此 Connection 关联的打开的 DataReader,必须先关闭。
public static DataTable SelectMethod(string _select)
{
DataTable _dtsel = new DataTable("tab1");
try
{
ConOpen();
using (MySqlCommand cmd = new MySqlCommand(_select, con))
{
MySqlDataAdapter _mysel = new MySqlDataAdapter(cmd);
_mysel.Fill(_dtsel);
}
}
catch (Exception ex) { SendErrorToText(ex); }
return _dtsel;
}
public static DataTable SelectMethod(string _select)
{
DataTable _dtsel = new DataTable("tab1");
try
{
ConOpen();
using (MySqlCommand cmd = new MySqlCommand(_select, con))
{
MySqlDataAdapter _mysel = new MySqlDataAdapter(cmd);
_mysel.Fill(_dtsel);
}
}
catch (Exception ex) { SendErrorToText(ex); }
return _dtsel;
}
【问题讨论】:
-
你在哪里关闭了你的数据库连接?
-
通常
DataAdapters在内部使用 DataReader,因为数据读取器速度很快。问题是除非启用了 SQL Server MARS 或类似功能,否则连接只能打开一个数据读取器(我知道它是 mysql,我不知道 mysql 是否有 MARS 等效项)。您有一些代码正在使用 DataReader,但在阅读后忘记调用.Close()。 -
@er-sho 他不能关闭连接。他必须关闭打开的数据阅读器。
-
诸如此类的“数据助手”类的问题在于它们不能正确管理资源。
con是静态的,因为使用它的方法是静态的,这意味着任意数量的线程都在尝试竞争使用连接。 -
您似乎在多个方法或线程之间共享
con变量。这不受支持。每个请求都应该打开并使用自己的MySqlConnection。见mysqlconnector.net/troubleshooting/connection-reuse