Name

DataAdapter

Synopsis

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 objects (thanks to the interface).

Generally, you won’t ever use the DataAdapter class directly. If you want to create generic data-access code that can use different provider-specific ADO.NET objects, you always cast the DataAdapter to the System.Data.IDbDataAdapter interface. Note that the DataAdapter class contains a mix of abstract members the provider-specific class must override and members that need no alteration (mainly, its properties). Some properties that are implemented in this class include TableMappings (which maps data source table and field names to table and field names in the System.Data.DataSet) and ContinueUpdateOnError (which, if true, continues updating even if some changes can’t be committed and stores an error message in the corresponding System.Data.DataRow.RowError property). You can also set MissingMappingAction to tell the DataAdapter what to do if it finds a column or table that doesn’t have a mapping (by default, it adds it using the name used in the data source) and MissingSchemaAction to tell the DataAdapter what to do when adding tables to a System.Data.DataSet that doesn’t have a schema (it can retrieve schema information automatically, throw an exception, or simply add the table without schema information, which is the default).

public abstract class DataAdapter : System.ComponentModel.Component, System.Data.IDataAdapter {

// Protected Constructors

   protected DataAdapter( );  

   protected DataAdapter(DataAdapter adapter);  

// Public Instance Properties

   public bool AcceptChangesDuringFill{set; get; } 

   public bool ContinueUpdateOnError{set; get; } 

   public MissingMappingAction MissingMappingAction{set; get; } // implements System.Data.IDataAdapter

   public MissingSchemaAction MissingSchemaAction{set; get; }  // implements System.Data.IDataAdapter

   public DataTableMappingCollection TableMappings{get; } 

// Public Instance Methods

   public abstract int Fill(System.Data.DataSet dataSet);     // implements System.Data.IDataAdapter

   public abstract DataTable[  ] FillSchema(System.Data.DataSet dataSet,

        System.Data.SchemaType schemaType);               // implements System.Data.IDataAdapter

   public abstract IDataParameter[  ] GetFillParameters( );       // implements System.Data.IDataAdapter

   public abstract int Update(System.Data.DataSet dataSet);   // implements System.Data.IDataAdapter

                  // Protected Instance Methods

   protected virtual DataAdapter CloneInternals( );  

   protected virtual DataTableMappingCollection CreateTableMappings();

   protected override void Dispose(bool disposing);           // overrides System.ComponentModel.Component

   protected virtual bool ShouldSerializeTableMappings( );  

}