Есть много способов, которыми команда может пойти не так.
В конце концов, это метод Close для считывателя данных, который закрывает соединение при условии, что ничего не пошло не так прежде.
Если есть исключение, которое возникает внутри ExecuteReader или любого из его вызванных методов, до того, как фактический объект DataReader будет создан, то нет, соединение не будет закрыто.
В случае исключения я бы не стал доверять закрытию соединения.