我正确地使用自己的方式实现这一目标,但我不知道它是否有效,所以这就是功能:
public SqlDataReader GetArticlesByPage(int pageNum, int pageSize)
{
if (pageNum == 0)
pageNum = 1;
SqlDataReader dr = SqlHelper.ExecuteReader(string.Format("SELECT TOP {0} Des, Id, Title, Icon FROM Threads ORDER BY Id DESC", pageSize * pageNum));
int div = pageNum - 1;
div = pageSize * div;
for (int i = 0; i < div; i++)
dr.Read();
return dr;
}
它工作正常,但是当你看到代码时,当我需要在页面大小(例如每页10个)时选择第10页的文章时,我选择前10 * 10结果,然后使用FOR语句跳过不需要的结果。
任何建议,提前谢谢。
答案 0 :(得分:7)
您可以在sql server上执行所有分页。
例如,请参阅
http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx
如果您不想这样做并且坚持使用TOP
,那么在开始时跳过行就是您可以做的所有事情,这没关系。
(来自上面的链接)
DECLARE @PageNum AS INT;
DECLARE @PageSize AS INT;
SET @PageNum = 2;
SET @PageSize = 10;
WITH OrdersRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
,OrderID
,OrderDate
,CustomerID
,EmployeeID
FROM dbo.Orders
)
SELECT *
FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1
AND @PageNum * @PageSize
ORDER BY OrderDate
,OrderID;
答案 1 :(得分:2)
如果您使用的是SQL Server 2008,则可以使用内置的Common表Expressions和ROW_NUMBER()函数来轻松高效地实现此目的。
您将以
编写查询WITH MAINSQL AS(
SELECT Des, Id, Title, Icon,
rownum = ROW_NUMBER() OVER (Order by Id desc)
FROM Threads
)
SELECT * FROM MAINSQL WHERE rownum between 10 AND 100
将10和100替换为页面的起始行和结束行
有关详细信息,请参阅
http://msdn.microsoft.com/en-us/library/ms186734.aspx
和
http://msdn.microsoft.com/en-us/library/ms190766.aspx
希望这有帮助