基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到。由于我的Winform开发框架,是基于Enterprise Library的数据访问层的实现,因此增加一个数据库的支持很容易,本文介绍如何在框架层面上支持这种神秘的国产数据库-达梦数据库。

1、达梦数据库的简单介绍

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统的最新版本是7.0版本,简称DM7。DM7提供对SQL92的特性支持以及SQL99的核心级别支持;支持多种数据库开发接口,包括OLE DB、ADO、ODBC、OCI、JDBC、Hibernate、PHP、PDO、DB Express以及.Net DataProvider等。

达梦数据库可以在(http://www.dameng.com/)上下载试用,安装好后提供很多管理工具,安装后可以让它创建一些实例数据库,以方便我们了解数据库的基本操作,本人对这款数据库了解不多,不过它号称支持SQL-92标准的,那么使用起来就不会有什么问题的,只是一些个性化的语法需要查询即可。

达梦数据库的分析器,可以在上面执行自己的一些语句,注意它的数据库表必须带上一个模式前缀,类似SqlServer的dbo,不过这个是必须的。

 

2、基于Enterprise Library的Winform开发框架的架构支持处理

我的这款基于Enterprise Library的开发框架,底层使用了微软的数据访问组件Enterprise Library,以适应多种数据库类型的操作,它的分层如下所示,每个DAL层(如DALSQL、DALOracle等)都提供了对应数据库的实现,界面层一下的分层图如下所示。

如果增加多一种数据库,那么我们增加多一个Enterprise Library的组件扩展类,并在业务数据模块里面增加对应的DAL层即可。

对于具体的DALSQL这样的数据实现层,我们不需要把数据访问的处理操作在全部的类里面实现一遍,我们可以通过抽象类的方式,把常规的数据库处理操作抽象到基类上面,如下所示。

这样在BaseDALSQL层(SqlServer数据库的个性化实现部分),只需要实现部分功能即可,我们把大多数的数据库操作,放到最顶级的数据库访问基类AbstractBaseDAL类上,从而是我们能够尽可能减少增加不同数据库类型,需要改写代码的数量。

最终我们增量增加一个数据访问层就可以实现了另外一种数据库(达梦数据库)的实现了,具体的架构设计图如下所示。

 

3、具体接入测试案例代码

上面小节,我们论证了框架的可扩展性,并且理论上已经具备支持达梦数据库的扩张了,本小节介绍如何具体实现达梦数据库的底层接入操作,并编写一个简单的测试例子进行测试,印证我们的实现思路。

我们知道,Enterprise Library实现其他数据库的支持,需要增加一个组件扩展类,如EntLibContrib.Data.SQLite是用来支持SQLite数据库的,EntLibContrib.Data.MySql是用来支持Mysql的,这个扩展类的内容也不多,主要是用来解析如下的配置文件的.

以便能够和Enterprise Library的对象进行无缝的整合,那么我们可以参考MySql数据库的扩展类EntLibContrib.Data.MySql的做法,来创建一个基于国产达梦数据库的Enterprise Library扩展类,大概项目代码如下所示。

这样我们就可以增加配置文件如下所示,它就能正常的解析并处理了。

下面我们来编写测试的代码来印证我们的扩展类,实现Winform开发框架支持国产达梦数据库的扩展操作。

我们创建一个数据库通用操作的辅助类来进行讲解,代码如下所示。

   /// <summary>/// 基于Enterprise Library类库的数据访问测试/// </summary>public class EntLibDmHelper{public EntLibDmHelper(){}/// <summary>    /// 执行SQL查询语句,返回查询结果的所有记录的第一个字段,用逗号分隔。    /// </summary>    /// <param name="sql">SQL语句</param>    /// <returns>    /// 返回查询结果的所有记录的第一个字段,用逗号分隔。    /// </returns>    public string SqlValueList(string sql){Database db = DatabaseFactory.CreateDatabase();DbCommand command = db.GetSqlStringCommand(sql);StringBuilder result = new StringBuilder();using (IDataReader dr = db.ExecuteReader(command)){while (dr.Read()){result.AppendFormat("{0},", dr[0].ToString());}}string strResult = result.ToString().Trim(',');return strResult;}/// <summary>    /// 执行SQL查询语句,返回所有记录的DataTable集合。    /// </summary>    /// <param name="sql">SQL查询语句</param>    /// <returns></returns>    public  DataTable SqlTable(string sql){DataSet ds = new DataSet();Database db = DatabaseFactory.CreateDatabase();DbCommand command = db.GetSqlStringCommand(sql);return db.ExecuteDataSet(command).Tables[0];}}

注意,上面的代码没有用到达梦的具体对象,而是使用了Enterprise Library的Database等对象来操作,这样也就是非常方便我们进行接口的抽象处理,可以把更多的功能放到数据库访问抽象类里面了。

如果是利用达梦的.NET Provider的对象处理数据库,那么具体的代码应该是这样的。

        /// <summary>    /// 执行SQL查询语句,返回查询结果的所有记录的第一个字段,用逗号分隔。    /// </summary>    /// <param name="sql">SQL语句</param>    /// <returns>    /// 返回查询结果的所有记录的第一个字段,用逗号分隔。    /// </returns>    public string SqlValueList(string sql){DmConnection connection = new DmConnection(ConnectionString);DmCommand cmd = new DmCommand(sql, connection);connection.Open();StringBuilder result = new StringBuilder();using (DmDataReader dr = cmd.ExecuteReader()){while (dr.Read()){result.AppendFormat("{0},", dr[0].ToString());}}string strResult = result.ToString().Trim(',');return strResult;}/// <summary>    /// 执行SQL查询语句,返回所有记录的DataTable集合。    /// </summary>    /// <param name="sql">SQL查询语句</param>    /// <returns></returns>    public DataTable SqlTable(string sql){DataSet ds = new DataSet();DmDataAdapter adpater = new DmDataAdapter(sql, ConnectionString);adpater.Fill(ds);return ds.Tables[0];}

 

为了方便测试,我编写一个简单的查询例子来进行介绍,如下代码所示,这里我们主要利用了EntLibDmHelper这个辅助类对象,也就是基于Enterprise Library的扩展的处理操作。

        private void btnSearch_Click(object sender, EventArgs e){BindData();}private void BindData(){string condition = "1=1 ";if (this.txtAuthor.Text.Length > 0){condition += string.Format("AND Author like '%{0}%' ", this.txtAuthor.Text);}if (this.txtName.Text.Length > 0){condition += string.Format("AND Name like '%{0}%' ", this.txtName.Text);}if (this.txtPublisher.Text.Length > 0){condition += string.Format("AND Publisher like '%{0}%' ", this.txtPublisher.Text);}string sql = "Select * from PRODUCTION.Product Where " + condition;EntLibDmHelper helper = new EntLibDmHelper();//DMHelper helper = new DMHelper();DataTable dt = helper.SqlTable(sql);this.dataGridView1.DataSource = dt;sql = "Select count(*) from PRODUCTION.Product Where " + condition;string totalCount = helper.SqlValueList(sql);this.lblCount.Text = string.Format("共有数据:{0}条", totalCount);}

最后例子运行的界面效果如下所示。

基本上印证了我们对框架的整合,实现了支持国产达梦数据库的扩展操作。剩下的就是我们模仿着把BaseDALSQL这样的基类,为达梦数据库增加一个个性化的数据库处理接口,就可以实现整体性框架的支持了。对于各个模块 的数据访问,我们需要增加一个DALDM这样的实现层,基类指向BaseDALDM这样就可以了。

 

转载于:https://www.cnblogs.com/wuhuacong/p/4532025.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle经纬度换算成xy坐标,xy坐标转换经纬度【处置步骤】

很多小伙伴都遇到过xy坐标转换经纬度的困惑吧&#xff0c;一些朋友看过网上零散的xy坐标转换经纬度的处理方法&#xff0c;并没有完完全全明白xy坐标转换经纬度是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xff0c;只需要按照1&#xff1a;一、直角坐标转经纬度(…

零基础不建议学前端_web前端培训心得:零基础怎样学好web前端

转行学web前端&#xff0c;这是不少人的选择&#xff0c;毕竟目前互联网行业受到了太多的关注&#xff0c;而很多人纷纷需要向互联网方面转型。而谈到转型&#xff0c;web前端无疑是很多人的选择&#xff0c;这是因为web前端属于可见即可得的编程语言&#xff0c;写出来就能看到…

关于使用Transaction对于非数据库事务的操作

在操作数据库的过程中&#xff0c;为了数据的一致性&#xff0c;我们可以使用Transaction&#xff0c;要么成功的时候全部提交&#xff0c;要么有任何一个操作失败立即全部回滚。不仅仅是在数据库方面&#xff0c;有时候操作其他的内容&#xff0c;比如说对于系统文件的操作&am…

nginx管理面板_吸塑包装自建网站上线,阿里云ecs+bt面板+WordPress

吸塑包装网站搭建是我经过对比了织梦dede、帝国和WordPress后选择了WordPress&#xff0c;从本地搭建的apache搬迁到阿里云ecs服务器。第一步&#xff0c;为了后期多网站的管理&#xff0c;安装了宝塔面板&#xff0c;做了域名解析。第二步&#xff0c;备份所有文件和数据库。在…

linux下c 编译脚本,Linux下编译C语言与makefile脚本语言

GCC1.Source CRT 软件&#xff1a;可以控制linux的终端。2.FileZilla 软件&#xff1a; windows 远程传文件到linux.使用sourceinsight 文本编辑器一linux编译过程&#xff1a;C语言编译器gcc 预处理指令-E &#xff0c;汇编指令-s &#xff0c;编译指令 -c &#xff0c; 链接指…

Teamwork(The sixth day of the team)

每日列会过后&#xff0c;我们的工作进度都有所进展了&#xff0c;好开心&#xff0c;但是还不是我们想要的&#xff0c;我们想做得更快&#xff0c;更好。 转载于:https://www.cnblogs.com/Lingchao/p/4535939.html

微软的平板电脑_Microsoft 微软 Surface Go 2 10.5英寸二合一平板电脑(m3-8100Y、8GB、128GB、LTE) 5788元...

Microsoft 微软 Surface Go 2 英寸二合一平板电脑(m3-8100Y、8GB、128GB、LTE)【PConline 聚超值】Surface Go 2是一款主打便携的二合一产品&#xff0c;外观上与上代产品相比&#xff0c;屏幕尺寸提升为英寸&#xff0c;屏幕分辨率从1800*1200 增加到 1920*1280&#xff0c;由…

PyCharm社区版支持深度学习_深度学习,大家都看哪些社区论坛?

对代码、编程感兴趣的可以加我公众号<老K玩代码>&#xff0c;和我交流!“学习Python&#xff0c;有一半的小伙伴是冲着深度学习来的。自学虽好&#xff0c;但还是需要有人指点。那有没有什么研究深度学习的朋友比较会聚集的网络社区或平台工具呢&#xff1f;其实是有的&a…

linux 自带 mysql,linux下安装mysql

1.查看CentOS自带的mysqlrpm -qa | grep mysql2.卸载CentOS自带的mysqlrpm -e --nodeps 要卸载的软件3.下载mysql.tar将mysql压缩包通过xftp连接到linux上4.上传mysql到linuxroot登录xshell5.在/usr/local/下创建mysql文件夹&#xff0c;解压Mysql到mysql目录cd /usr/localmkdi…

石油化工设备维护检修规程_旋回破碎机横梁臂架、衬板、内外铜套检修步骤及设备检修维护要点...

旋回破碎机做为常用的头破粗碎设备&#xff0c;其突出优势就是产能高&#xff0c;破碎比大&#xff0c;可达6-9.5&#xff0c;个别情况到13.5&#xff0c;且工作平稳&#xff0c;振动小。为了保障旋回破碎机在工作时保持良好的运行状态&#xff0c;必须要加强对其日常维护与检修…

摄像头图像分析目标物体大小位置_摄像头的原理、组成、选型及应用

目录一、摄像头成像的光学原理二、摄像头模组构成以及功能原理三、摄像头名词释义四、摄像头参数解析五、摄像头选型一、摄像头成像的光学原理1.1 光学的基本定律&#xff08;1&#xff09;光线直线传播定律&#xff1a;在统一均匀介质中&#xff0c;光沿直线传播&#xff08;2…

git 合并冲突_GIT提交记录和Revert commit过程分析

一、根据GIT提交记录查看提交过程先做个git分支的背景介绍图1步骤说明1⃣️ 项目A 默认分支是 master2⃣️ 基于master分支创建 f1、f2、test分支3⃣️ f1 发起合并请求到 test分支4⃣️ f2 fetch & merge test分支 &#xff08;此时可能会有冲突&#xff09;5⃣️ &#x…

使用android-junit-report.jar导出单元测试报告

Android在使用脚本编译和测试时&#xff0c;使用默认的testrunner不会输出文件类型的单元测试报告&#xff0c;每次只能分析logcat的无法直观的看到单元测试结果和报告&#xff0c;这给编写自动化脚本带来了不少麻烦&#xff0c;虽然可以自己动手编写支持junit测试报告输出的Te…

2020.2idea创建web_使用IDEA配置Tomcat(亲测成功)

优质文章导读: XML入门(零基础教程) 一文了解Java反射 Servlet入门(零基础教程)配置环境变量打开环境变量设置,点击新建 新建两个变量CATALINA_HOME和CATELINA_BASE,变量值为Tomcat的安装路径 打开Path 添加进去刚刚创建的两个变量 IDEA中配置Tomcat创建web项目 点击 号 选择 …

linux打开另一台linux的图形化,【工具大道】ssh登录Linux服务器,并显示图形化界面...

点击关注微信公众号 "程序员的文娱情怀"分享提纲&#xff1a;1. 概述2. mac版实现ssh登录&#xff0c;显示图形化1. 概述平时ssh登录到Linux服务器都是在命令行下进行操作的&#xff0c;简单高效。但是有些时候&#xff0c;需要配置一些Linux系统下的图形化软件的参数…

c++循环执行一个函数_循环

循环目标程序的三大流程while 循环基本使用break 和 continuewhile 循环嵌套01. 程序的三大流程在程序开发中&#xff0c;一共有三种流程方式&#xff1a;顺序 —— 从上向下&#xff0c;顺序执行代码分支 —— 根据条件判断&#xff0c;决定执行代码的 分支循环 —— 让 特定代…

如何配置一个最基本的web富文本编辑器?--之wangEditor(验证成功)

第一步&#xff0c;引用wangEditor的css文件&#xff0c;css文件最好在<head>中引用 <link rel"stylesheet" type"text/css" href"css/wangEditor-1.3.0.min.css"> 第二步&#xff0c;引用jquery和wangEditor.js&#xff0c;js文件最…

地表反射率影响因素_【热岛强度可影响城市夏季降水落区】

本期嘉宾&#xff1a;北京城市气象研究院研究员 苗世光 副研究员 张亦洲采访人&#xff1a;中国气象报记者 宛霞 通讯员 楚艳丽本期观点&#xff1a;城市化对天气的影响越来越显著 &#xff0c;城市热岛强度可作为区分城市下垫面对夏季降水影响类型的重要因素。一直以来&#x…

gitlab 将管理员权限移交给ldap账户_CDPDC中Atlas集成FreeIPA的LDAP认证

文档编写目的Cloudera从CM6.3版本开始&#xff0c;引入了Red Hat IdM来做整个集群的认证&#xff0c;Red Hat IdM对应的软件为FreeIPA&#xff0c;在本文中描述如何使用FreeIPA来做CDP-DC集群的认证。关于FreeIPA服务器搭建参考<使用FreeIPA对Linux用户权限统一管理>。之…

emwin edit控制的输入长度小数点怎么处理_变频器学习,变频器主电路与控制回路学习...

一、变频器主电路的接线流程1、当我们拿到变频器&#xff0c;挤压变频器两侧凹槽&#xff0c;打开上盖&#xff0c;取下挡线板&#xff0c;变频器的R, S, T端子接电源线&#xff0c;U, V, W端子接电机线&#xff0c;地线符号处接地线。2、我们将电源线的黄、绿、红按照顺序接到…