將查詢結果分頁
將查詢結果分頁是以較小資料子集或頁傳回查詢結果的過程。這是一種常用的方式,可將結果以小型、易於管理的區塊顯示給使用者。
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");
前一個範例中,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();
若要透過採用 startRecord 和 maxRecords 參數的多載 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");