首先定义一个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插件(下载地址:可到上下载.Net Framework Data Provider for Oracle),然后将上述程序中的Sql替换为Oracle即可。综上所述,基于Web服务实现数据库访问中间件将是一种比较有效的解决方案。
原文出处:?id=1153