基于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
基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作相关推荐
- DM8(达梦数据库)基于建库SQL生成ER图,基于ER图生成数据库文档
今天项目经理让我导出DM8 数据库说明文档,我立刻想到了数据库文档生成工具(screw-钉子),我立刻添加相关maven 依赖,编写junit 单元代码.但是执行的结果让我很沮丧. 相关依赖和Juni ...
- shardingsphere 支持达梦数据库
1.项目中分表分库插件用的是 shardingsphere,现在需要从mysql 数据转移到达梦数据库. 2.但是shardingsphere并不支持达梦数据库,所以查看了源码.基于shardings ...
- 达梦数据库基于操作系统本机身份验证登录数据库
简单介绍 达梦数据库基于操作系统身份验证的登录方式类似Oracle的操作系统认证登录方式(/ as sysdba). 达梦数据库基于操作系统的身份验证分为本机验证和远程验证,本机验证需要将DM ...
- 达梦数据库DCA培训笔记(基于dm8)
1. 数据库安装 1.1 安装规划 1.1.1 规划安装用户和用户组 达梦数据库安装不推荐使用root用户,规划使用单独的用户安装. #创建分组 groupadd dinstall #创建用户 use ...
- 达梦数据库支持的数据类型
达梦数据库的数据类型是很齐全的,oracle有的也基本有,达梦数据库为了跟oracle做兼容,特地设置了跟oracle一样的varchar2的类型. 字符型:char.varchar 数值类型:num ...
- Nacos支持达梦数据库方法
Nacos支持达梦数据库方法 一.Nacos有自己内置的数据库,也可以使用外置数据库,目前nacos默认支持mysql数据库.参考了一些网上的做法,都是需要加达梦数据库驱动和修改源码方式来适配达梦数据 ...
- IoTSharp 已支持国产松果时序数据库PinusDB
PinusDB 是一款国产的时序数据库, 目前在Windows平台可用, 其部署简单, 纯C++编写. 出自国人之手.它一款针对中小规模(设备数少于10万台,每天产生的数据量少于10亿条)场景设计的时 ...
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...
- icmp基于tcp还是udp_imi -- 基于PHP协程应用开发框架,支持WebSocket,TCP,UDP应用开发...
介绍 imi 是基于 PHP Swoole 的高性能协程应用开发框架,它支持 HttpApi.WebSocket.TCP.UDP 服务的开发. 在 Swoole 的加持下,相比 php-fpm 请求响 ...
最新文章
- stm32 DMA 配置 串口程序
- 计算机16进制应用,16进制计算器安装方法 16进制计算器使用技巧
- python中字母大小写的转换,和一些字典的常规操作
- 当深度学习遇上图: 图神经网络的兴起!(文末送书)
- JTextField类(单行文本框)/JPasswordFiel(密码框)/JTextArea(多行文本框)常用方法
- 字符串string类使用总结
- 怎么建立微信生态用户增长模型?
- ElasticSearch之高亮显示
- ubuntu服务器上提示 To run a command as administrator (user “root“), use “sudo <command>“. See “ 解决方案
- 基于STM32制作万能遥控器---1
- shell特殊命令 sort_wc_unip命令
- android多开原理和检测。
- OutMan——Objective-C内存管理
- 大厂程序员的一天是如何度过的?
- 常用的python读写函数
- 图片太大怎么压缩变小?压缩有技巧
- ArcGIS工具 - 批量删除空图层
- ubuntu如何设置默认程序打开方式
- erlang, 支付宝, 以及其他
- 安盎顺汲称叫蒲惺勤狙陡邮可王大胖,从小就和他这个堂弟要好,听了此事,当然不肯罢休,找上
热门文章
- 什么是二叉树?以及二叉树如何遍历?
- python 面向对象 新式类和经典类
- localStorage和sessionStorage的简单使用
- poj 1715 Hexadecimal Numbers 排列组合
- 我写的几篇技术文章之一:Windows消息拦截技术的应用
- Bootstrap FileInput(文件上传)中文API整理
- 05-Flutter移动电商实战-dio基础_引入和简单的Get请求
- MyEclipse创建struts.xml
- 64位Windows2003 Enterprise sp2 上64位Oracle10.2.0.1升级到Oracle10.2.0.3具体步骤
- java实现map和object互转