First off, don't do it like that, it has multiple problems.
1) It is a lazy way to do it that potentially leaves you wide open to SQL Injection attack which can destroy your entire database. Always use Parameterized queries instead.
When you concatenate strings, you cause problems because SQL receives commands like:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;
Which SQL sees as three separate commands:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
A perfectly valid SELECT
DROP TABLE MyTable;
A perfectly valid "delete the table" command
And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.
So providing a method to read from the DB which accepts a SELECT string is just plain dangerous!
2) Because you create the SQLCommand object in a separate method, there is no guarantee that the Command is closed, nor the Connection - in fact your code doesn't close the Reader if it has no rows.
Creating the Command and Reader inline allows you to use
using
blocks to ensure that they are closed and disposed when they go out of scope - and that reduces the chances of problems later.
3) Which lead us to the next problem: because you share a Connection, if any part of your code "forgets" to close the Reader that returns, then the connection is permanently busy with it - and the next query attempt will fail because a reader is open on the connection and SQL won;t let you do that. Then you have to search your code looking any way that might leave a Reader open ...
4) Don't specify SEQUENTIAL_ACCESS unless you actually need it - in which case never, ever use SELECT * because that returns all columns whether you need them or not. Since sequential access is only for really, really big columns of data, why return columns you aren't going to use and waste all that bandwidth? Chances are that's causing the HasRows test to fail as well since you have to treat the data differently when you specify it.