в настоящее время вы используете DataReader, который предназначен только для чтения, «только курсор», прокручивает набор результатов и работает только при подключении к источнику данных.
Если вы измените свой ExecuteReader с помощью адаптера данных и набора данных Fill, вы получите объект DataSet / DataTable, который будет содержать все результаты и все еще может работать отключенным, после того как вы закроете соединение.
То, что вы хотите использовать, зависит от вашего реального варианта использования и потребностей, как правило, DataReader-ы быстрее, чем наборы данных, поэтому вы, возможно, уже используете самый быстрый доступный подход.