First you must understand what ADO.NET is. It is an access layer between some data warehouse (not limited to the database) and your .NET application. In your case, to access the SQL Server information there is the ADO.NET layer that will do the intermediate between your bank and your application. The SQLCommand you cited is an ADO.NET architecture class that helps in this process.
The DataSet does not serve to access the database . DataSet abstracts these data from the outside of the framework when they are in memory, being independent of the data source . For example, when you make a request to the database:
SELECT * FROM PESSOAS WHERE PESSOAS.NAME LIKE 'COLETTA'
The database will process this SQL, and when it reaches the data access layer, it will store this information in memory, as an example in a DataSet or DataReader, according to the implementation.
With the DataSet structure, I can manipulate my data in memory with its DataTable and DataRelation, just like the relational structure of the databases. Example:
//criando o dataSet;
DataSet exemplo = new DataSet("EXEMPLO");
DataTable peopleTable = exemplo.Tables.Add("PESSOAS");
peopleTable.Columns.Add("Name", typeof(string));
Notice in this example that I created a table called PEOPLE with a column named Name. Now I can add records within this structure:
DataRow myRow = exemplo.Tables["PESSOAS"].NewRow();
myRow["Name"] = "COLETTA";
My example is really simple and would not be very useful, but the idea is to exemplify how the structure is created. By creating these structures, you could insert into your Sql Server database using SqlDataAdapter.Update(exemplo);