数据库访问层设计与实现(2)

原创 2006年05月28日 21:55:00

2 约定

1)本文中谈及的数据库仅限于关系数据库。数据库类型指不同的关系数据库系统,如OracleSQL ServerSybase等等。

2数据库对象ADO.NET中访问数据库的对象:Connection对象,Command对象,Adapter对象、Parameter对象。

3 应用程序的一般结构

通常,数据库相关的应用程序应该具有图1所示的结构。至于为什么,就不用多说了。从图中可以看到数据库访问层所处的位置,及其应该具有的功能。

图1 应用程序一般结构

1 应用程序一般结构

4 适应不同类型的数据库

如第1节所述,在ADO.NET中,使用不同类型的数据库,主要就是这些数据库对象的变化:ConnectionCommandAdapterParameter。在程序中我们需要根据不同的数据库创建合适的对象。

通常的简单做法是使用条件判断,是何种类型的数据库,创建相应的数据库对象,代码如下:

[示例代码1] 简单,但缺乏弹性和复用性的方法

    /// <summary>

    /// 数据库类型。

    /// </summary>

    public enum DbType

    {

        SqlServer,

        Oracle,

        OleDb,

    }

 

    class DbObjectFactory

    {

        /// <summary>

        /// Connection 对象的创建。

        /// </summary>

        /// <param name="dbType">数据库类型。</param>

        /// <returns>Connection 对象。</returns>

        public static IDbConnection CreateConnection(DbType dbType)

        {

            switch(dbType)

            {

                case DbType.SqlServer:

                    return new SqlConnection();

                case DbType.Oracle:

                    return new OracleConnection();

                case DbType.OleDb:

                    return new OleDbConnection();

            }

            throw new Exception("不支持的数据库类型。");

        }

 

        /// <summary>

        /// Parameter 对象的创建。

        /// </summary>

        /// <param name="dbType">数据库类型。</param>

        /// <returns>Parameter 对象。</returns>

        public static IDataParameter CreateParameter(DbType dbType)

        {

            switch(dbType)

            {

                case DbType.SqlServer:

                    return new SqlParameter();

                case DbType.Oracle:

                    return new OracleParameter();

                case DbType.OleDb:

                    return new OleDbParameter();

            }

            throw new Exception("不支持的数据库类型。");

        }

    }

上面的代码中都是条件判断,而且CreateConnection函数和CreateParameter函数代码几乎一样,DataAdapterCommand的创建也是如此。这样的做法缺点主要有两点:

1)代码重复,可维护性差;

2)新增加一种数据库类型时,需要修改现有的代码。

其实我们仔细分析以下数据库类型和对象之间的关系,可以发现图2所示的规律:

图2 不同数据库和对象的关系

2 不同数据库和对象的关系

很明显,采用抽象工厂模式可以很好的处理不同数据库和不同数据库对象之间的组和系列的关系。如图3

图3 数据库对象工厂设计

3 数据库对象工厂设计

根据上面的类图,生成C#代码如下:

[示例代码2: DbObjectFactory.cs] (有删节)

    /// <summary>

    /// 数据库对象工厂的虚基类。

    /// </summary>

    public abstract class DbObjectFactory

    {

        /// <summary>

        /// 创建数据库连接对象,并打开连接。

        /// </summary>

        /// <returns> 数据库连接。返回null 表示连接失败。</returns>

        public abstract IDbConnection CreateConnection();

 

        /// <summary>

        /// 创建Command 对象。

        /// </summary>

        /// <returns> 执行SQL Command 对象。</returns>

        public abstract IDbCommand CreateCommand();

 

        /// <summary>

        /// 创建DbDataAdapter 对象。

        /// </summary>

        /// <returns>DbDataAdapter 对象。</returns>

        public abstract IDbDataAdapter CreateDataAdapter();

 

        /// <summary>

        /// 创建Parameter 对象。

        /// </summary>

        /// <returns>Parameter 对象。</returns>

        public abstract IDataParameter CreateParameter();

    }

[示例代码3: OleDbObjectFactory.cs] (有删节)

    /// <summary>

    ///  OleDb 数据库对象工厂。

    /// </summary>

    public class OleDbObjectFactory : DbObjectFactory

    {

        /// <summary>

        /// 创建数据库连接对象,并打开连接。

        /// </summary>

        /// <returns> 数据库连接。返回null 表示连接失败。</returns>

        public override IDbConnection CreateConnection()

        {

            return new OleDbConnection();

        }

 

        /// <summary>

        /// 创建Command 对象。

        /// </summary>

        /// <returns> 执行SQL Command 对象。</returns>

        public override IDbCommand CreateCommand()

        {

            return new OleDbCommand();

        }

 

        /// <summary>

        /// 创建DbDataAdapter 对象。

        /// </summary>

        /// <returns>DbDataAdapter 对象。</returns>

        public override IDbDataAdapter CreateDataAdapter()

        {

            return new OleDbDataAdapter();

        }

 

        /// <summary>

        /// 创建Parameter 对象。

        /// </summary>

        /// <returns>Parameter 对象。</returns>

        public override IDataParameter CreateParameter()

        {

            return new OleDbParameter();

        }

    }

[示例代码4: OleDbObjectFactory.cs] (有删节)

    /// <summary>

    /// Sql Server 数据库对象工厂。

    /// </summary>

    public class SqlObjectFactory : DbObjectFactory

    {

        /// <summary>

        /// 创建数据库连接对象,并打开连接。

        /// </summary>

        /// <returns> 数据库连接。返回null 表示连接失败。</returns>

        public override IDbConnection CreateConnection()

        {

            return new SqlConnection();

        }

 

        /// <summary>

        /// 创建Command 对象。

        /// </summary>

        /// <returns> 执行SQL Command 对象。</returns>

        public override IDbCommand CreateCommand()

        {

            return new SqlCommand();

        }

 

        /// <summary>

        /// 创建DbDataAdapter 对象。

        /// </summary>

        /// <returns>DbDataAdapter 对象。</returns>

        public override IDbDataAdapter CreateDataAdapter()

        {

            return new SqlDataAdapter();

        }

 

        /// <summary>

        /// 创建Parameter 对象。

        /// </summary>

        /// <returns>Parameter 对象。</returns>

        public override IDataParameter CreateParameter()

        {

            return new SqlParameter();

        }

    }

使用时,根据应用环境的数据库类型,创建相应的具体工厂对象即可。这样就避免了使用生硬的条件判断了。新增加一种类型的数据库时,只要添加一个类,从DbObjectFactory继承即可,而现有的代码不需要做任何的修改。

 

相关文章推荐

petshop4.0 详解之二(数据访问层之数据库访问设计)

在系列一中,我从整体上分析了PetShop的架构设计,并提及了分层的概念。从本部分开始,我将依次对各层进行代码级的分析,以求获得更加细致而 深入的理解。在PetShop 4.0中,由于引入了ASP....

图书管理系统之数据库访问层设计

数据库访问层就是通过DAO设计模式将在java代码里的操作链接到数据库的过程,具体涉及到的访问操作如下所示: 根据需求分析系统功能分为读者信息管理模块、图书信息管理模块、图书借阅管理模块、基础信...

第11章 ADO.NET数据库访问技术2

  • 2013年12月13日 14:57
  • 739KB
  • 下载

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

在应用程序的设计中,数据库的访问是非常重要的,我们通常需要将对数据库的访问集中起来,以保证良好的封装性和可维护性。在.Net中,数据库的访问,对于微软自家的SqlServer和其他数据库(支持OleD...

hibernate数据库访问接口设计

  • 2015年01月30日 21:48
  • 13KB
  • 下载

ASP.NET 系统支持数据库访问设计

系统设计时,往往要考虑到兼容多种数据库,拿常见的三种数据库:SqlServer,MySql,Oracle为例,常见的三层设计可以分为:业务逻辑层,数据访问层,实体层;他们的结构大致如下: 三种数据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库访问层设计与实现(2)
举报原因:
原因补充:

(最多只允许输入30个字)