例外:已经有一个与此Connection关联的开放DataReader必须先关闭

时间:2011-03-26 03:19:44

标签: c# mysql

我有以下代码,我得到例外:

  

DataReader已关联,但必须先关闭此Connection

我正在使用Visual Studio 2010 / .Net 4.0和MySQL进行此项目。基本上我在尝试使用数据读取器执行其他任务时运行另一个SQL语句。我在第cmdInserttblProductFrance.ExecuteNonQuery();

时遇到异常
SQL = "Select * from tblProduct";

//Create Connection/Command/MySQLDataReader
MySqlConnection myConnection = new MySqlConnection(cf.GetConnectionString());
myConnection.Open();
MySqlCommand myCommand = new MySqlCommand(SQL, myConnection);
MySqlDataReader myReader = myCommand.ExecuteReader();
myCommand.Dispose();

if (myReader.HasRows)
{
    int i = 0;
    // Always call Read before accessing data.
    while (myReader.Read())
    {
        if (myReader["frProductid"].ToString() == "") //there is no productid exist for this item
        {
            strInsertSQL = "Insert Into tblProduct_temp (Productid) Values('this istest') ";
            MySqlCommand cmdInserttblProductFrance = new MySqlCommand(strInsertSQL, myConnection);
            cmdInserttblProductFrance.ExecuteNonQuery(); //<=====THIS LINE THROWS "C# mySQL There is already an open DataReader associated with this Connection which must be closed first."
        }
    }
}

8 个答案:

答案 0 :(得分:39)

您对DataReaderExecuteNonQuery使用相同的连接。这不受支持,according to MSDN

  

请注意,当DataReader打开时,Connection正在使用中   完全由DataReader提供。您无法执行任何命令   Connection,包括创建另一个DataReader,直到   原始DataReader已关闭。

2018年更新:指向MSDN

的链接

答案 1 :(得分:25)

始终始终将一次性对象放在using语句中。我无法看到你如何实例化你的DataReader,但你应该这样做:

using (Connection c = ...)
{
    using (DataReader dr = ...)
    {
        //Work with dr in here.
    }
}
//Now the connection and reader have been closed and disposed.

现在,为了回答您的问题,读者使用与您尝试ExecuteNonQuery的命令相同的连接。您需要使用单独的连接,因为DataReader会保持连接打开并根据需要读取数据。

答案 2 :(得分:9)

您正尝试在此读者已使用的SQL连接上插入(ExecuteNonQuery()):

while (myReader.Read())

首先读取列表中的所有值,关闭阅读器然后执行插入,或使用新的SQL连接。

答案 3 :(得分:1)

您遇到的问题是,您正在使用MySqlCommand读回数据时启动第二个DataReader。 MySQL连接器只允许一个并发查询。您需要将数据读入某个结构,然后关闭阅读器,然后处理数据。遗憾的是,如果您的处理涉及进一步的SQL查询,则无法处理数据。

答案 4 :(得分:1)

只需在您的连接字符串中使用MultipleActiveResultSets=True

答案 5 :(得分:0)

您必须先关闭其他条件的阅读器。

答案 6 :(得分:0)

如果未正确使用事务,也会发生此异常。就我而言,我将transaction.Commit()放在command.ExecuteReaderAsync()之后,并且直到调用reader.ReadAsync()才等待提交事务。正确的顺序:

  1. 创建交易。
  2. 创建阅读器。
  3. 读取数据。
  4. 提交交易。

答案 7 :(得分:0)

MultipleActiveResultSets=true添加到连接字符串的提供者部分 文件appsettings.json

中的示例
"ConnectionStrings": {
"EmployeeDBConnection": "server=(localdb)\\MSSQLLocalDB;database=YourDatabasename;Trusted_Connection=true;MultipleActiveResultSets=true"}