飘飘悠悠 发表于 2015-1-16 23:10:03

ASP网页编程之数据分页办法新思绪,速率十分快!

Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃。分页|数据|速率这篇文章要到达的目标就是,完成年夜数据分页扫瞄并最优化速率。

创建一个web使用,分页扫瞄功效必不成少;这个成绩也是久长以来最广泛的成绩,今朝也失掉了较好的办理,个中象ASP程序的分页算法有良多,好比利用ado工具的PageSize这些属性,按纪录总数盘算页,然后跳转纪录集再输入;也有编写存储历程完成分页数据,这些方面各有优弱点,以下自己先容一种使用实践项目中速率十分快的分页算法;

关头点:SQL(用TOP和主动编号完成)
页面剧本(扫瞄器回退功效)

情况:
IIS/SQLServer/Access
表布局:
createtable内容表(
主动编号IDENTITY(int,1,1)notnull,
分类编码<I>var</I>char(20)null,
题目<I>var</I>char(255)NULL,
内容<I>var</I>char(4000)null,
工夫datetimenull,
)

完成道理:
这个表设定了主动编号字段,这个字段的特征就是天生不反复的整形,包含删除纪录后该字段仍旧坚持‘流水性’(注:一般在体系表建立中,这类字段的使用很少,由于编号不克不及自在办理,但在这里利用它,次要是想在文章中省略编号保护的代码)。

分页:
那末第一步,就是查询一个页的数据;假如有100条记录,按20纪录一页,那末一般的分页算法就是“页总数=总纪录除分页的把持数[不足数的话,页总数加一]”,如许的做法就招致必需发生一切纪录的一个年夜纪录集;从而,又有人提出了用存储历程的分页算法,前者是asp剧本发生年夜纪录集,如许速率相称慢,后者是杀鸡用牛刀,固然我常常写存储历程,但依据我的思绪会发明写存储历程完整过剩。

在SQL中,很多刚打仗它的伴侣都晓得Top润色关头字的感化;比方:selectTOP1*fromtable1--如许就完成从Table1表前往只要一笔记录的纪录集那末分页优化的终极目标就是制止发生过年夜的纪录集,经由过程TOP便可完整把持;如今查询表应当是selectTop20主动编号,题目,内容,工夫from内容表。

但如今另有个成绩,就是怎样定位,Top不成能主动给我们定位输入某个页,这就计划到了where从句,依据一个特定前提输入准确的内容;注重:纪录的orderby排序长短常主要的,这个决意了这个算法的成败;

这里的演示是DESC体例,倒序分列,好比网站的软件更新,就是比来的更新放最后面,而这个就是倒序体例。

OK,上面来看看实践代码,起首要断定是不是为肇端页。


dimstrSQL,i,endID,isBeginPage
constCnt_PageSize=20界说每页纪录的巨细
经由过程反省扫瞄器传送的Page参数的值来判别是不是为进进下一页的操纵
isBeginPage=isEmpty(request("Page"))orrequest("Page")=""orrequest("Page")"next"
这里是分页的中心
ifisBeginPagethen假如是肇端页
查询=列出分类编码即是参数flbm的纪录,按倒序分列,并只列出前Cnt_PageSize笔(Cnt_PageSize是常量界说,好比20)
strSQL="selectTOP"&Cnt_pageSize&"主动编号,题目,内容,工夫from内容表where分类编码="&TRIM(SQLEncode(request("flbm")))&"orderby主动编号desc"
else假如不是肇端页
ifrequest("Page")="next"then这里如许写是为了增强代码的体现,假如参数为next,则暗示取下页内容
查询=列出分类编码即是参数flbm的纪录而且要小于主动编号endID(endID也是参数),并倒序分列,并只列出前Cnt_PageSize笔(Cnt_PageSize是常量界说,好比20)
strSQL="selectTOP"&Cnt_pageSize&"主动编号,题目,内容,工夫from内容表where分类编码="&TRIM(SQLEncode(request("flbm")))&"and主动编号<"&request("endID")&"orderby主动编号desc"
Endif
endif

翻开数据毗连实行SQL并创建纪录集
setrs=Cnn.Execute(strSQL)
ifnotrs.Eofthen这里写进判别是不是为Eof能够不要,可是,在这里却有它的特别意义
callTableTitle这里是自写的函数,用于创建表格标志
callbeginTr这里是创建表格tr标志

fori=0tors.fields.Count-1遍历纪录集字段
callAddCol(rs(i).name)输入字段名
Next

callendTr

whilenotrs.eof轮回纪录集内容,并输入
callbeginTr

fori=0tors.fields.Count-1
callAddRow(ASPEncode(rs(i).value))
Next
callendTr
endID=rs("主动编号")这里保留每次输入的主动编号值
rs.MoveNext
Wend
callTableBottom到此为止,就复杂的将纪录集内容全体输入
这里输入翻页标志,vbaIIF是自写函数
原型为<I>function</I>vbaIIF(a,b,c)
ifathen
vbaIIF=b
else
vbaIIF=c
endif
end<I>function</I>

上一页的完成是经由过程剧本挪用扫瞄器的功效history.back(1)完成,那末回页时其实不必要在服务器端从头天生数据,速率不必思索了。
在首页的时分,上一页的链策应该是有效的,经由过程vbaIIF(isBeginPage,"disabled","")完成,假如为首页,那末在标志中到场disabled属性,假如不是首页,则到场history.back(1);剧本指令,用于回退扫瞄页。
下一页是传送Page参数和endID参数,Page设置为next暗示为下一页的举措,endID暗示以后纪录集的开端编号,下页将由此分页。

response.Write("〈ahref=""#""onclick=""java<I>script</I>:"&vbaIIF(isBeginPage,"","history.back(1);")&""""&vbaIIF(isBeginPage,"disabled","")&"〉上一页〈/a〉|〈ahref=""TypeOptions.asp?flbm="&request("flbm")&"&Page=next&endID="&endID&"""〉下一页〈/a〉")
else
这里经由过程判别纪录集是不是为空来办理到开端页还能够持续翻页的成绩
ifnotisBeginPagethen
判别是不是为空纪录,而且不是肇端页,那末天生回退页面的剧本,效果就是进进该页后将主动前往到上页。
response.Write"〈<I>script</I>language=java<I>script</I>〉"&vbCrlf
Response.W</p>asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了!

愤怒的大鸟 发表于 2015-1-20 07:46:27

如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:

活着的死人 发表于 2015-1-20 07:46:27

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。

山那边是海 发表于 2015-1-29 05:12:22

那么,ASP.Net有哪些改进呢?

爱飞 发表于 2015-2-5 22:43:18

掌握asp的特性而且一定要知道为什么。

蒙在股里 发表于 2015-2-14 00:35:25

不能只是将它停留在纸上谈兵的程度上。

仓酷云 发表于 2015-3-4 03:29:33

以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。

第二个灵魂 发表于 2015-3-11 15:54:43

他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。

变相怪杰 发表于 2015-3-19 01:02:12

没有坚实的理论做基础,那么我们连踏入社会第一步的资本都没有,特别对于计算机专业的学生学好专业知识是置关重要的。在这里我侧重讲一下如何学习ASP,从平时的学习过程中。

admin 发表于 2015-3-26 20:52:36

如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。
页: [1]
查看完整版本: ASP网页编程之数据分页办法新思绪,速率十分快!