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


Постраничный просмотр результатов запроса

Разбиение результатов запроса на страницы — это процесс возврата результатов запроса в небольшие наборы данных, или страницы. Это распространенная практика отображения результатов для пользователя в небольших и простых блоках управления.

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

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

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

Dim currentIndex As Integer = 0  
Dim pageSize As Integer = 5  
  
Dim orderSQL As String = "SELECT * FROM dbo.Orders ORDER BY OrderID"  
' Assumes that connection is a valid SqlConnection object.  
Dim adapter As SqlDataAdapter = _  
  New SqlDataAdapter(orderSQL, connection)  
  
Dim dataSet As DataSet = New DataSet()  
adapter.Fill(dataSet, currentIndex, pageSize, "Orders")  
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");  

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

Dim pageSize As Integer = 5  
  
Dim orderSQL As String = "SELECT TOP " & pageSize & _  
  " * FROM Orders ORDER BY OrderID"  
Dim adapter As SqlDataAdapter = _  
  New SqlDataAdapter(orderSQL, connection)  
  
Dim dataSet As DataSet = New DataSet()  
adapter.Fill(dataSet, "Orders")
int pageSize = 5;  
  
string orderSQL = "SELECT TOP " + pageSize +
  " * FROM Orders ORDER BY OrderID";  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);  
  
DataSet dataSet = new DataSet();  
adapter.Fill(dataSet, "Orders");  

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

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

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

currentIndex = currentIndex + pageSize  
  
dataSet.Tables("Orders").Rows.Clear()  
  
adapter.Fill(dataSet, currentIndex, pageSize, "Orders")  
currentIndex += pageSize;  
  
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")  
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");  

См. также