代码之家  ›  专栏  ›  技术社区  ›  Himadri

考虑到记录的大小,在GridView中实现分页的最佳过程是什么?

  •  2
  • Himadri  · 技术社区  · 15 年前

    我在sq server db中有一个表,有超过100万行。 我需要在网格视图中显示这些数据,并在ASP.NET页面中分页。

    由于记录量较大,我需要提高页面的性能来显示数据,实现分页。

    我应该遵循什么程序来实现分页?

    请帮忙。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Community skywinder    7 年前

    有很多种方法可以做到这一点,但一般的概念是“按需获取”。在第一页中显示前50条记录时,不需要获取记录200到250。

    有一些非常智能的实现将Ajax混合在一起,以改善用户体验和前瞻性和/或后台获取,例如,页面大小为50时获取100,以便更快地查看下一页。

    你可能想从更直接的开始, Google 你应该能在周围找到。

    这里有一对夫妇:
    Effective Paging with Large Amount of Data in ASP.NET
    Effective Data Paging Using SQL Server 2005 and Microsoft's Enterprise Library

        2
  •  0
  •   David Glass    15 年前

    我最喜欢的方法是使用页面索引和页面大小值作为输入参数,只返回数据库中记录的一个子集。检查这个 book 这就详细解释了所有这些。参数sortExpression、pageIndex和pageSize可以直接从您的网格视图中出现,并希望到达BLL,然后到达DAL层,到达存储过程或SQL文本查询。

    对于SQL Server 2000,请使用临时表。

    对于SQL Server 2005,可以使用row_number()函数,该函数返回连续编号的序列。此序列从1开始,并为返回的每一行提供唯一的编号。使用页索引和页大小值计算要从row_number()函数结果返回的行的下限和上限。下面是使用存储过程的示例:

    CREATE PROCEDURE dbo.GetSomeItems
    (
       @PageIndex   int,
       @PageSize    int
    )
    AS
    SET NOCOUNT ON
    
    SELECT * FROM
    (
        SELECT SomeItems.*,
          ROW_NUMBER() OVER (ORDER BY SomeCol) AS RowNum
        FROM SomeItems
    ) Records
        WHERE Records.RowNum BETWEEN (@PageIndex*@PageSize+1) AND ((@PageIndex+1)*@PageSize)
    ORDER BY Records.SomeCol
    

    或者使用SQL文本查询:

    public override List<SomeItemDetails> GetSomeItems(string sortExpression, int pageIndex, int pageSize)
    {
        using (SqlConnection cn = new SqlConnection(this.ConnectionString))
        {
          sortExpression = EnsureValidCompoundSortExpression(sortExpression); 
          int lowerBound = pageIndex * pageSize + 1;
          int upperBound = (pageIndex + 1) * pageSize;
          string sql = string.Format(@"SELECT * FROM
           (
              SELECT SomeItems.*,
                 ROW_NUMBER() OVER (ORDER BY {0}) AS RowNum
                 FROM SomeItems
           ) Records
              WHERE Records.RowNum BETWEEN {1} AND {2}
              ORDER BY {0}", sortExpression, lowerBound, upperBound);
          SqlCommand cmd = new SqlCommand(sql, cn);
          cn.Open();
          return GetSomeItemCollectionFromReader(ExecuteReader(cmd));
        }
    }