日期:2010-12-19  浏览次数:20552 次

摘要:本文分析现有的数据库访问中间件的现状,指出其中存在的问题,得出应用新技术的必要性。开发了一个基于Web服务技术的数据库访问中间件WSDBM,并以一个应用实例验证了该中间件的有效性。
关键词:Web服务;数据库访问中间件;.Net
 
1  引言
随着Intranet/Internet网络的迅猛发展,面向网络的分布式数据库成为支持Internet服务的关键,传统的数据库访问技术已渐渐不能满足分布式应用集成的需要。
【1】利用新技术,研究和开发新的数据库访问中间件成为数据库研究领域的主要方向之一。
        Web服务是一种崭新的分布式计算模型,基于一系列开放的技术标准,其松散耦合、语言中立、平台无关性、开放性使得它将成为下一代电子商务的架构,成为下一代的WWW。
【2】Microsoft.Net提供了基于“.Net框架”的综合开发平台,它提供了涉及客户端、服务器和服务的单独、统一的编程模型。
       “.Net框架”和Visual Studio.Net一起,给我们提供了一个完整的应用程序开发平台。
        本文主要的工作就是在Visual Studio.Net平台上,利用Web服务将现有的数据库访问方式的封装成中间件,使得封装后的中间件可以满足分布式应用的需要。
 
2  Web服务中间件接口的定义
        现有通用的数据库访问方式,它的主要操作有:设置数据库连接,打开和关闭数据库, 执行查询和执行其他的Sql语句,实现事务管理和缓冲池管理。比较先进的数据库访问方式还支持实时数据库连接。因此,为了实现对传统数据库访问方式的封装,我们首先要定义一个Web服务,这个Web服务至少应该拥有以上所列的Web方法(属性为WebMethod的public函数成员)。这些方法就组成了这个Web服务的接口。
        .Net下,Web服务的实现都封装在System.Web.Services.WebService这个类中。为了实现对数据库访问方式的Web服务的封装,我们必须定义一个新的类,它继承于WebService或是它的子类。对于相对简单的Web服务,我们直接让这个类继承于WebService。这个生成的类就成了一个具体的Web服务。
        .NET中新的关系型数据管理类都是基于类库中System.Data的一系列的名称空间,通常称这些名称空间集合为ADO.NET。System . Data包含用来访问和存储关系型数据的基础对象。Visual Studio.Net直接给我们提供了System.Data.SqlClient和OleDBClient两个命名空间,这两个命名空间分别包含有用来访问Sql Server关系数据库和其他关系数据库所需的基本对象。其中以Transaction结尾的类提供了事务管理的功能,以Connection结尾的类用于连接具体的数据库。以Command结尾的类定义了对数据库表的操作。
 
3  Web服务中间件的实现
3.1实现框架
       下面是一个简单的Web服务中间件来实现(采用Microsoft推荐的c #语言来编写)。为了实现中间件的可扩展性,我们决定不在中间件的WebMethod(Web方法)中直接实现对数据库的操作。我们先定义一个虚类DBOperator,在这个虚类中定义了对数据库操作的接口,包括数据库的打开(Open)和关闭(Close),事务的开始(BeginTrans)、事务的递交(CommitTrans)和回滚(RollbackTrans),没有返回值的Sql语句的执行(void ExecSql)和返回数据集的Sql语句的执行(DataSet ExecSql)。这样,我们的Web服务中间件的每个WebMethod就仅仅是调用了DBOperator对象的相应的成员函数。比如Web服务中间件中的Open方法就是直接调用DBOperator对象的Open方法。
3 .2具体数据库操作的实现
       为了具体实现对数据库的操作,我们需要定义DBOperator类的子类,我们以SqlDBOperator为例,显然SqlDBOperator具体实现了对Sql Server数据库的操作。

首先定义一个SqlDBOperator类,它继承于DBOperator,并导入名称空间System . Data . SqlClient。
using System.Data.SqlClient;
class SqlDBOperator:DBOperator


其次添加私有的数据成员conn,trans,inTransaction,comm
private SqlConnection conn;        //数据库连接
private SqlTransaction trans;     //事务处理类
private bool inTransaction=false; //指示当前是否正处于事务中
private SqlCommand comm;     //数据库操作命令处理类

然后我们开始编写从DBOperator继承下来的Open操作的实现语句。
public override void Open(string connStr)
{
//如果连接是空的,就先通过connStr构造一个连接
if(conn==null)
conn=SqlConnection(connStr);
//如果这个连接没有打开,就打开这个连接
if(conn.State.ToString().ToUpper()!="OPEN")
          this.conn.Open();
}


在实现了Open(打开数据库)操作的编写之后,我们开始编写Close(关闭数据库)操作。
public override void Close()
{
//如果连接是空的,则不用关闭
if(conn==null)
return;
//如果这个连接已经打开,就关闭这个连接
if(conn.State.ToString().ToUpper()=="OPEN")
          this.conn.Close();
}


事务处理功能的实现:首先是BeginTrans(开始事务)操作的实现。
public override void BeginTrans()
{
//如果连接是空的,则没有事务可以开始
if(conn==null)
return;
/*开始conn所属的事务,并将这个事务保存下来,同时设置inTransaction(在事务中)标志为true(真)。表示在进行事务处理*/
trans=conn.BeginTransaction() ;
inTransaction=true;
}


接下来是CommitTrans(递交事务)操作的实现如下:
public override void CommitTrans()
{
trans.Commit(); //事务递交
inTransaction=false;//在事务中标志变成false;
}


同理,RollbackTrans(回滚事务)操作的实现如下:
public override void RollbackTrans ()
{
trans.Rollback(); //事务回滚
inTransaction=false;//在事务中标志变成false;
}

最后我们编写ExecSql(执行Sql语句)操作的实现:
public override void ExeSql(string strSql,string[] strParams,object[] strValues)
{
//如果comm(处理Sql语句的对象)为