Почему может произойти сбой IDbCommand.ExecuteReader () при успешном выполнении IDbCommand.ExecuteScalar ()? - PullRequest
0 голосов
/ 20 августа 2009

У меня есть некоторый код C #, который динамически генерирует SQL-запрос и выполняет его через IDbCommand.ExecuteScalar (). Это прекрасно работает; есть ровно один результат, который соответствует моему запросу в БД, и этот результат всегда возвращается.

Но совсем недавно, в качестве первого шага в рефакторинге для поддержки нескольких совпадений в БД, я заменил вызов ExecuteScalar () на один вызов ExecuteReader (). Все остальное в настройке и доступе к БД одинаково. Но возвращенный IDataReader не содержит данных и выдает исключения InvalidOperationException, когда я пытаюсь извлечь из него данные.

Я знаю, что данные все еще там; все работает нормально, когда я снова переключаюсь на ExecuteScalar (). Как это возможно?

Ответы [ 2 ]

1 голос
/ 20 августа 2009

Убедитесь, что вы вызываете метод Read () для IDataReader , который возвращается ExecuteReader(), прежде чем пытаться получить к нему доступ. Вызов Read() переведет читателя в первую (и только в вашем случае) строку набора результатов. Если вы не позвоните по номеру Read() до получения доступа к IDataReader, вы получите InvalidOperationException при попытке доступа к его данным - как вы испытываете.

0 голосов
/ 20 августа 2009

Это связано с тем, что несколько IDataReader открыты в одном соединении?

Поскольку вы не получите эту проблему с ExecuteScalar (), но как только вы начнете использовать ExecuteReader (), вы должны убедиться, что все предыдущие DataReader-ы на одном соединении закрыты (например, с помощью блока 'using')

Какое сообщение об ошибке вы получаете с InvalidOperationException?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...