简单工厂模式构建数据访问层以实现多种数据库之间的切换

该博客介绍了一个抽象基类`DBHandler`,用于实现数据库访问,包括连接、事务处理、数据操作等基本功能。基类包含创建`DbCommand`、`DbDataAdapter`的方法,并提供了分页查询和事务控制的抽象方法。`DBhANDlerSQLServer`子类展示了如何为SQL Server实现这些功能,包括获取序列值和执行分页查询。通过简单工厂模式,可以根据不同的数据库类型创建相应的数据库访问实例。
摘要由CSDN通过智能技术生成
1、新建一个 数据库访问基类DBHandler
  1. /// <summary>  
  2. /// 数据库访问基类  
  3. /// </summary>  
  4. public abstract class DBHandler  
  5. {  
  6.     public DBHandler() { }  
  7.  
  8.     #region 需要在子类中初始化的与数据库相关的特征类  
  9.   
  10.     protected DbConnection dbConnection = null//连接对象  
  11.     protected DbTransaction dbTransaction = null//事务对象  
  12.     protected abstract DbCommand CreateCommand(); //从子类中构建DbCommand对象  
  13.     protected abstract DbDataAdapter CreateAdapter(); //从子类中构建DbDataAdapter对象  
  14.     protected abstract void BuilderCommand(DbDataAdapter adapter); //用于Update方法,构建DbDataAdapter中的UpdateCommand/InsertCommand/DeleteCommand  
  15.     protected abstract int GetTotalCount(); //用于分页查询,获取总记录数  
  16.  
  17.     #endregion  
  18.  
  19.     #region 子类中要用的数据或方法  
  20.   
  21.     protected List<Parameter> parameters = new List<Parameter>();  
  22.     protected bool IsInTransaction = false//是否处于事务当中  
  23.     //用于分页查询,检查当前SQL是否符合基本查询要求  
  24.     protected void CheckPageSQL()  
  25.     {  
  26.         this.CommandType = CommandType.Text;  
  27.         if (!this.CommandText.StartsWith("select"truenull))  
  28.         {  
  29.             throw new Exception("sql语句必须是select开头");  
  30.         }  
  31.         if (IsInTransaction)  
  32.         {  
  33.             throw new Exception("分页查询不能在事务中");  
  34.         }  
  35.     }  
  36.  
  37.     #endregion  
  38.  
  39.     #region  用于输入初始条件的属性和方法  
  40.   
  41.     /// <summary>  
  42.     /// sql语句或存储过程名称  
  43.     /// </summary>  
  44.     public string CommandText { getset; }  
  45.   
  46.     /// <summary>  
  47.     /// 执行类型是SQL还是存储过程  
  48.     /// </summary>  
  49.     public CommandType CommandType { getset; }  
  50.   
  51.     /// <summary>  
  52.     /// 添加参数,将参数添加到List<T>列表中保存起来  
  53.     /// </summary>  
  54.     /// <param name="paraName">参数名</param>  
  55.     /// <param name="paraValue">参数值</param>  
  56.     public void AddParameter(string paraName, string paraValue)  
  57.     {  
  58.         this.parameters.Add(new Parameter(paraName,paraValue));  
  59.     }  
  60.   
  61.     /// <summary>  
  62.     /// 清空当前参数列表  
  63.     /// </summary>  
  64.     public void ClearParameter()  
  65.     {  
  66.         this.parameters.Clear();  
  67.     }  
  68.   
  69.     /// <summary>  
  70.     /// 用于分页查询,获取查询到的总记录数  
  71.     /// </summary>  
  72.     public int TotalCount  
  73.     {  
  74.         get  
  75.         {  
  76.             return this.GetTotalCount();  
  77.         }  
  78.     }  
  79.  
  80.     #endregion  
  81.  
  82.     #region 获取数据库的返回值  
  83.   
  84.     /// <summary>  
  85.     /// 获取执行结果的第一行第一列的值  
  86.     /// </summary>  
  87.     /// <returns></returns>  
  88.     public object ExecuteScalar()  
  89.     {  
  90.         try  
  91.         {  
  92.             if (dbConnection.State != ConnectionState.Open)  
  93.             {  
  94.                 dbConnection.Open();  
  95.             }  
  96.             DbCommand cmd = this.CreateCommand();  
  97.             object r = cmd.ExecuteScalar();  
  98.             if (!this.IsInTransaction)  
  99.             {  
  100.                 dbConnection.Close();  
  101.             }  
  102.             return r;  
  103.         }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值