OK, I've received couple of emails people asking me how can they use a common data provider to access various types of data sources without loosing the power and flexibility of native data provider libraries. One guy even asked if he can write some code which lets you specify at runtime what type of data provider do you want to use.
Introduction
ADO.NET library provides different types of data providers to work with different data sources. Three common data providers are OLE DB, SQL, and ODBC. The main reason of using different data providers to maintain the performance and not loose native data provider functionality. For example, when you access an Access database using OLE DB data provider, it uses native OLE DB provider to access the database, But when you use ODBC data provider to access an Access database, it uses ODBC layer on top of the native layer.
In brief, all data provider classes such as a connection, command, data adapter and data reader are inherited from interfaces. I wish I could discuss this whole but It will take me days to finish the article.
Any way, the point in this article is to show you how you can write a generic class, which can access data by using OLE DB, SQL, and ODBC data providers based on the user selection at runtime.
Interface Model
Each data provider's implements some interfaces. These interfaces are defined in the System.Data namespace. For example, SqlConnection, OleDbConnection, and OdbcConnection classes are derived from IDbConnection interface.
Similar to the connection classes, other ADO.NET components such as DataAdapter, DataReader, Command also implement their relative interfaces.
To make my story sort, you're going to use these interfaces to write generic data access class. I'm not going to write every functionality of the class but I'll give you a pretty good idea how it works and how you can extend this functionality.
The code listed in Listing 1 shows a class GenericAdoNetComp, which provides two methods GetConnection and GetDataAdapter. These both methods read information from the user and based on the connection type and other information provided by the user, these methods create and return the desired output. Here is the definition of both methods:
- public IDbConnection GetConnection(int connType,string connString)
- public IDbDataAdapter GetDataAdapter(int connType,string connString, string sql)
Listing 1.
- using System;
- using System.Data;
- using System.Data.Common;
- using System.Data.OleDb;
- using System.Data.SqlClient;
- using Microsoft.Data.Odbc;
- namespace GenericDataAccessApp
- {
- public class GenericAdoNetComp
- {
- private IDbConnection idbConn = null;
- private IDbDataAdapter idbAdapter = null;
- private DbDataAdapter dbAdapter = null;
- private IDataReader iReader = null;
- public GenericAdoNetComp()
- {
- }
- // GetConnection returns IDbConnection
- public IDbConnection GetConnection(int connType, string connString)
- {
- switch (connType)
- {
- case 1: // OleDb Data Provider
- idbConn = new OleDbConnection(connString);
- break;
- case 2: // Sql Data Provider
- idbConn = new SqlConnection(connString);
- break;
- case 3: // ODBC Data Provider
- idbConn = new OdbcConnection(connString);
- break;
- // case 3: // Add your custom data provider
- default:
- break;
- }
- return idbConn;
- }
- // GetDataAdapter returns IDbDataAdapter
- public IDbDataAdapter GetDataAdapter(int connType, string connString, string sql)
- {
- switch (connType)
- {
- case 1: // OleDb Data Provider
- idbAdapter = new OleDbDataAdapter(sql, connString);
- break;
- case 2: // Sql Data Provider
- idbAdapter = new SqlDataAdapter(sql, connString);
- break;
- case 3: // ODBC Data Provider
- idbAdapter = new OdbcDataAdapter(sql, connString);
- break;
- // case 3: // Add your custom data provider
- default:
- break;
- }
- return idbAdapter;
- }
- }
- }


Waheed ShahzadPosted Aug 15, 2010, 9:34 PM
Hi, I am working on School Management Project and need some help because I am new in C#. Could you help me to resolve problems I have during project development life cycle. Thanks.
MadhaviPosted Dec 6, 2007, 5:06 AM
Hi, First i should thank for providing such useful information. its very helpful to me Thanks and Regards, Madhavi