没有存储过程,如何在ASP.NET中分页结果集?

时间:2009-08-25 05:40:05

标签: asp.net sql sql-server sql-server-2000

如果没有存储过程,如何在ASP.NET中查找从SQL Server检索的结果集?

5 个答案:

答案 0 :(得分:9)

您可以使用LINQ,例如:

 var customerPage = dataContext.Customers.Skip(50).Take(25);

然后显示这25位客户。

请参阅Scott Guthrie的优秀Using LINQ-to-SQL - 第6部分 - 检索带有服务器端分页的产品。

另一个选项(在SQL Server 2005及更高版本上)是使用有序CTE(公用表表达式) - 如下所示:

WITH CustomerCTE AS
(
  SELECT CustomerID, 
         ROW_NUMBER() OVER (ORDER BY CustomerID DESC) AS 'RowNum'
  FROM Customers
)
SELECT * FROM CustomerCTE
WHERE rownum BETWEEN 150 AND 200

您基本上使用ROW_NUMBER函数在排序标准上定义CTE,然后您可以随意选择任意数量的CTE(此处:150到200之间)。这是非常有效且非常有用的服务器端分页。将此CTE与您的实际数据表一起加入,您可以检索所需的任何内容!

马克

PS:好的,所以OP只有SQL Server 2000,所以CTE不起作用: - (

如果您无法更新到SQL Server 2005或.NET 3.5,我担心您唯一可行的选择确实是存储过程。您可以执行以下操作 - 请参阅此博文Efficient and DYNAMIC Server-Side paging with SQL Server 2000Paging with SQL Server Stored Procedures

答案 1 :(得分:3)

最好的方法是使用一个ORM来为你生成动态分页代码 - LINQ To SQL,NHibernate,Entity Framework,SubSonic等。

如果您的结果集很小,您可以使用DataPager,PagedDataSource或使用LINQ Skip and Take命令手动在服务器上进行寻呼。

答案 2 :(得分:0)

(因为您使用的是SQL Server 2000,.NET 2.0,并且不想使用ORM,所以新的答案)

在SQL Server 2000中有两种处理分页的方法:

  1. 如果您的ID列是连续的,没有漏洞,您可以执行一个类似SELECT Name, Title FROM Customers WHERE CustomerID BETWEEN @low and @high - @low和@high的SQL字符串,这些参数是根据页面大小和你正在上的页面。关于here的更多信息。

  2. 如果您没有顺序ID,则最终使用最小ID和@@ rowcount来选择范围。例如,SET @@rowcount 20; SELECT Name, Title FROM Customers WHERE CustomerID > @low' - 从页面大小和页面或最后显示的CustomerID计算@low。有关该方法的一些信息here

  3. 如果您有一个小型数据集,则可以在.NET代码中对其进行分页,但效率较低。我推荐使用PagedDataSource,但是如果你想自己编写,你可以将你的记录从SqlDataReader读入一个数组然后use the Array.Range function to page through it

答案 3 :(得分:0)

这就是我在ASP.NET 2.0应用程序中使用AJAX处理所有分页和排序的方法。

http://programming.top54u.com/post/AJAX-GridView-Paging-and-Sorting-using-C-sharp-in-ASP-Net.aspx

答案 4 :(得分:0)

我的一般方法通常是为要分页的结果创建两个表。第一个是信息表,它具有搜索ID标识列,并具有最小和最大行号。第二个表包含实际结果,并具有行号的标识列。我插入第二个表并获取最小和最大行并将它们存储在第一个表中。然后我可以通过选择我想要的行来翻页。我通常在插入之前使用代码在24小时后使结果到期。我通常使用存储过程为我做插入,但你可以在没有存储过程的情况下进行插入。

这样做的好处是只执行一次更复杂的sql搜索。并且数据集在页面显示之间不会改变。它是数据的快照。它还可以简化服务器端排序。我只需按顺序选择这些行并重新插入第二个表。