Yes, the connection must be open for reader to read. If you use the overlaod of ExecuteReader that takes a connection string then all you have to do is reader.Close(); and it will close the connection.
If you use the overload that takes a connection, then it is up to you to call connection.Close() after calling reader.Close() since you created the connection yourself.
So I almost always use the connectionstring overload as this is the safest easiest to use, all I have to remember is to close the reader.
The only time to use the overlaod that takes a connection is if you want to use the same connection for several tasks in a row before closing it.