一、数据库工厂模式介绍
网上搜索下,有很多关于数据库工厂模式的资料,在这边提供个人对数据库工厂模式的理解,我认为的数据库工厂是这样的:把对数据库的操作组件交给工厂去做,而调用方不必知道需要调用什么组件来操作特定的数据库。比如:IDbConnection (数据库连接对象)、IDbCommand (Command对象)、IDbDataAdapter( 数据适配器对象)、IDbTransaction (数据库事物对象)、IDataReader (数据阅读器对象)等等,这些操作可以在IDBFactory(数据库工厂接口)中定义,那么我们定义MSSqlDbFactory (mssql工厂类)、OdbcFactory(odbc工厂类)、OledbFactory (oledb工厂类)等等,就可以继承IDBFactory(数据库工厂接口),通过数据库工厂类来实现对不同数据库的操作,由于接口具有约束作用即:继承IDBFactory(数据库工厂接口)的类都必须全部实现IDBFactory(数据库工厂接口)中定义的全部方法,所以我们可以通过IDBFactory(数据库工厂接口)实例化数据库工厂类来调用接口中的方法,而不必关心接口的具体实现,来达到数据库工厂操作的目的。
以上为大概的现实思路,如有更好的现实思路或者有不对的地方可以大家一起讨论研究下,谢谢!
二、数据库工厂的代码实现
第一点介绍了数据库工厂模式的实现思路,接下来我们贴上代码来实现上述内容。
IDbFactory 接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace DataBase
{
public interface IDBFactory
{
/// <summary>
/// 数据库连接字符串
/// </summary>
string ConnStr { get; set; }
/// <summary>
/// <span style="font-family: Arial, Helvetica, sans-serif;">建立Connection对象</span>
/// </summary>
/// <returns>Connection对象</returns>
IDbConnection CreateConnection();
/// <summary>
/// 根据连接字符串建立Connection对象
/// </summary>
/// <param name="strConn">连接字符串</param>
/// <returns>Connection对象</returns>
IDbConnection CreateConnection(string strConn);
/// <summary>
/// 建立Command对象
/// </summary>
/// <returns>Command对象</returns>
IDbCommand CreateCommand();
/// <summary>
/// 建立DataAdapter对象
/// </summary>
/// <returns>DataAdapter对象</returns>
IDbDataAdapter CreateDataAdapter();
/// <summary>
/// 根据Connection建立Transaction
/// </summary>
/// <param name="myConn">Connection对象</param>
/// <returns>Transaction对象</returns>
IDbTransaction CreateTransaction(IDbConnection myConn);
/// <summary>
/// 根据Command对象建立DataReader
/// </summary>
/// <param name="myComm">Command对象</param>
/// <returns>DataReader对象</returns>
IDataReader CreateDataReader(IDbCommand myComm);
}
}
MSSqlDbFactory 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace DataBase
{
public class MSSqlDbFactory : IDBFactory
{
public string ConnStr { get; set; }
public IDbConnection CreateConnection()
{
return new SqlConnection(ConnStr);
}
public IDbConnection CreateConnection(string strConn)
{
return new SqlConnection(strConn);
}
public IDbCommand CreateCommand()
{
return new SqlCommand();
}
public IDbDataAdapter CreateDataAdapter()
{
return new SqlDataAdapter();
}
public IDbTransaction CreateTransaction(IDbConnection myConn)
{
return myConn.BeginTransaction();
}
public IDataReader CreateDataReader(IDbCommand myComm)
{
return myComm.ExecuteReader();
}
}
}
OdbcFactory 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;
using System.Data;
namespace DataBase
{
public class OdbcFactory : IDBFactory
{
public string ConnStr { get; set; }
public IDbCommand CreateCommand()
{
return new OdbcCommand();
}
public IDbConnection CreateConnection()
{
return new OdbcConnection(ConnStr);
}
public IDbConnection CreateConnection(string strConn)
{
return new OdbcConnection(strConn);
}
public IDbDataAdapter CreateDataAdapter()
{
return new OdbcDataAdapter();
}
public IDataReader CreateDataReader(IDbCommand myComm)
{
return myComm.ExecuteReader();
}
public IDbTransaction CreateTransaction(IDbConnection myConn)
{
return myConn.BeginTransaction();
}
}
}
OledbFactory 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
namespace DataBase
{
public class OledbFactory : IDBFactory
{
public string ConnStr { get; set; }
public IDbCommand CreateCommand()
{
return new OleDbCommand();
}
public IDbConnection CreateConnection()
{
return new OleDbConnection(ConnStr);
}
public IDbConnection CreateConnection(string strConn)
{
return new OleDbConnection(strConn);
}
public IDbDataAdapter CreateDataAdapter()
{
return new OleDbDataAdapter();
}
public IDataReader CreateDataReader(IDbCommand myComm)
{
return myComm.ExecuteReader();
}
public IDbTransaction CreateTransaction(IDbConnection myConn)
{
return myConn.BeginTransaction();
}
}
}
DbFactory 数据库工厂类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataBase;
using System.Data;
namespace DataLogicLayer
{
public class DbFactory
{
//数据库工厂接口
IDBFactory dbF;
/// <summary>
/// 数据库工厂构造函数
/// </summary>
/// <param name="dbtype">数据库枚举</param>
public DbFactory(Connection.DbType dbtype)
{
switch (dbtype)
{
case Connection.DbType.MSSQLSERVER:
dbF = new MSSqlDbFactory();
dbF.ConnStr = Connection.SQLConnStr();
break;
case Connection.DbType.ODBC:
dbF = new OdbcFactory();
dbF.ConnStr = Connection.ODBCConnStr();
break;
case Connection.DbType.OLEDB:
dbF = new OledbFactory();
dbF.ConnStr = Connection.OledbConnStr();
break;
}
}
public DataTable TestQuery()
{
IDbConnection conn = dbF.CreateConnection();
IDbCommand comm = dbF.CreateCommand();
comm.CommandText = "select * from Operators";
comm.Connection = conn;
IDbDataAdapter da = dbF.CreateDataAdapter();
da.SelectCommand = comm;
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = new DataTable();
dt = ds.Tables[0];
return dt;
}
}
}
//数据库类型枚举
public enum DbType
{
MSSQLSERVER = 0,
ODBC = 1,
OLEDB = 2
}通过以上代码可见,在TestQuery() 方法中直接调用接口的实现来访问数据库,而不必知道接口的具体实现是怎样的。
转载请注明出处谢谢!
本文介绍了数据库工厂模式的概念,强调了其将数据库操作组件化的思想,使得调用方无需了解具体数据库组件。文章提出了通过IDBFactory接口定义各种数据库(如MSSqlDbFactory、OdbcFactory、OledbFactory)的工厂类,实现对不同数据库的操作。作者鼓励读者讨论和分享更优的实现方案,并提供了接口定义的代码示例。
934

被折叠的 条评论
为什么被折叠?



