基于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…

php 判断修改成功,PHP判断文件是否被修改实例

在网站的管理系统中&#xff0c;有时需要查看某个文件是否被修改过、在什么时间被修改的、最后的修改时间是什么时候&#xff0c;本实例就可以实现这个功能&#xff0c;对表单中提交的文件进行判断&#xff0c;检测出修改时间。关键技术本实例主要应用filectime()和filemtime()…

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;由…

linux刷命令脚本,linux – 如何调试bash脚本并获得每个命令的执行时间

这是尽可能接近内置bash调试工具的答案,因为它从脚本执行开始时间提供了整体时序信息.在脚本的顶部添加此项以进行第二次计数&#xff1a;export PS4[${SECONDS}s][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:${FUNCNAME[0]}(): }; set -x;相同,但用毫秒代替&#xff1a;Ndate …

指定查询条件,查询对应的集合List(单表)

TestDao.java&#xff08;测试类&#xff09; Test public void findCollectionByConditionNoPage(){ ApplicationContext ac new ClassPathXmlApplicationContext("beans.xml"); IElecTextService elecTextService (IElecTextService) ac.getBean(IElecTextServ…

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;必须要加强对其日常维护与检修…

《程序员开发心理学》阅读笔记一

今天开始阅读《程序员开发心理学》这本书&#xff0c;只是开了个小头。 这本书的开篇就提到了作者对于阅读程序的看法&#xff0c;正如老师交给我们的一样&#xff0c;在学习编程的时候第一步就是要学习&#xff0c;只有多看别的的程序、代码才有可能把它转化为自己的东西&…

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

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

linux服务器上网页变形,Linux服务器上用iScanner删除网页恶意代码的方法

第一步&#xff1a;安装首先要确保服务器上已经安装了Ruby复制代码代码如下:#ruby -v //查看ruby的版本信息如果服务器上没有安装&#xff0c;可以通过yum或者apt-get安装ruby(根据自己服务器系统选择对应的方法安装)复制代码代码如下:#yum install ruby //centos用yum安装#apt…

切图总结

前些日子仿了优酷的首页&#xff0c;中间遇到一些问题&#xff0c;积累了点经验&#xff0c;做个总结。1. 需要最先明白的两点 不要只是无脑的切图&#xff0c;要去体会设计师的意图&#xff0c;不仅仅是还原设计稿&#xff0c;而且要尽可能去还原设计师的设计理念。切图的时候…

linux更改cxxflags环境变量,在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)...

为了能中一个系统上开发64或32位C程序&#xff0c;费了些周折&#xff0c;现在终于能够开始干过了。在此记录此时针对Q5.4版本的32位开发环境配置过程。1. 下载Qt 5.4 的32位版本&#xff0c;进行安装&#xff0c;安装过程中会发现一些32位的库没有安装&#xff0c;根据提示的错…

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…