This is often a topic of debate, when working with ADO.NET. We have to understand that one is not necessarily better than the other, and that each serves its purpose. The main concern should not be "which is better", but "which is better in the [current] situation".
The DataReader is a read-only, forward-only stream of data from the database. The data is retrieved as soon as it's available, which allows for better performance. The DataSet on the other hand, is an in-memory cache of the data, which will not allow us to inspect its data until all the results are retrieved. Here is a good article that demonstrates this difference: DataSet Vs. DataReader
When working with ASP.NET, I will use the DataReader 95% of the time, because of its quick, efficient access. The other 5% I'll use the DataSet, when I need to further manipulate the data that is returned. Again, it's easy to assume that because I use the DataReader more than the DataSet that it's better, but that's not the case. Take driving vs. walking, for example. You drive a car to the market because it's quick and easy, but would you take that same car to get the newspaper sitting out in your driveway? You could argue that one is better than the other, but both serve their purpose.
Here is a good article that explains when you should use one class over another:
Use DataReader or DataSet?