大家一起来讨论一下有关数据库的分页浏览查询结果的最佳方法!

pursuer 2002-11-21 10:28:25
分页浏览查询结果使服务端和客户端在查询大量数据的时候使用尽量少的资源!
...全文
68 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
7710703 2002-12-02
  • 打赏
  • 举报
回复
我觉得在Sql Server中根本没有好的实现分页的方式,真是令人头疼。

首先是将所有的记录取出来,不管我们用什么方式在取出的结果集上操作,但是这根本不是好方法。因为在取出所有数据的时候就已经浪费了大量的时间及资源。

TheAres(班门斧)提供的第二种方法是有一点作用,但是我直接跳转到第n页的话我怎么找前一页的ID?
mmkk() ( ) 兄的临时表是不是也全取出来再进行筛选的阿?
javanow(想我生命的意义)兄的游标是在存储过程里使用的吗?那岂不是也很浪费时间?
ToBeCharcoal(真想有星星)兄的取一段记录看起来很不错,其实在SqlDataAdapter填充DataSet之前就已经把所有的记录取回来了。
我觉得brbrm(般若波若密)兄的方法还好一些,但是我翻到很多页的时候也是个问题!

以上愚见,仅是讨论,各位海涵。
sumkeen 2002-11-30
  • 打赏
  • 举报
回复
假设每页显示n条记录,当前的显示位置为p


int p=o;
第一页,
select top 每页显示的记录条数n * from table ;
下一页,
p+=每页显示的记录数n;
select top 每页显示的记录条数n * from table where ID > 位置p.
chenbinghui 2002-11-30
  • 打赏
  • 举报
回复
ToBeCharcoal(真想有星星):说的好!
yzdy 2002-11-30
  • 打赏
  • 举报
回复
我现在成功使用.net中的XmlDataDocument,XslTransform实现分页显示:
1.XmlDataDocument myxml=new XmlDataDocument(dataset);
2.在myxml写入分页信息的Node;
3.编写相应的xsl文件,在xsl中通过<xsl:if test="position() >= $start and position() <= $end"></xsl:if>控制分页显示
4.通过XslTransform将xml转换为html.
但我觉得这种实现方法效率不高,每次都要从数据库中取出所有数据,数据量大时,速度肯定很慢。
以前我用PHP+MYSQL编写分页程序时,只需通过sql语句“select * from table order by time desc limit $start,$offset”就可以实现。
我觉得采用SQL Server数据库时的分页因难,主要是因为SQL Server没有提供分页的SQL语句。
dull_knife 2002-11-28
  • 打赏
  • 举报
回复
up
javanow 2002-11-27
  • 打赏
  • 举报
回复
我说说我的思路,我分页用是的游标,呵呵。
不过要做到使用程序来自动生成分页的存储过程,还是需要一定经验及时间来调试的。

最近经济非常紧张,能卖的全都卖了。不好意思。
javanow 2002-11-27
  • 打赏
  • 举报
回复
输入一个分页关键信息,就能帮你自动生成分页的存储过程,速度快,可以直接到达指定的任意页数。

如果您对这个程序感兴趣,可以联系 javanow@21cn.com

ToBeCharcoal 2002-11-27
  • 打赏
  • 举报
回复
查询结果分页是以较小数据子集(即页)的形式返回查询结果的过程。它通常用于以易于管理的小块区的形式向用户显示结果。
DataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。若要使用 Fill 方法返回一页数据,请指定 startRecord(它指定该数据页的第一个记录),并指定 maxRecords(它指定该数据页中的记录数)。

int currentIndex = 0;
int pageSize = 5;

string orderSQL = "SELECT * FROM Orders ORDER BY OrderID";
SqlDataAdapter myDA = new SqlDataAdapter(orderSQL, nwindConn);

DataSet myDS = new DataSet();
myDA.Fill(myDS, currentIndex, pageSize, "Orders");

若要实现分层数据访问,可以使用 .NET 框架中的可用 XML 类。.NET 框架允许分别通过 DataSet 对象和 XmlDataDocument 对象对数据的关系和分层表示形式进行实时、同步的访问。
当 DataSet 与 XmlDataDocument 同步时,这两个对象都使用同一组数据。这意味着如果对 DataSet 作出更改,更改将在 XmlDataDocument 中得到反映,反之亦然。DataSet 和 XmlDataDocument 之间的这种关系允许单个应用程序使用一组数据来访问围绕 DataSet 生成的整组服务(例如 Web 窗体和 Windows 窗体控件以及 Visual Studio .NET 设计器)以及包括可扩展样式表语言 (Extensible Stylesheet Language, XSL)、XSL 转换 (XSLT) 和 XML 路径语言 (XPath) 在内的 XML 服务组,从而提供了很大的灵活性。您不必选择使应用程序以哪一组服务为目标——这两组服务都可用。

有若干种方法可以使 DataSet 与 XmlDataDocument 同步。


使用架构(关系结构)和数据填充 DataSet,然后使其与新 XmlDataDocument 同步。这将提供现有关系数据的分层视图。例如:
DataSet myDataSet = new DataSet();

// Add Code here to populate the DataSet with schema and data.

XmlDataDocument xmlDoc = new XmlDataDocument(myDataSet);


omale 2002-11-27
  • 打赏
  • 举报
回复
我同意thearex的说法。
brbrm 2002-11-21
  • 打赏
  • 举报
回复
子查询?
假设表中有个标识主键ID,从1开始递增
当前页:
int cur = DataGrid.CurrentPageIndex;
每页显示i行
那命令就是
SELECT TOP i * FROM
SELECT TOP i*cur * FROM table ORDER BY ID DESC
ORDER BY ID
mmkk 2002-11-21
  • 打赏
  • 举报
回复
或者可以使用临时表
select 字段1,字段2,IDENTITY(int,1,1) as Num into #temp1 from tablename ...
select * from temp1 where Num>CurrentPageIndex*PageSize and Num<(CurrentPageIndex+1)*PageSize
TheAres 2002-11-21
  • 打赏
  • 举报
回复
我有两种办法.(是说ASP.Net吧,用datagrid)
1.使用datagrid的分页属性,不用贴代码了吧,这种方法虽然可以实现分页,但是服务器端是要执行大量的查询操作.

2.大体思路如下:
假设分页,每页50.在数据库中有一个不重复的索引,假设是ID.
第一页, select top 50 * froom table ,查询简单,快. 然后记住第50条的ID,
第二页, select top 50 * from table where ID > 你记录的ID.
依次类推.
当然,写出存储过程就更快了.

3.由于ADO.Net目前的版本不支持,服务器端的游标,微软说以后的版本会支持,支持以后,用这个一个更方便.

4.实际上,减少网络的通讯量才是关键.

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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