2012-03-01 4 views
2

У меня появляется следующее сообщение об ошибке, и я использую petaPOCO. Почему у меня возникают это сообщение об ошибке и что я делаю не так, чтобы это сообщение:Не удается определить сообщение об ошибке

{"There is already an open DataReader associated with this Command which must be closed first."} 

This is what I have been able to copy for the exception message. 

System.InvalidOperationException был пойман сообщение = Существует уже открытая DataReader, связанные с этим Команда, которая должна быть закрыта первой. Источник = System.Data StackTrace: в System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute (SqlCommand команды) в System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute (метод String, SqlCommand команды) в System.Data.SqlClient. SqlCommand.ValidateCommand (метод String, Boolean асинхронной) на System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булевой returnStream, метод String, DbAsyncResult результат) на System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, метод String) в System.Data.SqlClient.SqlCommand.ExecuteScalar() в PetaPoco.Databas e.Insert (String TABLENAME, String primaryKeyName, Boolean Autoincrement, росо Object) в C: \ Dev \ Code \ API \ Models \ PetaPoco.cs: линия 1243 InnerException:

+1

показать код, в котором используется DataReader – Andy

+1

Используете ли вы метод db.Query? – patmortech

+0

, пожалуйста, добавьте некоторый логический код доступа к данным. –

ответ

4

Вот отличное объяснение, почему это возбуждается исключение:

http://blogs.msdn.com/b/spike/archive/2009/08/20/there-is-already-an-open-datareader-associated-with-this-command-which-must-be-closed-first-explained.aspx

вывод заключается в следующем:

поскольку SqlDataReader держит поток памяти (Resultset) доступный пока вы явно не закроете SqlDataReader вы можете получить это исключение, если вы попробуйте создать нового читателя, не закрывая предыдущий.

Alter свой код, чтобы иметь с помощью заявления всякий раз, когда вы создаете SqlDataReader:

SqlCommand cmd = new SqlCommand(sql, con); 
using (SqlDataReader rdr = cmd.ExecuteReader()) 
{ 
    while (rdr.Read()) 
    { 
    Console.WriteLine("cid: {0}, ctext: {1}", rdr[0].ToString(), rdr[1].ToString()); 
    } 
} 

Использование будет автоматически вызывать Dispose() (который закрывает считыватель), когда крышка (окончание}) достигается.

Если это исключение поднято в petaPOCO, тогда в их коде есть ошибка, или вы используете код неуказанным способом.

4

Ваш ORM (или ваш шаблон использования ORM) ожидает, что базовый поставщик ADO.NET позволит использовать несколько открытых DataReaders в одном соединении. Поставщик SQL Server, который вы, похоже, используете, может это сделать, но вы должны добавить MultipleActiveResultSets=True в строку подключения, которую вы используете для подключения к базе данных.

10

Я знаю, что это старо, но я хотел добавить что-то, что может помочь следующему человеку, ищущему это. Эта ошибка возникает, если вы используете метод Query. Метод Query не загружает все в памяти. Если вам нужно загрузить его, а затем закрыть соединение, вам нужно использовать Fetch.

Это с сайта:

Запрос против Fetch

Класс базы данных имеет два метода для извлечения записей запроса и Fetch. Они почти идентичны, кроме Fetch возвращает список <> POCO, тогда как Query использует возврат доходности для повторения результатов без загрузки всего набора в память.

Надеюсь, это поможет кому-то еще.

+0

спасибо, мне потребовался час, чтобы найти ваше решение –

+0

Спасибо, за подсказку. Ответ частично правильный с новым PetaPOCO. Думаю, теперь Fetch также вызывает Query. Лучшим способом исправить это будет вызов 'ToList()' или аналогичного метода, который будет извлекать полный набор данных и закрывать читателя. – Chandermani

0

Это исключение также может быть выбрано в PetaPoco, если ваш poco не имеет конструктора без параметров без видимой или открытой видимости.

Смежные вопросы