DataAdapter classes are provider-specific types that act as a bridge between a data source (such as a SQL Server database) and the ADO.NET System.Data.DataSet. DataAdapter s have two responsibilities: to retrieve the results of a query and place it in a System.Data.DataSet (when you call the Fill( ) method), and to reconcile changes in the System.Data.DataSet and apply changes back to the data source (when you call the Update( ) method.

An ADO.NET provider includes its own custom DataAdapter (such as System.Data.SqlClient.SqlDataAdapter). Unfortunately, DataAdapter classes have a complex inheritance hierarchy. The base functionality is defined by two interfaces: System.Data.IDataAdapter (which defines the Update( ) and Fill( ) methods) and, for relational database providers, a System.Data.IDbDataAdapter (which defines the command properties used for interacting with the data source). The relational database provider-specific DataAdapter implements only one of these interfaces directly (System.Data.IDbDataAdapter). It implements the other indirectly by deriving from DbDataAdapter, which in turn derives from this class. This situation is illustrated more clearly in Figure 36-2. This allows some basic DataAdapter functionality to be implemented in this class (so the provider-specific DataAdapter doesn’t need to). It also allows the provider-specific class to use strongly typed Command properties but still support generic access to these properties as System.Data.IDbCommand ...

Get ADO.NET in a Nutshell now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.