使用MySQL LIMIT的ASP.NET GridView分页

时间:2010-07-21 19:57:14

标签: asp.net sql mysql gridview pagination

我有一个GridView,它在运行时通过查询绑定到数据集。我使用PageIndexChangingPageIndexChanged事件处理分页,以便在来自寻呼机的回发时设置GridView的PageIndex属性。虽然这功能正常,但问题是此表中的> 7800行的性能。它必须为每个分页操作返回整个结果集。

如果我使用MySQL LIMIT offset,pagesize子句,我会得到< 50ms的结果。我的问题是如何在查询中使用LIMIT子句来加速分页?我不知何故需要动态计算偏移量。我通过GridView.PageSize知道运行时的页面大小。

UPDATE :我的新问题是GridView分页控件消失了,大概是因为每个查询只返回10条记录(PageSize = 10)

谢谢, 标记

4 个答案:

答案 0 :(得分:0)

你也知道页码,对吗?由pagenumber * pagesize偏移。

答案 1 :(得分:0)

如果要在查询中过滤结果,则必须手动打开分页链接,这是来自Rolla的4个人的好文章:

http://www.4guysfromrolla.com/webtech/082901-1.shtml#postadlink

答案 2 :(得分:0)

要修复寻呼机,您必须手动创建。请参阅本文尝试相同的内容(它使用SQL Server for DB,但您也可以在MySQl中实现这些想法):http://www.nikhedonia.com/notebook/entry/efficient-paging-for-gridview/

答案 3 :(得分:0)

ObjectDataSource控件(http://msdn.microsoft.com/en-us/library/9a4kyhcx%28v=vs.90%29.aspx)是一种自定义分页机制,可以处理大量数据的分页。自定义分页确保一次只从数据库中检索特定数据页所需的精确记录集。

ObjectDataSource控件的用法如下:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
  OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
  SelectMethod="GetProductsPaged" EnablePaging="True"
  SelectCountMethod="TotalNumberOfProducts">
</asp:ObjectDataSource>

TypeName 是包含 GetProductsPaged TotalNumberOfProducts 函数的类的名称。 ProductsBLL 类的可能表示如下:

public class ProductsBLL
{
   public int TotalNumberOfProducts()
   {
    int recordCount = 0;
    if (databaseObj.OpenDatabase())
    {
       recordCount = databaseObj.DBTotalNumberOfProducts(searchQuery);
       databaseObj.CloseDatabase();
    }
    return recordCount;
  }

  public DataTable GetProductsPaged(int startRowIndex, int maximumRows)
  {
    DataTable pagedDataDV = null;
    if (databaseObj.OpenDatabase())
    {
       pagedDataDV = databaseObj.DBGetProductsPaged(searchQuery, startRowIndex, maximumRows);
       databaseObj.CloseDatabase();
    }
    return pagedDataDV;
  }
}

函数 DBTotalNumberOfProducts 获取给定查询的总行数。函数 DBGetProductsPaged 使用MySQL LIMIT 关键字从数据库获取查询数据。 LIMIT 使用 startRowIndex maximumRows 变量中的值。 maximumRows 的值将是一个常量,应该与网格的页面大小相同。

可以使用以下代码将数据绑定到网格控件:

GridData.DataSourceID = "ObjectDataSource1";
GridData.DataBind();

以下网站将提供有关ObjectDataSource控件的更多信息:http://msdn.microsoft.com/en-us/library/bb445504.aspx