首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 办公软件
web服务数据库访问中间件的实现_asp.net技巧
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

摘要:本文分析现有的数据库访问中间件的现状,指出其中存在的问题,得出应用新技术的必要性。开发了一个基于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语句的对象)为空,则生成这个对象
if(comm==null)
comm=new SqlCommand();
     //设置这个对象的连接conn
   comm.Connection=this.conn ;
//判断是否在事务中,是就设置comm的事务对象属性
if(inTransaction)
    comm.Transaction=trans;
     //判断参数个数和参数值个数是否相等,不等,就不能执行这个Sql语句
if((strParams!=null)&&(strParams.Length!=strValues.Length) )
          throw new Exception("查询参数和值不对应!");
     //设置这个comm对象的命令文本
comm.CommandText=strSql;
   //将参数名称和对应的参数值保存到comm的参数数组中
if(strParams!=null)
     {
       for(int i=0;i<strParams.Length;comm.Parameters.Add(strParams[i],strValues[i]));
     }
     //执行这个没有返回值的查询
    comm.ExecuteNonQuery();
}


下面是有返回值的ExecSql操作的实现:
public override DataSet ExeSqlForDataSet(string queryString)
{
//如果comm(处理Sql语句的对象)为空,则生成这个对象
if(comm==null)
comm=new SqlCommand();
     //设置这个对象的连接conn
   comm.Connection=this.conn ;
   //判断是否在事务中,就是设置comm的事务对象属性
if(inTransaction)
        comm.Transaction=trans;
     //生成一个数据集(DataSet)对象(ds),用它来保存返回的查询结果
DataSet ds = new DataSet();
//定义一个SqlDataAdpater类的对象ad。
   SqlDataAdapter ad = new SqlDataAdapter();
//设置这个comm对象的命令文本
comm.CommandText=queryString;
   //设置ad的SelectCommand属性为comm。
         //SelectCommand是DataAdapter对象的一个属性,表示Transact-SQL语句或存储过程,用于在数据源中选择记录。
ad.SelectCommand =comm;
   //ad执行fill操作,结果保存到ds中
ad.Fill(ds);
   //ds返回
return ds;
}
 
4 使用已定义的Web服务中间件来访问数据库的使用场合
下面我们假设一种该中间件使用的具体情况:
假设有一个私有的比较大型的书店,书店的老板家在离书店有一段距离,在书店和老板家之间架设局域网是不现实的,而老板需要在家里就可以使用书店的管理系统,甚至进行日常工作的管理。也就是说,老板需要实现在家里办公。为此,书店老板决定让某IT公司开发这个系统。
某IT公司在接到该书店老板提出的开发意向后,在进行初步的系统调研之后,决定接下这个IT订单,由于这个书店老板并没有提出具体的解决方案(他也不懂),所以IT公司人员思考了以下几个开发方案:
在传统的解决方案中,我们可以采用了动态网页的编程方法,也就是建立一个网站,这样,在互联网的任何地方,我都可以通过这个网站进行访问,这种实现方法非常优秀,现有的很多公司门户就是使用了这种技术实现的。但是这种技术有一个缺点是,书店需要有自己的Web服务,这就增加了实现成本。同时这种方案的实现也抛弃了现有的解决方案(书店在建立初期就请某IT公司专门开发一个专用的书店管理系统),抛弃这个Legacy(遗产),重新进行设计,书店老板也不愿意。
另一个传统的解决方案是利用Corba或DCOM进行编程。原有系统就是利用Visual C++进行编程的。所以可以选择DCOM进行编程,这也非常合理。但是这个方案限制了实现的平台,同时开发费用较高,毕竟利用DCOM进行编程开发和实现是一件比较复杂的工作。
最后,公司决定利用Web服务技术封装原有的数据库访问层,这样我们的客户端仅需要进行数据库访问层的修改。这样,系统原来的界面不便,Business层(业务层)不变,改变的仅仅是客户端的的数据库访问层的实现。以上就是这个Web服务使用的具体场合。
下面我们在Visual Studio.Net平台上利用c# Windows应用程序编程项目来说明该Web服务的使用。
首先新建一个C# Windows应用程序项目,在窗体上添加控件,一个DataGrid和一个按钮。
然后添加Web引用,将该Web服务中间件所在的asmx文件地址添加到Web引用中。这样我们就可以直接使用这个服务了。
双击按钮1,编程如下:
//新建一个Web服务的实例
WebReference.ServiceWSDBM the=new WindowsApplication1.WebReference.ServiceWSDBM();
//以数据库连接字符串为参数,打开上面的连接字符串所可以连接的数据库
the.Open("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False");
the.Open();
//对已经打开的数据库进行查询操作,返回记录集。
System.Data.DataSet ds=the.exeSqlForDataSet("select * from products");
//将查询得到的记录集显示在DataGrid中
dataGrid1.DataSource=ds;
dataGrid1.DataMember=ds.Tables[0].TableName;
//关闭这个连接
the.Close();      
执行结果,在DataGrid中将显示出连接上的Sql Server库中的products表中的内容。
5 结束语
根据以上的介绍,基于Web服务实现的数据库访问中间件,可以扩展数据库系统的应用范围,这种中间件不仅适应于局域网,更加适应于未来的基于广域网的应用程序。这个中间件于传统中间件相比有以下优点: 1)跨平台。2)使用方便,可以将这个Web服务可以象本地组件一样被应用。3)兼容性强,扩展方便,比如我们想要增加对Oracle的支持,仅需下载和Oracle有关的.Net插件(下载地址:可到http://msdn.microsoft.com/downloads/上下载.Net Framework Data Provider for Oracle),然后将上述程序中的Sql替换为Oracle即可。综上所述,基于Web服务实现数据库访问中间件将是一种比较有效的解决方案。

原文出处:http://www.ahcit.com/lanmuyd.asp?id=1153


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ASP.NET2.0连接SQL Server数据库详解-.NET教程,Asp.Net开发
·在.net中轻松掌握Windows窗体间的数据交互-.NET教程,.NET Framework
·Java中的类反射机制-JSP教程,Java技巧及代码
·小技巧让pdf文件与word文档之间自由地转换
·j2ee程序员应该掌握的linux知识-JSP教程,J2EE/EJB/服务器
·通过WMI获得硬盘和CPU的物理序列号(VB.net)-.NET教程,VB.Net语言
·firfox浏览器开发人公开firfox2.0开发计划
·VB.net入门(10):补充:类~属性-.NET教程,VB.Net语言
·office2003实战秘笈之excel轻松制胜招
·C#编码规范.doc-.NET教程,C#语言
最新文章
·天涯试水网络口碑营销 邢明:希望与"关键词"媲美_站长访谈
·美梨网站长冰寒的商务之道_站长访谈
·白手起家 新网站流量快速提高之道_站长心得
·照片处理 photoshop简单制作照片柔光效果_photoshop教程
·网络百戒 ---网页外观_站长心得
·utf-8转换gb2312编码,解决统计google搜索来源关键字乱_google推广
·googleadsense作弊不是技术的较量_google推广
·google改进搜索服务 企业可在local更新资料_google推广
·rss订阅对你的网站搜索表现有好处吗?_站长心得
·15种简洁有效的网站推广方法_站长心得
相关主题
  • WEB服务代理类的使用-.NET教程,Web Service开发
  • Web服务互操作开发的十大要点-ASP教程,ASP应用
  • Web服务器日志统计分析完全解决方案-网管专栏,WEB服务
  • WEB服务器大比拼-网管专栏,WEB服务
  • Web服务到底是什么-JSP教程,资料/其它
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭