A DataSet is like the bucket: it allows you to carry around a disconnected set of data and work with it - but you will incur the cost of carrying the bucket. Therefore, DataSet should be small.

A DataReader is like the hose: it provides one-way/once-only access to data as it flies past you. you don't have to carry all of the available water at once, but it needs to be connected to the tap/database.

And in the same way that you can fill a bucket with a hose, you can fill the DataSet with the DataReader.

It depends on your needs. One of the most important differences is that a DataReader will retain an open connection to your database until you're done with it while a DataSet will be an in-memory object.