DataReader, связанный с этой командой, который должен быть закрыт первым

Я получаю следующую ошибку;

«Уже есть открытый DataReader, связанный с этой командой, который необходимо сначала закрыть».

это потому, что я использовал читатель в цикле foreach? или в чем может быть проблема? С уважением БК

foreach( Apple a in listApple )
{


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


.....

}

person Bilgin Kılıç    schedule 22.10.2009    source источник
comment
это была моя ошибка. Я нашел это в глубоком расследовании. Я использую if(reader.Read()) вместо использования циклов with и wil. все решено. спасибо бк   -  person Bilgin Kılıç    schedule 22.10.2009


Ответы (3)


Попробуйте следующее:

using (SmartSqlReader reader = Db.CurrentDb.ExecuteReader(sp))
 {
  while (reader.Read())
  {
   a.blablabla += reader.GetInt32("BLA_BLA_BLA"); 
  }
  reader.Close();
 }
person Himadri    schedule 22.10.2009
comment
Бессмысленно иметь блок using там, если он ничего не делает, или на самом деле хуже чем бессмысленно, поскольку выглядит так, как будто он должен что-то делать... - person Guffa; 22.10.2009

Вы реализовали SmartSqlReader так, чтобы он закрывался при удалении? Обычные средства чтения данных реализуют интерфейс IDisposable и вызывают Close из метода Dispose.

Если вы не закроете его должным образом, он будет держать объект Command занятым до тех пор, пока сборщик мусора не найдет считыватель и не очистит его.

person Guffa    schedule 22.10.2009

Добавьте reader.Close(), чтобы закрыть SmartSqlReader

person Scoregraphic    schedule 22.10.2009