【问题标题】:DataReader associated with this Command which must be closed first与此命令关联的必须先关闭的 DataReader
【发布时间】:2025-11-29 10:35:01
【问题描述】:

我收到以下错误;

“已经有一个打开的 DataReader 与此命令关联,必须先关闭。”

是因为我在 foreach 循环中使用了阅读器吗?或者问题可能是什么? 问候 BK

foreach( Apple a in listApple )
{


....
                   using (SmartSqlReader reader = Db.CurrentDb.ExecuteReader(sp))
                    {
                        while (reader.Read())
                        {
                            a.blablabla += reader.GetInt32("BLA_BLA_BLA"); 
                        }
                    }


.....

}

【问题讨论】:

  • 这是我的错误。我在深入调查中发现了它。我一直在使用 if(reader.Read()) 而不是 using 和 while 循环。都解决了。谢谢bk

标签: c# sql sqldatareader


【解决方案1】:

您是否已实现 SmartSqlReader 在处置时关闭?常规数据读取器实现 IDisposable 接口并从 Dispose 方法调用 Close。

如果你没有正确关闭它,它会一直占用 Command 对象,直到垃圾收集器找到读取器并清理它。

【讨论】:

    【解决方案2】:

    尝试以下方法:

    using (SmartSqlReader reader = Db.CurrentDb.ExecuteReader(sp))
     {
      while (reader.Read())
      {
       a.blablabla += reader.GetInt32("BLA_BLA_BLA"); 
      }
      reader.Close();
     }
    

    【讨论】:

    • 如果 using 块什么都不做,或者实际上 worse 没有意义,因为它 看起来 应该这样做什么...
    【解决方案3】:

    添加reader.Close()关闭SmartSqlReader

    【讨论】: