Как я могу “отсоединить” SqlDataReader от его объекта SqlConnection?

У меня есть метод ("GetDataReader", давайте назовем его), который возвращает SqlDataReader. Именно в классе Singleton DataFactory поддерживает постоянное соединение к базе данных.

Проблема с этим состоит в том, что, будучи возвращенным, DataReader все еще "подключен" к объекту Соединения в моем DataFactory. Так, я должен удостовериться код, который звонит, GetDataReader затем звонит Близко () на DataReader, который возвращается, иначе, он "блокирует" Соединение с этим:

Уже существует открыть DataReader, связанный с этой Командой, которая должна быть закрыта сначала.

Как я могу "отсоединить" DataReader, прежде чем я передам его обратно от GetDataReader? Или это или клон это и передает клон обратно? Я не хочу должным быть заставлять код вызова всегда явно закрыть его.

Здесь должна быть лучшая практика.

Обновление:

Спасибо все для Вашего входа. Нижняя строка - то, что я должен потерять привычку к использованию DataReaders и переключиться на DataTables. Они намного более управляемы.

Кроме того, благодарит за примечание по организации пула подключений. Я знал об этом, но просто не соединил два и два и понял, что изобретал велосипед.

6
задан Deane 18 January 2010 в 19:28
поделиться

4 ответа

DataReader должен оставаться подключенным к БД, пока вам больше не нужна - это природа использования DataReader, чтобы вы не можете «отсоединить их как таковые». Когда вы закончите с помощью чтения данных, вы должны закрыть его ( .Close () ), но тогда вы не можете использовать его больше.

от .NET 2.0 включен, если вы используете SQL 2005 или более позднюю версию, вы можете использовать Марс (несколько активных наборов результатов), как объяснено здесь . Это позволяет использовать одно соединение для нескольких устройств считывателей данных и просто включает в себя изменение в строку подключения. Тем не менее, Sqldatareaders не идеально подходит для передачи вашего кода так, как будто вы хотите.

В качестве альтернативы (который, как я думаю, вам нужно сделать), вы можете использовать отключенные результаты, имеющие место, где находится набор данных. Вы используете SQLDataAdapter для заполнения набора данных / DataTable Все результаты запроса. Затем вы можете использовать соединение для любого другого назначения или закрыть соединение, и он не влияет на вашу память результатов. Вы можете передать ваши результаты по вашему коду без необходимости поддерживать открытое соединение с базой данных.

6
ответ дан 10 December 2019 в 02:47
поделиться

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

1
ответ дан 10 December 2019 в 02:47
поделиться

Не сохраняйте подключение к базе данных. Существует функция под названием «объединение соединений». Получить новое подключение не дорого.

-121--4321171-

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

-121--4321172-

Я думаю, что вы можете перепутать свои наборы данных (отключенные встроенные данные) и хранилища данных (без данных). DataReader без SqlCnnection - это... Уммм... просто Читатель, то есть нет данных; -)

Я думаю, что ваша проблема еще выше в вашей линии мышления. Полагаю, ты старый школьный программист, который все делал вручную. В «управляемом» мире точечной сети многие вещи управляются для вас; ADO.NET уже существует эффективная система объединения данных, ведение собственного пула не требуется.

- Oisin

0
ответ дан 10 December 2019 в 02:47
поделиться

Не сохраняйте соединение с БД. Существует функция, называемая "пул соединений". Получить свежее соединение не дорого.

2
ответ дан 10 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: