如何在三层结构中处理大量数据的表

talisman 2002-05-11 08:49:20
如何在中间层(MTS)实现分页在大数据量表中存取数据。
李维的书中有select top 5 * from tablename
可是这样的话,如何象上翻页。
能不能取第a到第b笔数据。就想csdn这样第一页。二页。。。。
怎么实现?

另外问问。谁能提供在MTS的详细代码。talisman@kali.com.cn
分数可以另加
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
talisman 2002-08-02
  • 打赏
  • 举报
回复
up
zzzai 2002-08-02
  • 打赏
  • 举报
回复
分页显示和三层结构没有太大的关系。
1、一次全部取得所有数据到客户端的数据集,或者用公文包方式;然后自己写一段算法,大致就是 记录总数/需要分的页数 =  每页的记录数,再根据这些数字来操纵数据集中的数据显示。
2、利用ADO的Recordset对象的PageSize、PageCount、AbsolutePage等属性可实现分页功能。
3、支持Top N 功能的数据库可以选取某字段为索引,作为下一次用top n的
条件。 select top 100 * from table_name

mingyeh 2002-05-19
  • 打赏
  • 举报
回复
怎么会呢?
talisman 2002-05-19
  • 打赏
  • 举报
回复
那不行。那在服务端也是把数据全部取出来了。如果数据量太大。服务段也受不了
mingyeh 2002-05-17
  • 打赏
  • 举报
回复
可以通过packetrecords控制客户一次只取若干记录,采用无状态对象,在客户端维护cursor
详情见李维系统篇
softwing 2002-05-12
  • 打赏
  • 举报
回复
这里再转贴一篇:
WEB数据库分页浏览的技巧
国防大学图书馆技术室 王渤

【提要】本文讲述了ASP开发WEB数据库时,控制网络数据流量,进行分页浏览输出的方法,阐述了分页浏览使用的主要技术和手段,介绍了RECORDSET对象与分页显示有关的技术与基础,文章中以实例介绍了数据记录分页显示的关键技术,并给出了设计思想和具体程序设计。

开发WEB数据库的查询时,为了限制网络流通量,通常会采用SQL(结构化查询语言)查询方式,在其条件子句中使用WHERE条件来筛选输出的记录。但是WHERE子句并不能完全限制用户在网上的查询范围,当查询条件范围较广时,必需要限制输出的数据总量,但上网者只能看到最前面的查询结果。
如果既要控制数据流量,又要让用户浏览所有查询到的数据记录,最普遍最有效的方式是将所查询的全部结果数据进行分页处理,并能提供“上一页”、“下一页”、“第一页”、“最后一页”等功能,或者能够直接定位到某一页,让上网者能逐一浏览每一页的数据记录。

一、 ADO的RECORDSET对象
在作者的《再论ASP开发WEB数据库》一文中,介绍过ADO的各种属性和方法,其中RECORDSET对象是最常用的对象,首先通过以下语句建立RECORDSET对象:
Set conn = Server.CreartObject ("ADODB.connection")
Conn.open "DNS设置"
'以上语句建立ADO联接
Set rs = Server.CreatObject ("ADODB.Recordset")
Rs.open Sql , Conn , adopenStatic
'以上两条语句用于建立RECORDSET对象并打开数据库
通常,我们使用RECORDSET对象的Excute方法打开数据表,如下语句所示:
Set rs = conn.Excute ("SQL语句")
但是使用RECORDSET对象的Excute方法打开数据对象是只能向前滚动的(Forword-Only),当我们读取此类数据记录时,能够调用的只有其MoveNext方法,只能一步步向前移动记录,这种方法不能完成分页显示的功能,因此使用以下方法打开数据记录集:
rs.Open 数据表名或SQL语句,Connection对象,Recordset类型,锁定类型
然后利用RECORDSET对象的“rs.AbsolutePage=n”来设置当前数据记录。

二、 RECORDSET对象的OPEN函数
OPEN函数使用中的参数中,“数据表名或SQL语句”,指具体的要使用的数据表名或者是SQL查询语句,“Connection对象”是一个已经打开的数据库对象,“Recordset类型”有以下四种设置值:
RECORDSET类型设置值
意义
AdOpenForwordOnly (=0)
只读,记录只能向前滚动
AdOpenStatic (=3)
只读,记录可以自由滚动
AdOpenKeyset (=1)
读写,记录可以自由滚动
AdOpenDynamic (=2)
读写,记录可以自由滚动 *
*与上一条区别是该模式可以自动更新当前数据表的数据
“锁定类型”的设置值有以下四种:
锁定类型的设置值
意义
AdLockReadOnly (=1)
打开只读的数据记录
AdLockPressimistic (=2)
悲观锁定
AdLockOptimistic (=3)
乐观锁定
AdLockBatchOptimistic (=4)
批次乐观锁定
为了实现分页显示,在打开RECORDSET对象后,必须先设置PageSize属性(每页的数据记录条数),RECORDSET对象才能计算数据记录的总条数,如下语句设置每页大小为10行:
rs.PageSize = 10
则RECORDSET对象的PageCount属性将设为:
((记录总数-1)/10)+1 (页)
设置rs.PageSize属性后,则可以通过对AbsolutePage属性的设置,将当前数据记录设置到某一页的第一条记录上,如下语句:
rs. AbsolutePage = 3
则当前记录则移动到第3页(每页为10行)的第一条记录上,因此输出某一页数据记录的程序如下:

rs. AbsolutePage = Page 'Page为页码号
For I=1 to rs.PageSize '输出本页的每条记录
'些处输出数据记录
rs.MoveNext '记录移动到下一条
if rs.EOF then exit for '若是记录尾则退出输出,因为若是最后一页,则可以没有足够的数据输出。
Next I

三、 分页显示的技巧实例:显示任一页数据
以下例程用于显示某一页的全部数据:
Sub ShowOnePage( rs, Page )
'rs为打开的数记录集,Page为要显示的页码
Response.Write "<CENTER><TABLE BORDER=1>"
Response.Write "<TR BGCOLOR=#00FFFF>"
Response.WRITE "<TD>序号</TD>"
For i=0 to rs.Fields.Count-1
'输出表头名称
Response.WRITE "<TD>" & rs.Fields(i).Name & "</TD>"
Next
Response.Write "</TR>"

rs.AbsolutePage = Page '设置当前页号
For iPage = 1 To rs.PageSize '输出当前页的所有记录
Response.Write "<TR>"
RecNo = (Page - 1) * rs.PageSize + iPage '计算输出的记录序号
Response.Write "<TD>" & RecNo & "</TD>"
For i=0 to rs.Fields.Count-1 '输出每一字段
Response.WRITE "<TD>" & rs.Fields(i).Value & "</TD>"
Next
Response.Write "</TR>"
rs.MoveNext
If rs.EOF Then Exit For
Next
Response.Write "</TABLE></CENTER>"
End Sub

四、 提供更具浏览性的网页
上网者往往查询多达几十页资料数据,从用户角度考虑,应该提供更直观方便的页面,不妨提供以下功能以方便上网者:

第一页 上一页 下一页 最后一页 输入页号: 总页数:

ASP程序实现如下:
'此处打开数据库联接及数据表对象
<%
If Request("Page") = "" Then Page=10
Page = CLng(Request("Page")) ' CLng 不可省略,用于将页码转换为长整型
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
%>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=gb_2312-80">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>分页浏览数据库的技巧</title>
</head>

<body bgcolor="#FFFFFF">
<h2 align="center">利用SQL命令筛选数据记录</h2>

<hr>
<%
ShowOnePage rs, Page
%>
<hr>

<form action="当前文件.asp" method="GET">
<%
If Page <> 1 Then
Response.Write "<A HREF=PageS23.asp?Page=1>第一页</A>"
Response.Write "<A HREF=PageS23.asp?Page=" & (Page-1) & ">上一页</A>"
End If
If Page <> rs.PageCount Then
Response.Write "<A HREF=PageS23.asp?Page=" & (Page+1) & ">下一页</A>"
Response.Write "<A HREF=PageS23.asp?Page=" & rs.PageCount & ">最后一页</A>"
End If
%> <p align="right">输入页数:<input type="text" size="3"
name="Page"> 页数:<font color="#FF0000"><%=Page%>/<%=rs.PageCount%></font> </p>
</form>
</body>
</html>
softwing 2002-05-12
  • 打赏
  • 举报
回复
分页显示和三层结构没有太大的关系。
1、一次全部取得所有数据到客户端的数据集,或者用公文包方式;然后自己写一段算法,大致就是 记录总数/需要分的页数 =  每页的记录数,再根据这些数字来操纵数据集中的数据显示。
2、利用ADO的Recordset对象的PageSize、PageCount、AbsolutePage等属性可实现分页功能。
3、支持Top N 功能的数据库可以选取某字段为索引,作为下一次用top n的
条件。 select top 100 * from table_name
ylm163net 2002-05-12
  • 打赏
  • 举报
回复
如果这些数据不经常更新,可以通过savetofile保存在本地,程序以公文包方式运行
ylm163net 2002-05-12
  • 打赏
  • 举报
回复
这个很难处理,虽然clientdataset 有packetrecords属性,但不能排序,
也极,不能有select * from YourTable order by的形式出现
shangshang 2002-05-12
  • 打赏
  • 举报
回复
clientdataset 有packetrecords属性,就是他了。
talisman 2002-05-12
  • 打赏
  • 举报
回复
to 无人喝彩:
数据需要更新.且数据量很大.比如10万条以上.如果保存到客户端.比较困难.且这些数据都可能随时更新.比如用户信息.
直接用select top 100 * from tablename ,也不能满足要求.
能不能再详细点.我还是不明白如何处理这样的数据
talisman 2002-05-11
  • 打赏
  • 举报
回复
高手呢?怎么没人回答啊
讨论一下也好啊

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧