I started to read the book "Programming Microsoft ADO.NET 2.0 applications Advanced topics", and I want to share you with a short summary that I wrote.

DataSet:
Memory based relational representation of data (or cache data) without any transaction properties.
Typed DataSet comes to improve the regular DataSet to a stronger type (it gets the errors in a compile time, the VS IntelliSense helps to reduce incorrect spelling).
The creation is manually or by XSD (XML schema definition) file.
Serialization options:
- XML-based serialization: serialize to xml file
- With schema definition (XmlWriteMode.WriteSchema).
- With DataRowVersion information(XmlWriteMode.DiffGram)
- Binary-based serialization: serialize in binary format
- RemotingFormat= SerializationFormat.Binary: The serialize binary file contains pure binary data (it's called - TrueBinary). It's good for large objects (it's faster but it has overhead of long initial time).
- RemotingFormat= SerializationFormat.Xml: The serialize binary file contains embedded XML. It's good for small objects.
Command:
- ExecuteNonQuery method:
- We use this method only when we don't need any rows as an answer. We usually use this method in insert, update and delete statements. The return value, contains the number of updated rows.
- ExecteScalar method:
- We use this method only if we get one value as return value(like in count(…) function).
- In this method the .Net runtime will not create a DataTable as a result (it gives better performance).
- ExecuteReader method:
- We use this method in all others queries cases.
- Return a DataReader object as a result (a read-only and forward-only object).
DataReader:
- The DataReader is a high performance method to retrieve data from the data store.
- The DataReader is a read-only, server-side cursor and forward-only object.
- It's useful for a read only data, and less for updated data.
- Read only one row at a time (by default).
- Multiple Active Result Sets(MARS) – When you try to retrieve data with the DataReader object(that keeps an open server-side cursor) you can't open another DataReader from the same connection. Unless you use the MultipleActiveResultSetes property which is a part of the connection string (for example in SQL server 2005).
DataAdapter:
- The DataAdapter is use for query and update data between DataTable and the data store.
- UpdateBatchSize property – is used to set the number of SQL statements that will be sent to the server. By default, the server sent only one row change statement at the same time (row by row). You should change this number to give the possibility to collect a big number of changes before we'll send it to the server.