共用方式為


逐頁查看查詢結果

適用於:.NET Framework .NET .NET Standard

下載 ADO.NET

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

SqlDataAdapter 可讓您輕鬆地從多載的 Fill 方法中僅傳回一頁資料。 不過,如需對大筆查詢結果進行分頁,則這種方式可能不是最好的選擇,因為雖然 DataAdapter 只會將要求的記錄填入目標 DataTableDataSet,但仍然會用到傳回整個查詢所需的資源。

若您要從資料來源傳回一頁資料,並且不使用傳回整個查詢的資源,請為您的查詢指定其他準則,以將傳回的資料列縮小到必要的範圍內。

若要使用 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 陳述式使用 TOPWHERE 子句,如下列範例所示。

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

若要透過採用 startRecordmaxRecords 參數的多載 Fill 方法來傳回 next page of records,請按頁面大小來遞增目前的記錄索引,並填入資料表。

注意

請記住,雖然只是在 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");

請參閱