AJ:
I see that some others have answered the question already but I'll throw in
my two cents. For a DataReader object to be of ANY Value, it must operate
in the context of a database command and an open and avaliable connection.
I know - by virtue of the fact you can't declare a "new" dataReader, this is
necessarily so physically, but even logically, there's NOTHING that you
could do with a datareader if you didn't have a command associated with it
and that command having a connection. A dataTable for instance, doesn't
need a Command to be valid. A DataAdapter could similarly be used for more
than one purpose, but a DataReader can only be used to iterate through some
data forward only and to that end, having it only come to life via an
ExecuteReader is logically a pretty sensible thing.
The main methods you'll be concerned with are .Read(),NextResult() and the
GetXXX. I see there's a link provided by one of the other respondents so I
won't elaborate too much here. If you have any questions though getting one
working, please let me know and I'll do waht I can to get you through it.