There are plenty alternatives and methods for filling a DataSet / Datatable. This one in particular is simple, easy and to the point. In often cases I usually hydrate custom objects for performance reasons, however for those times you need something done quick or perhaps dynamically, try filling a datable as follows: DataTable.Load(SqlDataReader)
Its syntactically easy, and using the DataReader objects makes its performance quite well to boot.
A quick note on this method that is not well known: calling DataTable.Load(SqlDataReader) will automatically advance the SqlDataReader to the next Result Set. For reading multiple result sets see: http://travisgosselin.com/blog/?p=30