您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

C#数据库工厂模式的实现

wiki 2022/1/22 13:18:13 dotnet 字数 8140 阅读 1172

C#数据库工厂模式的实现
一、数据库工厂模式介绍

网上搜索下,有很多关于数据库工厂模式的资料,在这边提供个人对数据库工厂模式的理解,我认为的数据库工厂是这样的:把对数据库的操作组件交给工厂去做,而调用方不必知道需要调用什么组件来操作特定的数据库。比如: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() 方法中直接调用接口的实现来访问数据库,而不必知道接口的具体实现是怎样的。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶