| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4967 人关注过本帖, 1 人收藏
标题:不连数据库进行查询分页的思路
只看楼主 加入收藏
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
结帖率:100%
收藏(1)
 问题点数:0 回复次数:16 
不连数据库进行查询分页的思路
看了不少介绍,知道set rs=conn.execute(sql)的执行效率比rs.open sql,conn,1,1要高很多,但是set rs=conn.execute(sql)这种执行方式也有很多不足,首先它不具有分页属性,比如rs.pagesize,rs,absolutepage等属性,这样的话,通过这种方式set rs=conn.execute(sql)执行的速度虽然快了,但是却不能按普通方式进行分页,怎么办呢??
  第二天,查了一下网上的资料,突然想到是否可以把所需数据提到一个数组里,然后对数组进行分页呢?首先把set rs=conn.execute(sql)查询出来的结果通过rs.getrows()取出来附给一个数组,于是我就在各网站上找分页的帖子,虽然发现不少高效率分页的帖子(包括存储过程等),可结果发现全都是需要通过SQL执行的,即翻页的时候也需要执行SQL语句,此时头都晕了,优化的也只是SQL语句,此时实在没办法,只好自己努力了!终于完成了一个数组分页的粗稿,代码不是很完善,让大家一起来研究一下!代码如下:
 首先有一个index.asp查询页:
<html xmlns="http://www.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body><FORM id="SearchForm" name="SearchForm" method="post" action="search.asp?act=cha">
<div class=input>
<input id=keyword onmouseover=this.focus() title="快速搜索您的留言记录" onfocus=this.select() class="in"  maxlength=35 name=keyword />
<select style="width:120px;margin-top:-25px" name="ChannelID">
<option value="k2">留言人</option>
<option value="k1">留言内容</option>
</select>
  <Input id=search_btn type=submit value="查询">
</div>
</FORM>
</body>
</html>
search.asp的代码:

<html xmlns="http://www.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
<%
If request.querystring("act")="cha" Then
search_type=request.FORM("ChannelID")
keywords=request.form("keyword")
if search_type="k1" then '按照留言内容搜索
sql="select * from gbook_rec where g_content like '%"&keywords&"%'"
ElseIf search_type="k2" then
'if search_type="k2" then '按照留言人搜索
sql="select * from gbook_rec where g_name like '%"&keywords&"%'"
Else
response.end
end If
Set rs=conn.execute(sql)
If  rs.eof And rs.bof Then
%>
<div class="search">没有查找到您要的记录!</div>
<%
response.End
Else
aResults=rs.getrows()'取出数据放入数组ROW中
application("data")=aResults
Set rs=nothing
conn.close '关闭数据库
End IF
End If

aResults=application("data")
Dim i,row,pagesize,epage,numb,pagecount,fenye
numb=UBound(aResults,2)+1 '总记录行数
pagesize=2 '每页条数

If numb Mod pagesize = 0 Then '判断总页数
pagecount=Int(numb/pagesize)
Else
pagecount=Int(numb/pagesize)+1
End If

epage=request.querystring("page")

If epage="" Then epage=1    

For i=(epage-1)*pagesize To epage*pagesize-1
If i>UBound(aResults,2) Or i<0 Then Exit for
%>
<div class="content">
<ul><li>记录<%=i+1%></li>
  <li>留言人:<%=aResults(1,i)%></li>
  <li>内容:<%=aResults(2,i)%></li>
  <li>时间:<%=aResults(3,i)%></li>
  <li>IP:<%=aResults(5,i)%></li>
</ul>
</div>
<%
Next
If numb>pagesize Then
fenye="<a href=search.asp?page=1>首页</a>&nbsp;&nbsp;"
fenye=fenye&"<a href=search.asp?page="&epage-1&" title="&epage-1&">前页</a>&nbsp;&nbsp;"
fenye=fenye&"<a href=search.asp?page="&epage+1&" title="&epage+1&">后页</a>&nbsp;&nbsp;"
fenye=fenye&"<a href=search.asp?page="&pagecount&">末页</a>&nbsp;&nbsp;"
fenye=fenye&"<BR>"
fenye=fenye&"总页数"&pagecount&",当前页"&epage&",总记录为:"&numb
response.write fenye
End if
%>
</body>
</html>

总结:本人认为以上代码除了初次查询需要连接到数据库外,其他时间都不需要连接数据库,对于大型数据查询或连接人数比较多的时候对资源节省还是很有用处理的!另外将查询数组保存在application对象上,还可以根据application( "data")("username")来判断某人查询过什么,不过此代码为初次模型,还有待今后大家一起努力改进!希望大家都顶力关注支持,谢谢!

test.rar (11.66 KB) 此为打包的源代码

搜索更多相关主题的帖子: 数据库 SQL 思路 conn sql 
2008-06-26 14:18
madpbpl
Rank: 4
等 级:贵宾
威 望:11
帖 子:2876
专家分:244
注 册:2007-4-5
收藏
得分:0 
支持
2008-06-26 15:06
yms123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
收藏
得分:0 
application("data")运用application来缓存分页结果,问题一:这个变量是全局的,如果多个用户查询会不会得到另外一个用户已经缓存的结果。比如说用户a查询留言人为abc的记录,完成后用户b查询留言人为def的记录,这时application相同用户b会不会显示留言人为abc的记录呢?
问题二:就是application缓存,同一段数据的并发访问是有可能在多用户时产生这种问题,同时向服务器请求同一个application的数据缓存。
问题三:使用不同的application缓存,application的数据是被缓存在服务器的内存里的,而且除了关闭或重起服务器主机或者关闭或重起IIS服务,不手动清楚这些数据是永远也不会自动清除的。一个用户搜索一次有一个application缓存,多个用户就是多个application缓存,太多时就很有可能使服务器的内存溢出或系统崩溃。
2008-06-26 15:30
playgirl
Rank: 1
来 自:大连
等 级:新手上路
帖 子:105
专家分:0
注 册:2006-9-14
收藏
得分:0 
加油
2008-06-26 15:46
天涯听雨
Rank: 2
来 自:东莞
等 级:论坛游民
威 望:4
帖 子:497
专家分:64
注 册:2007-8-25
收藏
得分:0 
分页问题一直是蛮关注的。

不过从数据读取效率上讲,我们想提高数据读取的效率,至关重要的点得知道程序执行的效率问题,还有服务所承受的压力!

楼主这方法感觉不怎么推荐

application 是全局变量,而且执行后会很长一段时间存在服务器上,给服务器压力不小啊,呵。

本人所认为:高效的数据至关重要原则是:

一页要哪些数据就从数据库取哪些

从明天起做幸福的人,喂马劈柴周游世界!
2008-06-26 16:06
hmhz
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:30
帖 子:1890
专家分:503
注 册:2006-12-17
收藏
得分:0 
没错,分页问题一直得不到最佳的解决方案,我也一直在关注这个问题,楼主的方法严重存在内存消耗问题,面临着服务器崩溃的危险,如果可以,每查询一次就要清除一次缓存,但为了做到清除缓存又要花费大量技术和程序来达到目的,这样反而弄巧成拙,虽然查询速度提高了,但影响了整体效能

[编程论坛] ASP超级群:49158383  敲门暗号:ASP编程
龍艺博客 http://www.
2008-06-26 16:39
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
......
,我提的问题半天没人回答,https://bbs.bccn.net/thread-220624-1-1.html,只一个人响应了我,相反我提到一个思路想法,就这么多人来响应!

    不知道是不是又得回到以前的方法,每查询一次就连一次数据库吗??

    当然我的方法从头到尾也没说过是完善的,我只是希望大家朝着另外一个方向或思路来思考分页的问题!而不是都朝着简化什么什么去思考!这才是我发此帖的用意!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2008-06-26 18:07
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
。。。
补充一下:
    SQL语句优化也好,编程优化也好。它都有一个极限,除非你换一种编程语言环境,但是机器的内存配置应该是没有终点的!至于上面各位提到的缺点,我想没一个好方法没缺点的,或者没一个坏方法没优点的。对吧?有问题才有网聚人的力量去解决它!不然一提到分页就一种思路,除了优化数据库还是优化数据库,这样都没创意啊!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2008-06-26 18:14
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
。。。。。。
如果你是个真正的用心的技术人员!请帮忙多测试一下,发现一下,不管是缺点也好优点也好。帮忙改改,点评点评,然后发出来让大家一起学习学习!而不是一味指出,这个不行,那个不行,或者说我早在哪看到过这个行不通,不去做不去改进你怎么知道就知道行不通呢?之后人就消失了!呵呵,说笑呢!
   不过我真心希望此帖能让大家在以后的分页道路上多一种思路,多一种方法,何乐而不为呢? 不知道那个热心参与的人会是谁呢??期待中。。。。。。!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2008-06-26 18:25
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
。。。。。
最后感谢各位的经典点评,根据各位提出的问题我会去考虑解决的,我还是去改进我的思路去了。不多说了。一有好的结果会第一时间发出来和大家共享的!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2008-06-26 18:29
快速回复:不连数据库进行查询分页的思路
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029023 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved