逐頁查看查詢結果

將查詢結果分頁是以較小資料子集或頁傳回查詢結果的過程。 這是一種常用的方式,可將結果以小型、易於管理的區塊顯示給使用者。

DataAdapter 可讓您輕鬆地從多載的 Fill 方法中僅傳回一頁資料。 不過,如需對大筆查詢結果進行分頁,則這種方式可能不是最好的選擇,因為雖然 DataAdapter 只會將要求的記錄填入目標 DataTableDataSet,但仍然會用到傳回整個查詢所需的資源。 若您要從資料來源傳回一頁資料,並且不使用傳回整個查詢的資源,請為您的查詢指定其他準則,以將傳回的資料列縮小到必要的範圍內。

若要使用 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");  

前一個範例中,DataSet 只填入了五筆記錄,但是傳回了整個 Orders 資料表。 若要以相同的五筆記錄填入 DataSet,但是只傳回五筆記錄,請在您的 SQL 陳述式使用 TOP 和 WHERE 子句,如下列範例所示。

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");  

請注意,若以這種方式進行查詢結果的分頁,您必須保留用來排序資料列的唯一識別項,才能將唯一 ID 傳遞給命令以傳回下一頁記錄,如下列程式碼範例所示。

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

若要透過採用 startRecordmaxRecords 參數的多載 Fill 方法來傳回下一頁記錄,請按頁面大小來遞增目前的記錄索引,並填入資料表。 請記住,雖然只是在 DataSet 中新增一頁記錄,但實際上資料庫伺服器會傳回整個查詢結果。 下列程式碼範例中,資料表列會先經過清除後,再填入下一頁資料。 您可以在本機快取中保留特定數量的傳回資料列,來降低往返資料庫伺服器的次數。

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");  

請參閱