【发布时间】:2010-11-22 12:18:28
【问题描述】:
如果没有存储过程,如何在 ASP.NET 中对从 SQL Server 检索到的结果集进行分页?
【问题讨论】:
标签: asp.net sql sql-server sql-server-2000
如果没有存储过程,如何在 ASP.NET 中对从 SQL Server 检索到的结果集进行分页?
【问题讨论】:
标签: asp.net sql sql-server sql-server-2000
你可以使用 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 2000 或 Paging with SQL Server Stored Procedures
【讨论】:
(新答案,因为您使用的是 SQL Server 2000、.NET 2.0,并且不想使用 ORM)
在 SQL Server 2000 中有两种处理分页的方法:
如果您没有顺序 ID,您最终会使用最小 ID 和 @@rowcount 来选择范围。例如,SET @@rowcount 20; SELECT Name, Title FROM Customers WHERE CustomerID > @low' - 根据页面大小和页面或最后显示的 CustomerID 计算 @low。有一些关于这种方法的信息here。
如果您有一个小数据集,您可以在 .NET 代码中对其进行分页,但效率较低。我推荐 PagedDataSource,但如果您想自己编写,您可以将记录从 SqlDataReader 读取到 Array 中,然后 use the Array.Range function to page through it。
【讨论】:
这就是我在 ASP.NET 2.0 应用程序中使用 AJAX 处理所有分页和排序的方式。
http://programming.top54u.com/post/AJAX-GridView-Paging-and-Sorting-using-C-sharp-in-ASP-Net.aspx
【讨论】:
我的一般方法通常是为要分页的结果创建两个表。第一个是具有搜索 id 标识列并具有最小和最大行号的信息表。第二个表包含实际结果,并具有行号的标识列。我插入第二个表并获取最小和最大行并将它们存储在第一个表中。然后我可以通过只选择我想要的行来翻页。我通常在插入之前使用代码在 24 小时后使结果过期。我通常使用存储过程为我执行插入操作,但您可以在没有存储过程的情况下执行此操作。
这样做的好处是只执行一次更复杂的 sql 搜索。并且数据集不会在页面显示之间更改。它是数据的快照。它还可以简化服务器端排序。我只需要按顺序选择这些行并重新插入到第二个表中。
【讨论】: