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

因为一个客户朋友的需求,须要个人Winform开发框架支持国产达梦数据库的操做,这个数据库很早就听过,可是真正通常项目用的不多,通常在一些特殊的项目可能须要用到。因为个人Winform开发框架,是基于Enterprise Library的数据访问层的实现,所以增长一个数据库的支持很容易,本文介绍如何在框架层面上支持这种神秘的国产数据库-达梦数据库。sql

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

达梦数据库管理系统是达梦公司推出的具备彻底自主知识产权的高性能数据库管理系统,简称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,不过这个是必须的。框架

 

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

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

若是增长多一种数据库,那么咱们增长多一个Enterprise Library的组件扩展类,并在业务数据模块里面增长对应的DAL层便可。工具

对于具体的DALSQL这样的数据实现层,咱们不须要把数据访问的处理操做在所有的类里面实现一遍,咱们能够经过抽象类的方式,把常规的数据库处理操做抽象到基类上面,以下所示。性能

这样在BaseDALSQL层(SqlServer数据库的个性化实现部分),只须要实现部分功能便可,咱们把大多数的数据库操做,放到最顶级的数据库访问基类AbstractBaseDAL类上,从而是咱们可以尽量减小增长不一样数据库类型,须要改写代码的数量。测试

最终咱们增量增长一个数据访问层就能够实现了另一种数据库(达梦数据库)的实现了,具体的架构设计图以下所示。ui

 

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

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

咱们知道,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这样就能够了。

相关文章
相关标签/搜索