Ваша проблема в том, что вы пытаетесь использовать соединение, которое в данный момент используется SqlDataReader. Вы не можете сделать это. Когда вы используете SqlDataReader, вы должны закрыть его, прежде чем повторно использовать используемое соединение. Я предлагаю вам создавать разные соединения каждый раз, когда вы получаете доступ к БД (в любое время, не только с SqlDataReaders). Если у вас включен пул, то сама структура (или SqlServer?) Будет по возможности использовать соединения.
Если вам нужен последовательный доступ к БД, скажем, вы делаете выбор, затем другой выбор, а затем обновление, вы можете повторно использовать соединение (я имею в виду тот же экземпляр SqlConnection), но если вам нужен доступ к БД при чтении из SqlDataReader, вам понадобятся 2 разных соединения.
Конечно, вы должны иметь в виду проблемы параллелизма. Если вы используете транзакции, то некоторые записи могут быть заблокированы во время определенных операций, а когда вы используете SqlDataReader параллельно с другими запросами, вы должны установить уровень изоляции равным уровню, который не мешает остальным запросам.