当前位置: 代码迷 >> ASP.NET >> 数据库、GridView 分页的有关问题?
  详细解决方案

数据库、GridView 分页的有关问题?

热度:8812   发布时间:2013-02-25 00:00:00.0
数据库、GridView 分页的问题??
我在使用 GridView 时 ,我设置了 GridView 分页相关属性,我想问下 ,如下情况 :

比如 ,我 select 某表 ,一共得到 1000000 条数据 ,这时 GridView 就分页显示了 。

那这时 ,我想问 : 
  情况一 : 1000000 条数据都到了客户端 ,然后再 GridView 分页显示 。
  情况二 : 数据分批到达客户端 ,GridView 显示第一页时 ,第一页的数据从服务器到达客户端 ;GridView 显示第二页时 ,第二页的数据从服务器到达客户端 ;GridView 显示第三页时 ,第三页的数据从服务器到达客户端 ;......

请问是哪种情况??

如果是第二种情况的话,要自己写分页算法??有好的分页算法推荐下(链接啥的都可)??

------解决方案--------------------------------------------------------
分页英爱查询需要的数据,然后绑定到Gridview
比如你每页20条记录,那么第一页就该查询第1-20条,第二页就该查询第21-40条,以此类推。
根据查询返回的记录重新绑定Gridview.
------解决方案--------------------------------------------------------
第二种,按需取数据,张永资源小速度快----使用分页控件比较方便
------解决方案--------------------------------------------------------
肯定要用情况二了,一次性加载那么多数据性能肯定不高,分页算法代码都差不多,总记录数,当前页码,每页显示记录数网上很多,直接写一个存储过程就好了,要分页的时候就调写好的过程就OK了。
------解决方案--------------------------------------------------------
可以使用分页控件,网上有很多,主流的就是aspnetpager 控件,功能较全
------解决方案--------------------------------------------------------
程序代码

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Clear
-- Create date: 2007-01-30
-- Description: 高性能分页
-- =============================================
Alter PROCEDURE [dbo].[Tag_Page_Name_Select]
-- 传入最大显示纪录数和当前页码
@MaxPageSize int,
@PageNum int,
-- 设置一个输出参数返回总纪录数供分页列表使用
@Count int output
AS
BEGIN
SET NOCOUNT ON;

DECLARE
-- 定义排序名称参数
@Name nvarchar(50),
-- 定义游标位置
@Cursor int
-- 首先得到纪录总数
Select @Count = count(tag_Name)
FROM [viewdatabase0716].[dbo].[view_tag];
-- 定义游标需要开始的位置
Set @Cursor = @MaxPageSize*(@PageNum-1)+1
-- 如果游标大于纪录总数将游标放到最后一页开始的位置
IF @Cursor > @Count
BEGIN
-- 如果最后一页与最大每次纪录数相等,返回最后整页
IF @Count % @MaxPageSize = 0
BEGIN
IF @Cursor > @MaxPageSize
Set @Cursor = @Count - @MaxPageSize + 1
ELSE
Set @Cursor = 1
END
-- 否则返回最后一页剩下的纪录
ELSE
Set @Cursor = @Count - (@Count % @MaxPageSize) + 1
END
-- 将指针指到该页开始
Set Rowcount @Cursor
-- 得到纪录开始的位置
Select @Name = tag_Name
FROM [viewdatabase0716].[dbo].[view_tag]
orDER BY tag_Name;
-- 设置开始位置
Set Rowcount @MaxPageSize
-- 得到该页纪录
Select * 
From [viewdatabase0716].[dbo].[view_tag]
Where tag_Name >= @Name
order By tag_Name

Set Rowcount 0
END


然后是分页控件(... 为省略的生成HTML代码方法):
 程序代码

using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

/// <summary>
/// 扩展连接字符串
/// </summary>
public class ExStringBuilder
{
private StringBuilder InsertString;
private StringBuilder PageString;
private int PrivatePageNum = 1;
private int PrivateMaxPageSize = 25;
private int PrivateMaxPages = 10;
private int PrivateCount;
private int PrivateAllPage;
public ExStringBuilder()
{
InsertString = new StringBuilder("");
}
/// <summary>
/// 得到生成的HTML
/// </summary>
public string GetHtml
{
get
{
return InsertString.ToString();
}
}
/// <summary>
/// 得到生成的分页HTML
/// </summary>
public string GetPageHtml
{