这就需要我们在实际开发过程中将这些数据库访问类再作一次封装
经过这样的封装
不仅可以达到上述的目标
还可以减少操作数据库的步骤
减少代码编写量
在这个方面
微软为我们提供了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 ServerOracle和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(ppDatabaseType)
{
case(DatabaseTypeMSSQLServer):
dataAccess = new MSSqlDataAccess(ppConnectionString);
break;
case(DatabaseTypeOracle):
dataAccess = new OracleDataAccess(ppConnectionString);
break;
case(DatabaseTypeOleDBSupported):
dataAccess = new OleDbDataAccess(ppConnectionString);
break;
default:
dataAccess=new MSSqlDataAccess(ppConnectionString);
break;
}
return dataAccess;
}
public static DataAccess CreateDataAccess()
{
return CreateDataAccess(defaultPersistenceProperty);
}
}
好了现在一切都完成了客户端在代码调用的时候可能就是采用如下形式
PersistenceProperty pp = new PersistenceProperty();
ppConnectionString = \server=;uid=sa;pwd=;database=Northwind;\;
ppDatabaseType = DatabaseType MSSQLServer;
ppUserID = sa;
ppPassword = ;
DataAccess db= DataAccessFactoryCreateDataAccess(pp)
dbOpen();
……//db需要的操作
dbClose();
或者如果事先设定了DataAccessFactory的DefaultPersistenceProperty属性可以直接使用
DataAccess db= DataAccessFactoryCreateDataAccess()方法创建DataAccess实例
当数据库发生变化的时候只需要修改PersistenceProperty的值客户端不会感觉到变化也不用去关心这样实现了良好的封装性当然前提是你在编写程序的时候没有用到特定数据库的特性例如Sql Server的专用函数