通过查询结果分页

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

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

要返回使用包含FillstartRecord参数的maxRecords方法重载的下一页记录,请通过页面大小递增当前记录索引并填充表。 请记住,即使仅在 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");

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

另请参阅