C# 使用设计模式构建通用数据库访问类


  C# 使用设计模式构建通用数据库访问类C# 使用设计模式构建通用数据库访问类

 

      在应用程序的设计中,数据库的访问是非常重要的,我们通常需要将对数据库的访问集中起来,以保证良好的封装性和可维护性。在.Net中,数据库的访问,对于微软自家的SqlServer和其他数据库(支持OleDb),采用不同的访问方法,这些类分别分布于 System.Data.SqlClient和System.Data.OleDb名称空间中。微软后来又推出了专门用于访问Oracle数据库的类库。 我们希望在编写应用系统的时候,不因这么多类的不同而受到影响,能够尽量做到数据库无关,当后台数据库发生变更的时候,不需要更改客户端的代码。


这 就需要我们在实际开发过程中将这些数据库访问类再作一次封装。经过这样的封装,不仅可以达到上述的目标,还可以减少操作数据库的步骤,减少代码编写量。在 这个方面,微软为我们提供了Application Block,但是,可惜的是目前只支持Sql Server。这里,介绍一种在实际应用中得到了非常好的效果的实作策略——笔者编写的Websharp框架中的数据访问结构。Factory设计模式是 使用的主要方法。
我们先来看看Factory的含义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。我们这里可能会处理对多种数据库的操作,因此,需要首先定义一个操纵数据库的接口,然后,根据数据库的不同, 由类工厂决定实例化哪个类。 



下面,我们首先来定义这个访问接口。为了方便说明问题,我们在这里只列出了比较少的方法,其他的方法是很容易参照添加的。


public interface DataAccess
{
   DatabaseType DatabaseType{get;} //数据库类型
   IDbConnection DbConnection{get;} //得到数据库连接
   void Open(); //打开数据库连接
   void Close(); //关闭数据库连接
   IDbTransaction BeginTransaction(); //开始一个事务
   int ExecuteNonQuery(string commandText); //执行Sql语句
   DataSet ExecuteDataset(string commandText);//执行Sql,返回DataSet
}


UML图


 


因为,DataAccess的具体实现类有一些共同的方法,所以,先从DataAccess实现一个抽象的AbstractDataAccess类,包含一些公用方法。然后,我们分别为Sql Server、Oracle和OleDb数据库编写三个数据访问的具体实现类:


public sealed class MSSqlDataAccess : AbstractDataAccess
{
   ……//具体实现代码。
}



public class OleDbDataAccess : AbstractDataAccess
{
   ……//具体实现代码。
}


public class OracleDataAccess : AbstractDataAccess
{
   ……//具体实现代码。
}


由AbstractDataAccess抽象类实现3个子类
UML图:



现在我们已经完成了所要的功能,下面,我们需要创建一个Factory类,来实现自动数据库切换的管理。这个类很简单,主要的功能就是根据数据库类型,返回适当的数据库操纵类。
 
public sealed class DataAccessFactory
{
   private DataAccessFactory(){}
   private static PersistenceProperty defaultPersistenceProperty;
   public static PersistenceProperty DefaultPersistenceProperty
   {
      get{return defaultPersistenceProperty;}
      set{defaultPersistenceProperty=value;}
   }
   public static DataAccess CreateDataAccess(PersistenceProperty pp)
   {
      DataAccess dataAccess;
      switch(pp.DatabaseType)
      {
         case(DatabaseType.MSSQLServer):
         dataAccess = new MSSqlDataAccess(pp.ConnectionString);
         break;
         case(DatabaseType.Oracle):
         dataAccess = new OracleDataAccess(pp.ConnectionString);
         break;
         case(DatabaseType.OleDBSupported):
         dataAccess = new OleDbDataAccess(pp.ConnectionString);
         break;
         default:
         dataAccess=new MSSqlDataAccess(pp.ConnectionString);
         break;
      }
      return dataAccess;
   }
   public static DataAccess CreateDataAccess()
   {
      return CreateDataAccess(defaultPersistenceProperty);
   }
}



工厂类实现完成,请看构建通用数据库访问类完整UML图:




好了,现在,一切都完成了,客户端在代码调用的时候,可能就是采用如下形式: 


PersistenceProperty pp = new PersistenceProperty();
pp.ConnectionString = "server=127.0.0.1;uid=sa;pwd=;database=Northwind;";
pp.DatabaseType = DatabaseType. MSSQLServer;
pp.UserID = “sa”;
pp.Password = “”;
DataAccess db= DataAccessFactory.CreateDataAccess(pp)
db.Open();
……//db.需要的操作
db.Close();



或者,如果事先设定了DataAccessFactory的DefaultPersistenceProperty属性,可以直接使用
DataAccess db= DataAccessFactory.CreateDataAccess()方法创建DataAccess实例。
当数据库发生变化的时候,只需要修改PersistenceProperty的值,客户端不会感觉到变化,也不用去关心。这样,实现了良好的封装性。当然,前提是,你在编写程序的时候,没有用到特定数据库的特性,
例如,Sql Server的专用函数。


本文转自cnblogs,本站责任编辑



C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:C# 使用List<String>泛型读取和保存文本文件
下一篇:[转帖]FreeTextBox添加自定义按钮
评论列表

发表评论

评论内容
昵称:
关联文章

C# 使用设计模式构建通用数据库访问
C#设计模式-窗体基模板方法定义
GoF设计模式访问模式(Visitor Pattern)—操作复杂对象结构
GoF设计模式:代理模式(Proxy Pattern)—对象的间接访问
C#设计模式应用-单件模式(Singleton Pattern)
CSFramework通用自动提交数据工具(DbDataUpdate),支持MsSQL,MySQL,Oracle三种数据库
C#数据访问层主.(SqlHelper)SQLDataAccess.cs
使用配置文件构建使用WCF服务(WCF Service)
WCF模式以及ADO-Direct模式|C/S框架网
C# Excel xls文件导入程序Excel数据库通用XlsFileDB
基于角色访问控制的权限系统设计
如何使用数据库IDatabase接口以及数据访问层应用
ADO Direct(直连模式)能不能改成客户端在服务端注册后再访问数据库
GoF设计模式:组合模式(Composite Pattern)—树形结构的处理
.NET Core Configuration使用方法
GoF设计模式:工厂模式(Factory Pattern)
GoF设计模式:原型模式(Prototype Pattern)—对象的克隆
Winform通用框架(C#.NET)之权限管理系统详细设计|C/S框架网
GoF设计模式:装饰模式(Decorator Pattern)—扩展系统功能
C#拖动鼠标移动Form窗体,移动Panel面板通用(FormDragDrop)

热门标签
.NET5 .NET6 .NET7 APP Auth-软件授权注册系统 Axios B/S B/S开发框架 Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 DAL数据访问层 Database datalock DbFramework Demo教学 Demo下载 DevExpress教程 DOM EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS NavBarControl Node.JS NPM OMS ORM PaaS POS Promise API Redis SAP SEO SQL SQLConnector TMS系统 Token令牌 VS2022 VSCode VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 版本区别 报表 踩坑日记 操作手册 代码生成器 迭代开发记录 基础资料窗体 架构设计 角色权限 开发sce 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 秘钥 密钥 权限设计 软件报价 软件测试报告 软件简介 软件开发框架 软件开发平台 软件开发文档 软件体系架构 软件下载 软著证书 三层架构 设计模式 生成代码 实用小技巧 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序