Поделиться через


Разбивка на страницы результатов запроса

Область применения: платформа .NET Framework .NET Standard

Скачать ADO.NET

Постраничный просмотр результатов запроса - это процесс возврата результатов запроса небольшими подмножествами данных (страницами). Этот метод часто используется для вывода результатов пользователю в виде небольших фрагментов, с которыми легко работать.

Класс SqlDataAdapter предоставляет возможность возврата одной страницы данных при помощи перегрузок метода Fill. Однако это может быть не лучшим решением для постраничного просмотра большого числа результатов запроса. Хотя класс DataAdapter заполняет целевые объекты DataTable или DataSet только запрошенными записями, при этом все равно используются ресурсы, необходимые для возврата всех результатов запроса.

Для возврата страницы данных из источника данных без использования лишних ресурсов задайте для запроса дополнительные критерии, которые ограничат число возвращаемых строки только необходимыми.

Чтобы использовать метод Fill для возврата страницы данных, укажите с помощью параметра startRecord первую запись на странице данных, а с помощью параметра maxRecords — число записей на странице данных.

Пример

В следующем примере кода показано, как использовать метод Fill для возврата первой страницы результатов запроса, где размер страницы — пять записей.

int currentIndex = 0;
int pageSize = 5;

string orderSQL = "SELECT * FROM Orders ORDER BY OrderID";
// Assumes that connection is a valid SqlConnection object.  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);

DataSet dataSet = new DataSet();
adapter.Fill(dataSet, currentIndex, pageSize, "Orders");

В предыдущем примере DataSet заполняется только пятью записями, но возвращается вся таблица Orders. Чтобы заполнить DataSet теми же пятью записями и возвратить только пять записей, в инструкции SQL используйте предложения TOP и WHERE, как в следующем примере кода.

int pageSize = 5;

string orderSQL = "SELECT TOP " + pageSize +
  " * FROM Orders ORDER BY OrderID";

// Assumes that connection is a valid SqlConnection object.  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);

DataSet dataSet = new DataSet();
adapter.Fill(dataSet, "Orders");

Примечание.

При такой разбивке результатов запроса на странице необходимо сохранить unique identifier, который упорядочивает строки, чтобы передать уникальный идентификатор команде для возврата следующей страницы записей, как показано в следующем примере кода.

string lastRecord = 
    dataSet.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();

Чтобы возвратить next page of records, используя перегрузку метода Fill, который принимает параметры startRecord и maxRecords, следует увеличить позицию текущей записи на размер страницы и заполнить таблицу.

Примечание.

Следует помнить, что сервер базы данных возвращает все результаты запроса, даже если к DataSet добавляется только одна страница записей.

В следующем примере кода строки таблицы очищаются, а затем заполняются следующей страницей данных. Может быть необходимым сохранить определенное число возвращенных строк в локальном кэше, чтобы уменьшить число обращений к серверу базы данных.

currentIndex += pageSize;

// Assumes that dataset and adapter are valid objects.
dataSet.Tables["Orders"].Rows.Clear();
adapter.Fill(dataSet, currentIndex, pageSize, "Orders");

Чтобы возвратить следующую страницу записей, не заставляя сервер баз данных возвращать сразу все результаты запроса, укажите ограничивающие критерии для инструкции SELECT. Так как код предыдущего примера сохранил последнюю возвращенную запись, ее можно использовать в предложении WHERE, чтобы указать для запроса начальную точку, как показано в следующем примере кода.

orderSQL = "SELECT TOP " + pageSize + 
    " * FROM Orders WHERE OrderID > " + lastRecord + " ORDER BY OrderID";
adapter.SelectCommand.CommandText = orderSQL;

dataSet.Tables["Orders"].Rows.Clear();

adapter.Fill(dataSet, "Orders");

См. также