张志强
摘 要:在Web应用软件中,需要利用ADO.NET访问数据库中的数据。常规的数据访问技术因访问的数据量较大而需消耗大量的内存空间;同时网络中的传输数据也会因数据量大而占用过多的带宽,从而使软件的整体性能降低。为提高软件性能,对常规的数据访问技术进行优化研究,提出并设计按页为单位访问数据的优化方案。因该优化方案每次访问的数据量较小,从而有效地解决了上述问题,在实际应用中有很大的意义。
关键词:Web应用软件;ADO.NET;数据访问技术;优化方案
中图分类号:TP393.09文献标识码:A
文章编号:1004-373X(2009)12-039-03
Optimization Research of Data Access Technology Based on Web Environment
ZHANG Zhiqiang
(College of Information Science and Technology,Chengdu University,Chengdu,610106,China)
Abstract:In Web applications,it is necessary to access database by using ADO.NET.The conventional data access technology needs to consume a large amount of memory space,because in accessing,a large amount of data is needed.At the same time,in the network,too much bandwidth can be taken up if large amounts of data are transformed,so that the software′s overall performance is lowered.To enhance the performance of software,the paper carries out an optimization research on the conventional data access technology and designs an optimization program according to the data access which takes page as the unit.As the optimization program for each access needs only a small amount of data,the above problems are effectively solved,thus the program can be expected to play an important role in practice.
Keywords:Web application software;ADO.NET;data access technology;optimization program
0 引 言
在使用ASP.NET开发Web应用软件的过程中,前台客户端经常需要从后台数据库中访问数据,并在客户端显示与维护数据。常规的数据访问操作是利用ADO.NET从后台数据库中访问数据,填充到数据集(DataSet)中的数据表(DataTable)里,并将DataTable中的数据绑定到控件(GridView)中(实际就是在网络中传输数据)。 当多个客户端从后台数据库中访问的数据量非常大时,会使DataTable中的数据量很大,在服务器端和客户端将消耗大量的内存空间存放这些数据;同时当大量的数据在网络中传输时也会占用过多的网络带宽,从而降低了整个应用软件的性能。为了解决上述问题,需要优化常规的数据访问技术,减少访问的数据量,从而提高应用软件的整体性能。
1 数据访问机制
从后台数据库中访问数据是利用ADO.NET数据库访问接口技术实现数据的读写。ADO.NET的前身是ADO(ActiveX Data Objects),它是Microsoft.NETFramework的主要数据库访问技术,为用户建立Web应用软件提供了统一、一致的数据库接口。在Visual Studio.NET开发环境下,利用该技术,采用C#开发语言实现基于Web环境的数据库访问操作。ADO.NET 是为基于消息的 Web 应用软件而设计的,通过支持对数据的松耦合访问,可减少与数据库的活动连接数目(即减少了多个用户争用数据库服务器上的有限资源的可能性),从而实现最大程度的数据共享。ADO.NET 还通过对分布式应用程序的基本对象DataSet,支持基于 XML 的持久性和传输格式,以实现最大程度的数据共享。DataSet是一种关系数据结构,使用 XML 进行访问、写入或序列化。ADO.NET中的DataSet使得生成要求应用层与多个 Web 站点之间进行松耦合数据交换的应用软件变得很方便。
ADO.NET提供两种数据访问模式;一种为连接模式(Connected),与原来的ADO相兼容;另一种为非连接模式(Disconnected),这是ADO.NET中所提供的新技术。对于非连接模式,有许多优点,可以有效地减少数据库的连接数,降低为维护数据库的连接而带来的开销,从而可以提高软件的性能和规模。因此很多数据库的访问操作都采用非连接模式来完成,这也是常规数据访问技术所采取的方式。
非连接模式的数据访问机制主要是从后台数据库中访问数据,并填充到DataSet中的DataTable对象里。然后将DataTable对象中的数据绑定到客户端界面的数据表示控件上进行数据显示与维护。常用的数据表示控件有GridView控件、DataList控件等。ADO.NET非连接模式下数据访问操作的应用结构如图1所示。
图1 非连接模式的数据访问机制
2 常规的数据访问技术
如果后台数据库系统是SQL Server 2000或SQL Server 2005,常规数据访问技术的实现是通过SqlDataAdapter对象执行SQL语句来访问数据库中的数据,并填充到DataSet中的DataTable里。最后将DataTable中的数据绑定到GridView表中显示与维护。实现的代码如下:
SqlConnection con = new SqlConnection("Data Source=zzq;Initial Catalog= keyanIN;Persist Security Info=True;User ID=sa;Password=123;Pooling=true");
//建立数据库连接对象,数据库为SQL Server 2005,User ID为设置登录数据库的用户名,
//Password为登录数据库的密码,pooling=true表示打开连接池。
string s = "select * from stu";//执行SQL语句访问数据
SqlDataAdapter da = new SqlDataAdapter(s,con);
DataSet ds = new DataSet( );//建立数据集对象
da.Fill(ds,"student"); //填充数据到数据表student中
GridView1.DataSource = ds.Tables["student"].DefaultView;
GridView1.DataBind( );//将数据表student的数据绑定到GridView1控件
为了保证连接字符串的安全性,在实际应用中连接字符串不能出现在网页程序中,其在Web.config文件中设置;然后利用代码完成连接字符串的读取,并建立SqlConnection连接对象。在Web.config文件中设置连接字符串的方式如下(conn为连接字符串名):
读取连接字符串并建立连接对象的方式如下:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
当一页无法显示完数据时,需要考虑分页技术来完成多页的数据显示,采用的方法很多,例如:利用GridView控件的自动分页技术完成分页操作。以这种常规技术访问数据时,当访问的数据量很大时,DataTable中的数据会很多,需要更多的内存空间来存储数据;将DataTable中的数据绑定到控件中显示时,因传输大量数据而占用更多的网络带宽,从而使系统的整体性能降低。要改变这种状况,采用优化的数据访问技术,降低每次从数据库中访问的数据量,从而可有效地降低内存空间的消耗和所占网络的带宽。
3 优化的数据访问技术
优化访问技术的主要目的是降低从数据库中访问的数据量。按页为单位访问数据库中的数据是一个很有效的方案。其访问的数据量远远小于访问所有数据的数据量。每页的数据量可以动态地进行调整,以适应实际的需求。实现优化技术,需要进行2步操作,第一,确定整个数据量的页数,以及每页的数据索引范围;第二,修改访问数据的SQL 语句,以每页的数据索引范围为单位访问数据。这样就可以实现只访问每页指定范围的需求数据,而不是访问所有的需求数据。实现原理如图2所示。
图2 优化的数据访问
下面用一个实例实现优化方案。数据库系统采用SQL Server 2005,数据库中有3个数据表Unit,Employeer,keyan,分别为学校部门表、员工表、员工科研信息表。按职工姓名查询其所有科研信息。实现的界面设计如图3所示。
图3 界面设计
3.1 分页技术的实现
3.1.1 数据记录的获取
为了计算数据总页数,需获取数据记录的总数,因此设计GetOrdersCount方法,以实现数据记录总数的获取。在该方法中,以员工姓名name作为动态参数进行动态查询,并利用SQL语句中的count聚合函数获取数据记录总数。
public virtual int GetOrdersCount(string qury )
{ Database d = new Database();
string k;
k = "select count(Unit.Unit_Name) from Employeer,Unit,keyan where Employeer.Unit_ID=Unit.Unit_ID and Employeer.Employeer_ID=keyan.Employeer_ID and Employeer.Employeer_Name=@name";//设计的SQL语句
SqlConnection conn = … //利用前述的技术创建连接对象
conn.Open( );//打开连接
SqlCommand cmd = new SqlCommand(k,conn);
cmd.Parameters.Add("@name",SqlDbType.NVarChar,10);
cmd.Parameters["@name"].Value = qury;
//创建了带参数查询的命令对象,以name为查询参数,qury为具体的查询值
return (int)cmd.ExecuteScalar();//返回查询的记录条数
}
3.1.2 页数的计算
通过执行GetOrdersCount方法获取数据记录总数,并设置每页访问的数据量(假设每页访问10条记录,每页的记录数可以根据需求进行更改),从而计算出数据总页数。计算总页数的实现代码如下所示。
int count = this.GetOrdersCount(qury);// qury为具体的查询值
int PagesCount = count / 10; // PagesCount为总页数
int temp = count % 10;
if (temp != 0)
PagesCount++; //最后一页不足10条记录,任然为一页累加到总页数中
3.2 数据访问技术的优化实现
3.2.1 数据访问的优化设计
在数据访问层的设计中,由GetData方法实现以页为单位的数据访问;该方法根据数据索引范围对数据库进行访问,从而极大地减少了服务器与客户机之间传送的数据流量。数据索引范围由起始索引号和终止索引号组成,其中起始索引号由页号确定;终止索引号=起始索引号+每页数据记录条数。在GetData方法中,以参数startRowIndex为指定的起始索引号,以参数maximumRows为每页数据记录条数进行SQL语句的优化设计,通过执行优化的SQL语句,完成指定范围的数据访问。
public DataView GetData(int startRowIndex,int maximumRows,string sortExpression,string qury)
{ //查询指定索引范围的数据,startRowIndex为起始索引号,maximumRows为查询的记录条数 ,sortExpression为对结果的排序条件,qury为查询值。
string sql = @"with keyanTable as
(select Unit.Unit_Name,Employeer.Employeer_Name,Employeer.Employeer_Degree,Employeer.Employeer_zhicheng,keyan.Keyan_content,keyan.keyan_class,keyan.Declare_time,ROW_NUMBER() OVER(ORDER BY {0}) as RowNumber
from Employeer,Unit,keyan where Employeer.Unit_ID = Unit.Unit_ID and Employeer.Employeer_ID = keyan.Employeer_ID )
select * from keyanTable where RowNumber > {1} and RowNumber <= {2} and keyanTable.Employeer_Name = ‘{3};"; //优化后的SQL语句
if (string.IsNullOrEmpty(sortExpression))
sortExpression = "Employeer.Employeer_ID ASC";
sql = string.Format(sql,sortExpression,startRowIndex,startRowIndex + maximumRows,qury);
// startRowIndex起始索引号;startRowIndex + maximumRows为终止索引号
SqlConnection conn = ……//利用前述的技术创建连接对象
SqlDataAdapter da = new SqlDataAdapter(sql,conn);
DataSet ds = new DataSet();
da.Fill(ds,”Information”);
return ds.Tables[“Information”].DefaultView;//返回数据视图
}
3.2.2 表示层的设计
在客户端,根据指定页确定数据索引范围的起始索引号,起始索引号通过公式:this.GetData(int.Parse(lb2.Text)×10-10计算得出。其中,int.Parse(lb2.Text)为客户端指定的页号,10为每页的记录数;每页的数据访问量以每页的记录条数为标准。 将动态生成的数据索引范围作为参数执行GetData方法,实现按照指定页的数据索引范围访问数据。
…
string qurystr = TextBox8.Text.Trim();//获取界面上的查询值
DataView dv = this.GetData(int.Parse(lb2.Text) * 10 - 10,10,"Employeer.Employeer_ID DESC",qurystr);
// lb2.Text为访问的页号值 ,10为每页的访问的记录数
GridView1.DataSource = dv;
GridView1.DataBind( );
4 结 语
对数据访问技术进行优化后,降低了对后台数据库的访问数据量,进而减少了所占内存空间的大小,降低了在网络中传输的数据量。该优化方案提高了Web应用软件运行的性能,在实际使用时有很大的意义。
参考文献
[1]陈建国.开发高性能ADO.NET应用程序的探讨[J].福建电脑,2007(1):177-178.
[2][美]Glenn Johnson.ADO.NET 2.0高级编程[M].段超,译.北京:清华大学出版社,2006.
[3]陈永强.SQL Server 2005 Web应用开发[M].北京:清华大学出版社,2008.
[4]王强,滕刚.微软培训教材[Z].2008.
[5]李昕,常革新,崔杰.基于ADO.NET的ASP.NET页面程序[J].辽宁工程技术大学学报:自然科学版,2006,25(2):250-252.
[6]王磊.基于.NET平台的数据库访问技术[J].福建电脑,2006(12):75-89.
[7]孔延香,李永忠,郭秀峰.ADO.NET数据库访问技术研究与实现[J].现代电子技术,2005,28(16):51-52,59.
[8]林平荣.ADO.NET的数据库访问技术研究与实现[J].电脑知识与技术,2008,7(1):1 198-1 201.
[9]刘莹.基于的ADO.NET数据库访问技术研究[J].电脑知识与技术,2008,18(2):1 580-1 582.
[10]陈平,池同柱.ADO.NET数据访问模式选择及优化[J].福建电脑,2007(7):80,72.