28.1. What Is ADO.NET?28.1.1. Why Is It Called ADO.NET?28.1.2. Design Goals of ADO.NET28.1.2.1. Simple Access to Relational Data28.1.2.2. Extensibility28.1.2.3. Support for Multitier Applications28.1.2.4. Unification of XML and Relational Data Access28.2. Overview of ADO.NET Classes and Objects28.2.1. Provider Objects28.2.1.1. Connection Object28.2.1.2. Command Object28.2.1.3. CommandBuilder Object28.2.1.4. DataReader Object28.2.1.5. DataAdapter Object28.2.2. Consumer Objects28.2.2.1. DataSet Object28.2.2.2. DataTable Object28.2.2.2.1. DataRelation Object28.2.3. Using the System.Data Namespace28.2.3.1. SQL Server .NET Data Provider28.2.3.2. Oracle .NET Data Provider28.2.3.3. OLE DB .NET Data Provider28.2.3.4. ODBC .NET Data Provider28.2.3.5. Other Native .NET Data Providers28.3. Reading Data with the DataReader28.4. Reading Data with the DataSet28.4.1. Filling the DataSet with Data28.4.2. Accessing Tables, Rows, and Columns in the DataSet28.5. Updating the Database28.5.1. Adding Rows to the Database28.5.1.1. Finding Rows28.5.2. Deleting Rows28.6. Accessing Multiple Tables in a DataSet28.6.1. Relationships in ADO.NET28.6.1.1. Creating a DataRelation Object28.6.2. Navigating with Relationships28.6.2.1. Fetching the Child Rows28.7. XML and ADO.NET28.7.1. XML Support in ADO.NET DataSets28.8. SQL Support in ADO.NET28.8.1. SQL Commands in Data Adapters28.8.1.1. Using WHERE with SELECT28.8.1.2. Viewing SQL SELECT, UPDATE, INSERT, and DELETE Commands28.8.2. Direct Execution of SQL Commands28.8.2.1. Retrieving Single Values28.8.2.2. Retrieving No Data28.8.3. Calling a SQL Stored Procedure28.9. Using LINQ over DataSet with ADO.NET28.9.1. When to Use LINQ over DataSet28.10. Summary28.11. Exercises