通过查询结果分页

适用于:.NET Framework .NET .NET Standard

下载 ADO.NET

查询结果分页是以较小数据子集(即页)的形式返回查询结果的过程。 它通常用于以易于管理的小块形式向用户显示结果。

SqlDataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。 但是,对于大量的查询结果,它可能并不是首选的分页方法,因为 DataAdapter 虽然仅使用所请求的记录来填充目标 DataTableDataSet,但仍会使用返回整个查询的资源。

若要在从数据源中返回一页数据时不使用返回整个查询的资源,请为查询指定附加条件,使返回的行数减少到只返回所需的行。

若要使用 Fill 方法返回一页数据,请指定 startRecord 参数(代表该数据页中的第一个记录),并指定 maxRecords 参数(代表该数据页中的记录数) 。

示例

以下代码示例显示如何使用 Fill 方法来返回查询结果(页大小为 5 个记录)的第一页。

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 只填充了 5 个记录,但却返回了整个 Orders 表 。 若要用相同的 5 个记录填充 DataSet 但仅返回这 5 个记录,请在 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,以便将唯一 ID 传递给命令以返回下一页记录,如下面的代码示例所示。

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

若要使用接受 startRecord 和 maxRecords 参数的 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");

若要返回下一页记录而不让数据库服务器返回整个查询,请指定对 SQL 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");

另请参阅