设为首页
加入收藏
站内地图
旧版入口
当前位置:首页 > 站长学院 > 网络编程 > ASP.NET

Web服务数据库访问中间件的实现 2

作者:佚名 出处:网络转载 时间:12-12 点击:

内容载入中...
     接下来是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
    。

收藏本文:
】【打印页面】【推荐给朋友】【关闭窗口

站长学院

推荐信息