分享
 
 
 

基于ASP.NET的自定义分页显示

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

摘要:本文针对WEB数据库记录的显示问题,用实例讨论了在ASP.NET框架下使用DataGrid控件对数据库记录的一种自定义分页显示。

关键词:WEB数据库;ASP.NET;DataGrid;分页

引言

在用户进行数据查询时通常有这样的情况,一个数据库查询将返回太多的行,一致不能在一页中显示。如果用户正在使用一个慢的链接,发送特别大的数据结果可能要花很长的时间。一旦获得了数据,用户可能发现它不包含正确的内容,或者查询范围太大,没有容易的办法检查完所有的结果来找到重要的信息。因此,对查询结果分页显示将为用户可管理的数据查询提供极大的方便。分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一,现在网站基本上都提供了分页显示信息的功能,但大部分还是基于ASP的,而.NET平台框架是针对各种各样的Web应用设计的,因此本文讨论了一种在ASP.NET框架下实现查询记录自定义分页显示的技术。

ASP.NET

.NET是通过平台独立的数据描述方法(通过XML)和通用的访问媒介Internet来简化用户访问和存储信息的过程。

ASP.NET是Microsoft.Net框架的核心元素,是一项基于服务器的强大技术,利用它,可以为WWW站点或企业内部网创建动态可以交互的HTML页面。ASP.NET 完全基于模块和组件,具有很好的可扩展性和可定制性。它主要包括WebForm和WebService两种编程模式。前者为用户提供功能强大、外观丰富的基于表单(Form)的可编程Web页面;后者通过对HTTP、XML、SOAP、WSDL等Internet标准的支持提供在异构网络环境下获取远程服务、链接远程设备、交互远程应用的编程界面。

通过ADO.NET链接、操纵数据源

在Microsoft公司推出开放式数据库互连(ODBC)应用程序编程接口(API)以来,出现了各种各样的数据库访问技术,而直到ADO.NET出现,API才能实时地给出处理效果。ADO.NET是ASP.NET应用程序用来与数据库进行通信的技术,使你可以同关系数据库和其他数据源进行交互。断开的访问是ADO.NET最重要的特性,是对ADO最大的改变。ADO.NET创建一个到数据库的链接,用从数据库中提取的信息副本填充数据集。如果改变了数据集(DataSet)中的信息,数据库里相应表格中的信息不会改变。需要时,可以把DataSet连回最初的数据源并应用所有的改变。

ADO.NET主要依赖以下核心对象的功能。它们分为两个组:一组对象用来存放和管理数据(例如:DataTable,DataRow和DataRelation),另一组对象用来链接到某个特定的数据源(例如:Connections,Commands和DataReader类)

在大多数的情况下,需要的数据是在某个数据源(例如:某个关系数据库)中。要想对这些数据进行访问、提取并将其插入到适当的数据对象中,就必须使用数据源对象。使用数据源对象的目的是创建一个链接并把相关信息移入某个DataSet或DataReader中。一种最简单的数据库访问方法是:利用Command对象直接进入数据源并通过DataReader检索只读数据行。另一种选择:把数据放入某个断开链接的DataSet,从而在更长的时间段操作。

用DataGrid控件分页显示记录

在创建链接和命令对象之后就要把返回的记录显示出来。DataGrid控件是ASP.NET中功能最强大也是最复杂的数据控件,可以用它来显示和格式化数据表的数据,它除了内建的数据表现和方法之外,还允许用户自己定义表现形式。分页技术为用户可管理的数据查找提供方便。

1、DataGrid内建分页技术原理

DataGrid内建分页技术很容易实现,但数据量很大时,它的方便性是以牺牲性能为代价的。如果一个用户只要求100个页面中每页显示25条记录的第8页的结果集,服务器只需要发送第175-200行的数据即可,而不是1-1000行的完全数据。默认的传送方式如图1所示。

图1 DataGrid默认传送方式

从图1中可以看出,DataGrid的内建分页方法效率不高,每次请求都必须把整个查询结果发送给Web服务器,Web服务器再把数据分成相应的页面。利用DataGrid的内建的分页方法尽管是很简单的,但是,由于Web应用的无序性特征,一个用户每次从一个页面转向另外一个页面时,DataGrid对象都被销毁并重新创建,这就意味着数据库服务器每次都必须发送全部的结果集。

2、自定义分页技术

那么如何通过自定义的分页方法来实现快速处理大量数据的结果集呢?

它比DataGrid的默认分页方法更加快速有效,因为每次请求不需要把全部的数据结果都发送到Web服务器。相反,它只需要发送每个页面需要的那些数据集。自定义的分页方法只返回所要检索的那些结果集,如图2所示。

图2 自定义分页的传送方式

从图2中可以看到,数据库每次只需要返回所要显示的数据记录。

在ASP.NET页面中执行SQL命令的方法可以是直接执行也可以先将SQL命令封装在存储过程中,然后再页面中执行该存储过程。执行存储过程比直接执行SQL命令稍微复杂一些,但能显著提高数据库驱动的Web站点的性能。每次从ASP.NET页面直接执行SQL命令时,都需要SQL Server对其进行解析、编译和优化,而存储过程只需要进行一次解析、编译和优化。

而这里自定义的分页方法就是使用存储过程来做分页的工作,而不是由Web服务器来做。

首先,在数据库中建立一个存储过程,该存储过程接受两个输入参数,分别是要返回数据的第一条记录数和最后一条记录数。要创建一个返回指定条记录结果的存储过程,首先必须指定返回结果集的条记录数,这里用table变量(SQL Server 2000),table变量尽管是存储在内存中的,但在存储过程结束后自动释放。创建的存储过程如下:

create proc InsertStudents

@Student_Last_Name as varchar(100) = null,

@StartRow as int = null,

@StopRow as int = null

AS

---- 建立有标识符列的table变量

declare @t_table table

(

[rownum] [int] IDENTITY (1, 1) Primary key NOT NULL ,

[Student_Last_Name] [varchar] (40) ,

[Student_First_Name] [varchar] (20) ,

)

---- 在返回指定的@StopRow行数之后停止处理查询

Set RowCount @StopRow

---- 插入到table变量中

insert @t_table

(

[Student_Last_Name],[Student_First_Name]

)

SELECT [Student_Last_Name],[Student_First_Name]

FROM Students

WHERE Student_Last_Name like '%' + @Student_Last_Name like '%'

ORDER BY Student_Last_Name

---- 返回到正确的结果

SELECT * FROM @t_table WHERE rownum >= @StartRow

ORDER BY rownum

GO

参数@StartRow和@StopRow接收整数值,代表要返回的开始记录和结束记录,如果要在一个25条记录的页面中返回第8页,我们就可以设置@StartRow为176,@StopRow为200。

table变量@t_table中定义了一个叫rownum的整数类型的列,并指定为标识符列,它将在插入数据的时候自动增加,起到排序作用。Set RowCount语句是优化性能的关键,它会告诉SQL Server进行限制要插入的数据,如果我们要176-200条记录之间的数据,那么就可以不必插入大于200条记录的数据。最后的SQL语句通过@t_table的table变量选择rownum大于或者等于@StartRow的那些数据集,然后把它们返回到Web服务器,由Web服务器绑定到DataGrid对象。但如果浏览者请求的页数越来越大,需要向table变量填充的记录就越多,导致页面性能有所下降。因此,性能将依赖于你计算机的硬件和你要返回的记录数,但为了减轻数据库和网络传输的压力,设计合理的查询结果页数是很见效的。

然后将为DataGrid对象编写代码来使用分页技巧。DataGrid的AllowPaging、AllowCustomPaging、PageStyle属性有助于记录用户的访问状态。首先设定AllowCustomPaging为True。我们使用SQLDataReader来装载DataGrid对象。据性能测试表明:在构建列表显示数据时,使用SQLDataReader比使用DataSet要快两倍以上。

为了追求性能最佳化,设定DataGrid的EnableViewState属性为false,因为这样在每次与Web服务器打交道时就不必再在viewstate中存储内容了。

当DataGrid不在viewstate中进行保存,需要添加导航按钮来帮助用户进行导航。

那么在页面上增加两个按钮:“上一页”和“下一页”。要进入下一页,就在“下一页”按钮上增加click事件,通过自定义分页存储过程请求相应的记录。例如:如果第一页由第1条到第25条记录组成,那么要导航到第二页,我们就向存储过程的@StartRow传递参数26,向@StopRow传递参数50即可,要返回到第一页,@StartRow和@StopRow分别为1和25。

在这里使用VB.NET编写“下一页”事件:

Private Sub ButtonNext_Click (ByVal sender As Object, _

ByVal e As System.EventArgs) Handles ButtonNext.Click

viewstate("StartRow") = viewstate("StartRow") + dgrid.PageSize

viewstate("StopRow") = viewstate("StartRow") + dgrid.PageSize

'运行存储过程,返回SQLDataReader

dgrid.DataSource = RunSprocReturnDR (textSt_lname.Text, textSt_fname.Text, viewstate("StartRow"),viewstate("StopRow"))

dgrid.DataBind()

End Sub

在上面的例子中,viewstate中保存的只是@StartRow和@StopRow的信息,这比在viewstate中保存整个DataGrid对象高效的多。

结束语

以上程序是在SQL Server 2000实现的,但对于其他关系型数据库同样适用,比如ORACLE等等。列表显示信息的性能对浏览者的访问是很重要的,设计不好的列表显示会大大降低应用程序的性能,不管它的后端数据库是多么快速。使用自定义分页技术,可以避免DataGrid默认分页机制带来的缺陷,在.NET框架的强大冲击下,ASP.NET已成为新一代网站开发的主流技术,因此本文讨论的技术很具有实用价值。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有