逐頁查看查詢結果
將查詢結果分頁是以較小資料子集或頁傳回查詢結果的過程。 這是一種常用的方式,可將結果以小型、易於管理的區塊顯示給使用者。
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");
請參閱
- DataAdapter 和 DataReader
- ADO.NET 概觀 \(部分機器翻譯\)