I just read Mahesh's article Writing a Generic Data Access Component.
Another way to solve this problem is to utilize the System.Activator class and a factory pattern to create the concrete provider classes as was pointed-out in Dan Fox's article "Design an Effective Data-Access Architecture" (.netmagazine, vol. 2, no. 7). I took this idea and refined it a bit so that the only steps necessary to add a new provider to the factory is to add a new enum and the associated type values to the factory's static type arrays (a total of 5 lines of code).
Here is the sample code. See the attached source code for a test application.
- using System;
- using System.Reflection;
- using System.Data;
- using System.Data.OleDb;
- using System.Data.SqlClient;
- namespace CSharpCorner.ProviderFactory
- {
-
-
-
- public enum ProviderType
- {
-
-
-
- OleDb = 0,
-
-
-
- SqlClient
- };
-
-
-
-
-
-
-
-
- public class ProviderFactory
- {
-
- #region private variables
- private static Type[] _connectionTypes = new Type[] { typeof(OleDbConnection), typeof(SqlConnection) };
- private static Type[] _commandTypes = new Type[] { typeof(OleDbCommand), typeof(SqlCommand) };
- private static Type[] _dataAdapterTypes = new Type[] { typeof(OleDbDataAdapter), typeof(SqlDataAdapter) };
- private static Type[] _dataParameterTypes = new Type[] { typeof(OleDbParameter), typeof(SqlParameter) };
- private ProviderType _provider;
- #endregion
-
- #region ctors
-
- private ProviderFactory() { }
- public ProviderFactory(ProviderType provider)
- {
- _provider = provider;
- }
- #endregion
-
- #region Provider property
- public ProviderType Provider
- {
- get
- {
- return _provider;
- }
- set
- {
- _provider = value;
- }
- }
- #endregion
-
- #region IDbConnection methods
- public IDbConnection CreateConnection()
- {
- IDbConnection conn = null;
- try
- {
- conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider]);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return conn;
- }
- public IDbConnection CreateConnection(string connectionString)
- {
- IDbConnection conn = null;
- object[] args = { connectionString };
- try
- {
- conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return conn;
- }
- #endregion
-
- #region IDbCommand methods
- public IDbCommand CreateCommand()
- {
- IDbCommand cmd = null;
- try
- {
- cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider]);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return cmd;
- }
- public IDbCommand CreateCommand(string cmdText)
- {
- IDbCommand cmd = null;
- object[] args = { cmdText };
- try
- {
- cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return cmd;
- }
- public IDbCommand CreateCommand(string cmdText, IDbConnection connection)
- {
- IDbCommand cmd = null;
- object[] args = { cmdText, connection };
- try
- {
- cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return cmd;
- }
- public IDbCommand CreateCommand(string cmdText, IDbConnection connection, IDbTransaction transaction)
- {
- IDbCommand cmd = null;
- object[] args = { cmdText, connection, transaction };
- try
- {
- cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return cmd;
- }
- #endregion
-
- #region IDbDataAdapter methods
- public IDbDataAdapter CreateDataAdapter()
- {
- IDbDataAdapter da = null;
- try
- {
- da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider]);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return da;
- }
- public IDbDataAdapter CreateDataAdapter(IDbCommand selectCommand)
- {
- IDbDataAdapter da = null;
- object[] args = { selectCommand };
- try
- {
- da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return da;
- }
- public IDbDataAdapter CreateDataAdapter(string selectCommandText, IDbConnection selectConnection)
- {
- IDbDataAdapter da = null;
- object[] args = { selectCommandText, selectConnection };
- try
- {
- da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return da;
- }
- public IDbDataAdapter CreateDataAdapter(string selectCommandText, string selectConnectionString)
- {
- IDbDataAdapter da = null;
- object[] args = { selectCommandText, selectConnectionString };
- try
- {
- da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return da;
- }
- #endregion
-
- #region IDbDataParameter methods
- public IDbDataParameter CreateDataParameter()
- {
- IDbDataParameter param = null;
- try
- {
- param = (IDbDataParameter)Activator.CreateInstance(_dataParameterTypes[(int)_provider]);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return param;
- }
- public IDbDataParameter CreateDataParameter(string parameterName, object value)
- {
- IDbDataParameter param = null;
- object[] args = { parameterName, value };
- try
- {
- param = (IDbDataParameter)Activator.CreateInstance(_dataParameterTypes[(int)_provider], args);
- }
- catch (TargetInvocationException e)
- {
- throw new SystemException(e.InnerException.Message, e.InnerException);
- }
- return param;
- }
- public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType)
- {
- IDbDataParameter param = CreateDataParameter();
- if (param != null)
- {
- param.ParameterName = parameterName;
- param.DbType = dataType;
- }
- return param;
- }
- public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType, int size)
- {
- IDbDataParameter param = CreateDataParameter();
- if (param != null)
- {
- param.ParameterName = parameterName;
- param.DbType = dataType;
- param.Size = size;
- }
- return param;
- }
- public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType, int size, string sourceColumn)
- {
- IDbDataParameter param = CreateDataParameter();
- if (param != null)
- {
- param.ParameterName = parameterName;
- param.DbType = dataType;
- param.Size = size;
- param.SourceColumn = sourceColumn;
- }
- return param;
- }
- #endregion
- }
- }