Разбивка на страницы ASP.NET GridView с использованием MySQL LIMIT - PullRequest
3 голосов
/ 21 июля 2010

У меня есть GridView, который я связываю во время выполнения с набором данных посредством запроса. Я обрабатываю нумерацию страниц, используя события PageIndexChanging и PageIndexChanged, чтобы установить свойство PageIndex GridView при обратной передаче из пейджера. Хотя это работает правильно, проблема заключается в производительности с> 7800 строк в этой таблице. Он должен возвращать полный набор результатов для каждой операции подкачки.

Если я использую предложение MySQL LIMIT offset,pagesize, я получаю результаты <50 мс. У меня вопрос, как я могу использовать предложение LIMIT в своем запросе для ускорения нумерации страниц? Мне как-то нужно рассчитать смещение динамически. Я знаю размер страницы во время выполнения через GridView.PageSize. </p>

ОБНОВЛЕНИЕ : Моя новая проблема заключается в том, что исчезли элементы управления разбиением на страницы GridView, предположительно потому, что из каждого запроса возвращается только 10 записей (PageSize = 10)

Спасибо, Mark

Ответы [ 4 ]

0 голосов
/ 29 апреля 2012

Элемент управления 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

0 голосов
/ 23 июня 2011

Вам придется вручную включить ссылки на пейджинг, если вы фильтруете результат в своем запросе. Вот хорошая статья от 4 парней из Rolla:

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

0 голосов
/ 29 июня 2011

Чтобы исправить пейджер, вам придется создать его вручную. Посмотрите эту статью, которая пытается сделать то же самое (она использует SQL Server для БД, но вы также можете реализовать идеи в MySQl): http://www.nikhedonia.com/notebook/entry/efficient-paging-for-gridview/

0 голосов
/ 22 июля 2010

Вы также знаете номер страницы, верно?Смещение по номеру страницы * размер страницы.

...