【问题标题】:There is already an open DataReader associated with this Connection which must be closed first. C# with mysql database已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它。 C# 与 mysql 数据库
【发布时间】: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

标签: c# mysql


【解决方案1】:

你必须关闭连接,这是连接必须关闭的地方

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); }
        finally
         {
          ConClose();
         }
        return _dtsel;
    }

  MysqlConnection conn = new MysqlConnection(connectionString);

  private void ConClose(){
  conn.Close();
  }

【讨论】:

  • 问题在于,在他没有包含在问题中的代码中,他打开了一个他没有关闭的 DataReader。这个答案可能不能解决问题,但对于关闭连接是一个很好的建议。附带说明一下,我通常更喜欢在 try-catch 的 finally 中关闭连接,因此如果引发异常,连接将关闭。
  • 上述方法很常见,在我所有的项目中都用for lop
【解决方案2】:

每次打开连接时都应该在执行查询后关闭连接,如下所示:

DataTable _dtsel = new DataTable("tab1");
try
{
    ConOpen();
    using (MySqlCommand cmd = new MySqlCommand(_select, con))
    {
         MySqlDataAdapter _mysel = new MySqlDataAdapter(cmd);
         _mysel.Fill(_dtsel);
         con.close();
    }
}
catch (Exception ex) { SendErrorToText(ex); }
return _dtsel;

【讨论】:

  • 上述方法在for循环中的使用
猜你喜欢
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2019-01-17
  • 2020-09-25
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多