Reason for your DataReader? Same concept. The idea is to make each "layer" not care about the other. Keep ALL data access out of the business layer. So when you chance databases, you don't have to modify those libraries.
you use a DataTable? The DataTable isn't specific to any database or data store for that matter. It is a System.Data object, not a System.Data.SqlClient or whatever. What if you decided you wanted to save your data in an XML file instead of to a database? If you are using DataSets with datatables that represent the actual tables in your application, then you can use DataSet.WriteXml()
to save and load from XML files instead of databases.
This change ONLY happens in your data access (which, mind you, in your sample application there is ZERO method for deleting or updating data, only retrieving it. Very basic and almost never happens where you would select data and then not update it in some way). The actual business object doesn't care!