2023年6月21日发(作者:)
继承IDbConnection连接不同数据库
本⽅案可实现仅修改即可连接不同数据库,但是设计数据库时需要注意各种数据库的数据类型是不⼀样的。各种不同数据库的Connection、Command、DataAdapter、Transaction和Parameter都继承⾃IDbConnection、IDbCommand、IDbDataAdapter、IDbTransaction和IDbDataParameter,⽤⼀个⼯⼚来实现接⼝的实例即可实现连接不同数据库。⾸先,需要新建⼀个类库,命名为DbManager,此类库需要5个⽂件,
1、创建⼀个枚举类型:space DbManager{
public enum DataProvider { Oracle, SqlServer, OleDb, Odbc, MySql }}2、创建⼀个⼯⼚类,⽤来产⽣以上不同数据库的实例:g ;using ;using ent;using ;using Client; //需要添加引⽤using lient; //请⾃⾏安装MySQLConnector/Net后添加引⽤namespace DbManager{ public sealed class DBManagerFactory { private DBManagerFactory() { } public static IDbConnection GetConnection(DataProvider providerType) { IDbConnection iDbConnection; switch (providerType) { case ver: iDbConnection = new SqlConnection(); break; case : iDbConnection = new OleDbConnection(); break; case : iDbConnection = new OdbcConnection(); break; case : iDbConnection = new OracleConnection(); break; case : iDbConnection = new MySqlConnection(); break; default: return null; } return iDbConnection; } } public static IDbCommand GetCommand(DataProvider providerType) { switch (providerType) { case ver: return new SqlCommand(); case : return new OleDbCommand(); case : return new OdbcCommand(); case : return new OracleCommand(); case : return new MySqlCommand(); default: return null; } } public static IDbDataAdapter GetDataAdapter(DataProvider providerType) { switch (providerType) { case ver: return new SqlDataAdapter(); case : return new OleDbDataAdapter(); case : return new OdbcDataAdapter(); case : return new OracleDataAdapter(); case : return new MySqlDataAdapter(); default: return null; } } public static IDbTransaction GetTransaction(DataProvider providerType) { IDbConnection iDbConnection = GetConnection(providerType); IDbTransaction iDbTransaction = ransaction(); return iDbTransaction; } public static IDbDataParameter[] GetParameters(DataProvider providerType, int paramsCount) { IDbDataParameter[] idbParams = new IDbDataParameter[paramsCount]; switch (providerType) { case ver: for (int i = 0; i < paramsCount; i++) { idbParams[i] = new SqlParameter(); } break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new OleDbParameter(); } break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new OdbcParameter(); } break; break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new OracleParameter(); } break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new MySqlParameter(); } break; default: idbParams = null; break; } return idbParams; } }}3、创建⼀个接⼝:g ;namespace DbManager{ public interface IDBManager { DataProvider ProviderType { get; set; } IDbConnection Connection { get; set; } IDataReader DataReader { get; set; } IDbCommand Command { get; set; } IDbTransaction Transaction { get; set; } IDbDataParameter[] Parameters { get; set; } string ConnectionString { get; set; } void Open(); void Close(); void Dispose(); void CreateParameters(int paramsCount); void AddParameters(int index, string paramName, object objValue); void BeginTransaction(); void CommitTransaction(); void CloseReader(); IDataReader ExecuteReader(CommandType commandType, string commandText); int ExecuteNonQuery(CommandType commandType, string commandText); object ExecuteScalar(CommandType commandType, string commandText); DataSet ExecuteDataSet(CommandType commandType, string commandText); }}4、创建⼀个类来实现IDBManager接⼝:g System;using ;using ;namespace DbManager{ public sealed class DBManager : IDBManager, IDisposable { #region 字段 private DataProvider _providerType; private IDbConnection _idbConnection; private IDataReader _iDataReader; private IDbCommand _idbCommand; private IDbTransaction _idbTransaction; private IDbDataParameter[] _idbParameters; private string _connectionString; #endregion #region 构造⽅法 public DBManager() { } public DBManager(DataProvider providerType) { ProviderType = providerType; } public DBManager(DataProvider providerType, string connectionString) { ProviderType = providerType; ConnectionString = connectionString; } #endregion #region 属性 public DataProvider ProviderType { get { return _providerType; } set { _providerType = value; } } public IDbConnection Connection { get { return _idbConnection; } set { _idbConnection = value; } } public IDataReader DataReader { get { return _iDataReader; } set { _iDataReader = value; } } public IDbCommand Command { get { return _idbCommand; } set { _idbCommand = value; } } public IDbTransaction Transaction { get { return _idbTransaction; } set { _idbTransaction = value; } } public IDbDataParameter[] Parameters { get { return _idbParameters; } set { _idbParameters = value; } } public string ConnectionString { get { return _connectionString; } set { _connectionString = value; } } #endregion #region 公有⽅法 public void Open() { Connection = nection(ProviderType); tionString = ConnectionString; if ( != ) { (); } Command = mand(ProviderType); } public void Close() { if ( != ) { (); } } public void Dispose() { ssFinalize(this); Close(); Command = null; Transaction = null; Connection = null; } public void CreateParameters(int paramsCount) { Parameters = new IDbDataParameter[paramsCount]; Parameters = ameters(ProviderType, paramsCount); } public void AddParameters(int index, string paramName, object objValue) { if (index < ) { Parameters[index].ParameterName = paramName; Parameters[index].Value = objValue; } } public void BeginTransaction() { if (Transaction == null) { Transaction = nsaction(ProviderType); } ction = Transaction; } public void CommitTransaction() public void CommitTransaction() { if (Transaction != null) { (); } Transaction = null; } public void CloseReader() { if (DataReader != null) { (); } } public IDataReader ExecuteReader(CommandType commandType, string commandText) { Command = mand(ProviderType); tion = Connection; PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); DataReader = eReader(); (); return DataReader; } public int ExecuteNonQuery(CommandType commandType, string commandText) { Command = mand(ProviderType); PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); int returnValue = eNonQuery(); (); return returnValue; } public object ExecuteScalar(CommandType commandType, string commandText) { Command = mand(ProviderType); PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); object returnValue = eScalar(); (); return returnValue; } public DataSet ExecuteDataSet(CommandType commandType, string commandText) { Command = mand(ProviderType); PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); IDbDataAdapter dataAdapter = aAdapter(ProviderType); Command = Command; DataSet dataSet = new DataSet(); (dataSet); (); return dataSet; } #endregion #region 私有⽅法 private void AttachParameters(IDbCommand command, IDbDataParameter[] commandParameters) { foreach (IDbDataParameter idbParameter in commandParameters) { if (ion == utput && == null) { = ; } (idbParameter); (idbParameter); } } private void PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDbDataParameter[] commandParameters) { tion = connection; dText = commandText; dType = commandType; if (transaction != null) { ction = transaction; } if (commandParameters != null) { AttachParameters(command, commandParameters); } } #endregion }}5、再加⼀个,来调⽤DBManager类,外部来直接调⽤DBHelper类即可。using System;using ;using uration;namespace DbManager{ public class DBHelper { private static readonly IDBManager dbManager = new DBManager(GetDataProvider(), GetConnectionString()); ///
private static void SelectWithoutParams() { const string sql = "select * from RoomType"; IDataReader reader = eReader(sql); while (()) { ine(reader["TypeName"].ToString()); } (); //记得关闭reader } private static void SelectWithSafeSql(int TypeId) { string sql = ("select * from RoomType where TypeId={0}", TypeId); IDataReader reader = eReader(sql); while (()) { ine(reader["TypeName"].ToString()); } (); } private static void SelectWithParams(string typeName) { string sql = "select * from RoomType where TypeName=@TypeName";
//先创建参数,然后才能添加参数
Parameters(1); //参数个数,1个 ameters(0, "@TypeName", typeName); IDataReader reader = eReader(sql); while (()) { ine(reader["TypeName"].ToString()); } (); } }}
OK!全部完成!在具体的DAL层中,调⽤DBHelper的相关⽅法即可,如果是查询⽅法,记得最后要写关闭代码。只要表结构⼀样,可以在中随意切换数据库。最后注意的是:各个数据库的插⼊语句不⼀样,假设我们有4个字段,第⼀个字段fieldName1为⾃增字段。对于SQLServer,不需要写⾃增字段,语句是:INSERT INTO table VALUES(value2, value3, value4);对于MySQL,⾃增字段位置需要写null代替,语句是:INSERT INTO table VALUES(NULL, value2, value3, value4);⽽对于ACCESS数据库,则必须写完整,语句是:INSERT INTO table(fieldName2, fieldName3,fieldName4) VALUES(value2, value3, value4);为了实现兼容,⼤家还是都按完整的来写,就不会有错了。
2023年6月21日发(作者:)
继承IDbConnection连接不同数据库
本⽅案可实现仅修改即可连接不同数据库,但是设计数据库时需要注意各种数据库的数据类型是不⼀样的。各种不同数据库的Connection、Command、DataAdapter、Transaction和Parameter都继承⾃IDbConnection、IDbCommand、IDbDataAdapter、IDbTransaction和IDbDataParameter,⽤⼀个⼯⼚来实现接⼝的实例即可实现连接不同数据库。⾸先,需要新建⼀个类库,命名为DbManager,此类库需要5个⽂件,
1、创建⼀个枚举类型:space DbManager{
public enum DataProvider { Oracle, SqlServer, OleDb, Odbc, MySql }}2、创建⼀个⼯⼚类,⽤来产⽣以上不同数据库的实例:g ;using ;using ent;using ;using Client; //需要添加引⽤using lient; //请⾃⾏安装MySQLConnector/Net后添加引⽤namespace DbManager{ public sealed class DBManagerFactory { private DBManagerFactory() { } public static IDbConnection GetConnection(DataProvider providerType) { IDbConnection iDbConnection; switch (providerType) { case ver: iDbConnection = new SqlConnection(); break; case : iDbConnection = new OleDbConnection(); break; case : iDbConnection = new OdbcConnection(); break; case : iDbConnection = new OracleConnection(); break; case : iDbConnection = new MySqlConnection(); break; default: return null; } return iDbConnection; } } public static IDbCommand GetCommand(DataProvider providerType) { switch (providerType) { case ver: return new SqlCommand(); case : return new OleDbCommand(); case : return new OdbcCommand(); case : return new OracleCommand(); case : return new MySqlCommand(); default: return null; } } public static IDbDataAdapter GetDataAdapter(DataProvider providerType) { switch (providerType) { case ver: return new SqlDataAdapter(); case : return new OleDbDataAdapter(); case : return new OdbcDataAdapter(); case : return new OracleDataAdapter(); case : return new MySqlDataAdapter(); default: return null; } } public static IDbTransaction GetTransaction(DataProvider providerType) { IDbConnection iDbConnection = GetConnection(providerType); IDbTransaction iDbTransaction = ransaction(); return iDbTransaction; } public static IDbDataParameter[] GetParameters(DataProvider providerType, int paramsCount) { IDbDataParameter[] idbParams = new IDbDataParameter[paramsCount]; switch (providerType) { case ver: for (int i = 0; i < paramsCount; i++) { idbParams[i] = new SqlParameter(); } break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new OleDbParameter(); } break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new OdbcParameter(); } break; break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new OracleParameter(); } break; case : for (int i = 0; i < paramsCount; i++) { idbParams[i] = new MySqlParameter(); } break; default: idbParams = null; break; } return idbParams; } }}3、创建⼀个接⼝:g ;namespace DbManager{ public interface IDBManager { DataProvider ProviderType { get; set; } IDbConnection Connection { get; set; } IDataReader DataReader { get; set; } IDbCommand Command { get; set; } IDbTransaction Transaction { get; set; } IDbDataParameter[] Parameters { get; set; } string ConnectionString { get; set; } void Open(); void Close(); void Dispose(); void CreateParameters(int paramsCount); void AddParameters(int index, string paramName, object objValue); void BeginTransaction(); void CommitTransaction(); void CloseReader(); IDataReader ExecuteReader(CommandType commandType, string commandText); int ExecuteNonQuery(CommandType commandType, string commandText); object ExecuteScalar(CommandType commandType, string commandText); DataSet ExecuteDataSet(CommandType commandType, string commandText); }}4、创建⼀个类来实现IDBManager接⼝:g System;using ;using ;namespace DbManager{ public sealed class DBManager : IDBManager, IDisposable { #region 字段 private DataProvider _providerType; private IDbConnection _idbConnection; private IDataReader _iDataReader; private IDbCommand _idbCommand; private IDbTransaction _idbTransaction; private IDbDataParameter[] _idbParameters; private string _connectionString; #endregion #region 构造⽅法 public DBManager() { } public DBManager(DataProvider providerType) { ProviderType = providerType; } public DBManager(DataProvider providerType, string connectionString) { ProviderType = providerType; ConnectionString = connectionString; } #endregion #region 属性 public DataProvider ProviderType { get { return _providerType; } set { _providerType = value; } } public IDbConnection Connection { get { return _idbConnection; } set { _idbConnection = value; } } public IDataReader DataReader { get { return _iDataReader; } set { _iDataReader = value; } } public IDbCommand Command { get { return _idbCommand; } set { _idbCommand = value; } } public IDbTransaction Transaction { get { return _idbTransaction; } set { _idbTransaction = value; } } public IDbDataParameter[] Parameters { get { return _idbParameters; } set { _idbParameters = value; } } public string ConnectionString { get { return _connectionString; } set { _connectionString = value; } } #endregion #region 公有⽅法 public void Open() { Connection = nection(ProviderType); tionString = ConnectionString; if ( != ) { (); } Command = mand(ProviderType); } public void Close() { if ( != ) { (); } } public void Dispose() { ssFinalize(this); Close(); Command = null; Transaction = null; Connection = null; } public void CreateParameters(int paramsCount) { Parameters = new IDbDataParameter[paramsCount]; Parameters = ameters(ProviderType, paramsCount); } public void AddParameters(int index, string paramName, object objValue) { if (index < ) { Parameters[index].ParameterName = paramName; Parameters[index].Value = objValue; } } public void BeginTransaction() { if (Transaction == null) { Transaction = nsaction(ProviderType); } ction = Transaction; } public void CommitTransaction() public void CommitTransaction() { if (Transaction != null) { (); } Transaction = null; } public void CloseReader() { if (DataReader != null) { (); } } public IDataReader ExecuteReader(CommandType commandType, string commandText) { Command = mand(ProviderType); tion = Connection; PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); DataReader = eReader(); (); return DataReader; } public int ExecuteNonQuery(CommandType commandType, string commandText) { Command = mand(ProviderType); PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); int returnValue = eNonQuery(); (); return returnValue; } public object ExecuteScalar(CommandType commandType, string commandText) { Command = mand(ProviderType); PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); object returnValue = eScalar(); (); return returnValue; } public DataSet ExecuteDataSet(CommandType commandType, string commandText) { Command = mand(ProviderType); PrepareCommand(Command, Connection, Transaction, commandType, commandText, Parameters); IDbDataAdapter dataAdapter = aAdapter(ProviderType); Command = Command; DataSet dataSet = new DataSet(); (dataSet); (); return dataSet; } #endregion #region 私有⽅法 private void AttachParameters(IDbCommand command, IDbDataParameter[] commandParameters) { foreach (IDbDataParameter idbParameter in commandParameters) { if (ion == utput && == null) { = ; } (idbParameter); (idbParameter); } } private void PrepareCommand(IDbCommand command, IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDbDataParameter[] commandParameters) { tion = connection; dText = commandText; dType = commandType; if (transaction != null) { ction = transaction; } if (commandParameters != null) { AttachParameters(command, commandParameters); } } #endregion }}5、再加⼀个,来调⽤DBManager类,外部来直接调⽤DBHelper类即可。using System;using ;using uration;namespace DbManager{ public class DBHelper { private static readonly IDBManager dbManager = new DBManager(GetDataProvider(), GetConnectionString()); ///
private static void SelectWithoutParams() { const string sql = "select * from RoomType"; IDataReader reader = eReader(sql); while (()) { ine(reader["TypeName"].ToString()); } (); //记得关闭reader } private static void SelectWithSafeSql(int TypeId) { string sql = ("select * from RoomType where TypeId={0}", TypeId); IDataReader reader = eReader(sql); while (()) { ine(reader["TypeName"].ToString()); } (); } private static void SelectWithParams(string typeName) { string sql = "select * from RoomType where TypeName=@TypeName";
//先创建参数,然后才能添加参数
Parameters(1); //参数个数,1个 ameters(0, "@TypeName", typeName); IDataReader reader = eReader(sql); while (()) { ine(reader["TypeName"].ToString()); } (); } }}
OK!全部完成!在具体的DAL层中,调⽤DBHelper的相关⽅法即可,如果是查询⽅法,记得最后要写关闭代码。只要表结构⼀样,可以在中随意切换数据库。最后注意的是:各个数据库的插⼊语句不⼀样,假设我们有4个字段,第⼀个字段fieldName1为⾃增字段。对于SQLServer,不需要写⾃增字段,语句是:INSERT INTO table VALUES(value2, value3, value4);对于MySQL,⾃增字段位置需要写null代替,语句是:INSERT INTO table VALUES(NULL, value2, value3, value4);⽽对于ACCESS数据库,则必须写完整,语句是:INSERT INTO table(fieldName2, fieldName3,fieldName4) VALUES(value2, value3, value4);为了实现兼容,⼤家还是都按完整的来写,就不会有错了。
发布评论