手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
在应用程式的设计中,数据库的访问是很重要的,我们通常需要将对数据库的访问集中起来,以确保良好的封装性和可维护性。在.Net中,数据库的访问,对于微软自家的SqlServer和其他数据库(支持OleDb),采用不同的访问方法,这些类分别分布于System.Data.SqlClient和System.Data.OleDb名称空间中。微软后来又推出了专门用于访问Oracle数据库的类库。我们希望在编写应用系统的时候,不因这么多类的不同而受到影响,能够尽量做到数据库无关,当后台数据库发生变更的时候,无需更改客户端的代码。

   这就需要我们在实际研发过程中将这些数据库访问类再作一次封装。经过这样的封装,不但能够达到上述的目标,还能够减少操作数据库的步骤,减少代码编写量。在这个方面,微软为我们提供了Application Block,但是,可惜的是现在只支持Sql Server。这里,介绍一种在实际应用中得到了很好的效果的实作策略——笔者编写的Websharp框架中的数据访问结构。Factory设计模式是使用的主要方法。

   我们先来看看Factory的含义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。我们这里可能会处理对多种数据库的操作,因此,需要首先定义一个操纵数据库的接口,然后,根据数据库的不同,由类工厂决定实例化哪个类。

   下面,我们首先来定义这个访问接口。为了方便说明问题,我们在这里只列出了比较少的方法,其他的方法是很容易参照添加的。

public interface DataAccess
{
  DatabaseType DatabaseType{get;} //数据库类型
  IDbConnection DbConnection{get;} //得到数据库连接
  void Open(); //打开数据库连接
  void Close(); //关闭数据库连接

  IDbTransaction BeginTransaction(); //开始一个事务
  int ExecuteNonQuery(string commandText); //执行Sql语句
  DataSet ExecuteDataset(string commandText);//执行Sql,返回DataSet
}

   因为,DataAccess的具体实现类有一些一起的方法,所以,先从DataAccess实现一个抽象的AbstractDataAccess类,包含一些公用方法。然后,我们分别为Sql Server、Oracle和OleDb数据库编写三个数据访问的具体实现类:

public sealed class MSSqlDataAccess : AbstractDataAccess
{
  ……//具体实现代码。
}

public class OleDbDataAccess : AbstractDataAccess
{
  ……//具体实现代码。
}

public class OracleDataAccess : AbstractDataAccess
{
  ……//具体实现代码。
}

   现在我们已完成了所要的功能,下面,我们需要创建一个Factory类,来实现自动数据库转换的管理。这个类很简单,主要的功能就是根据数据库类型,返回适当的数据库操纵类。

public sealed class DataAccessFactory
{
  private DataAccessFactory(){}
  private static PersistenceProperty defaultPersistenceProperty;
  public static PersistenceProperty DefaultPersistenceProperty
  {
   get{return defaultPersistenceProperty;}
   set{defaultPersistenceProperty=value;}
  }

public static DataAccess CreateDataAccess(PersistenceProperty pp)
{
  DataAccess dataAccess;
  switch(pp.DatabaseType)
  {
   case(DatabaseType.MSSQLServer):
    dataAccess = new MSSqlDataAccess(pp.ConnectionString);
    break;
   case(DatabaseType.Oracle):
    dataAccess = new OracleDataAccess(pp.ConnectionString);
    break;
   case(DatabaseType.OleDBSupported):
    dataAccess = new OleDbDataAccess(pp.ConnectionString);
    break;
   default:
    dataAccess=new MSSqlDataAccess(pp.ConnectionString);
    break;
  }
  return dataAccess;
}

public static DataAccess CreateDataAccess()
{
  return CreateDataAccess(defaultPersistenceProperty);
}

}

   好了,现在,一切都完成了,客户端在代码调用的时候,可能就是采用如下形式:

PersistenceProperty pp = new PersistenceProperty();
pp.ConnectionString = "server=127.0.0.1;uid=sa;pwd=;database=Northwind;";
pp.DatabaseType = DatabaseType. MSSQLServer;
pp.UserID = “sa”;
pp.Password = “”;
DataAccess db= DataAccessFactory.CreateDataAccess(pp)
db.Open();
……//db.需要的操作
db.Close();

   或,假如事先设定了DataAccessFactory的DefaultPersistenceProperty属性,能够直接使用
DataAccess db= DataAccessFactory.CreateDataAccess()方法创建DataAccess实例。

   当数据库发生变化的时候,只需要修改PersistenceProperty的值,客户端不会感觉到变化,也不用去关心。这样,实现了良好的封装性。当然,前提是,您在编写程式的时候,没有用到特定数据库的特性,例如,Sql Server的专用函数。

   以上,介绍了一种通用数据库操作类的实现设计方法,希望能够对大家有所启发。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS