Web服务数据库访问中间件的实现(2)
最后我们编写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对象的命令文本[来源 www.iocblog.net]
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
Tag: 中间件
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。