Это нормальное (хотя и немного неудобное) поведение. Ожидается, что ExecuteReader выполнит команду sql, предоставленную в виде CommandText, и построит DbDataReader, который вы используете для обработки результатов.
Если команда не возвращает ни одну строку для чтения, это не то, что читатель должен предотвратить в любом случае. И поэтому не ожидается, что он проверяет, действительно ли ваша команда является оператором SELECT.
Подумайте, например, если вы передадите имя хранимой процедуры или если у вас есть несколько пакетов sql для выполнения. (INSERT, а затем SELECT)
Я думаю, что самая большая проблема здесь заключается в том, что вы разрешаете произвольную команду sql, введенную вашими пользователями, для достижения механизма базы данных. Очень большая дыра в безопасности. Вы должны, по крайней мере, выполнить некоторый анализ текста запроса перед отправкой кода в механизм базы данных.