Правильный способ реализации подкачки в SqlDataReader! - PullRequest
5 голосов
/ 18 апреля 2011

Я правильно использую свой собственный способ для достижения этой цели, но я не знаю, эффективен он или нет, так что это функция:

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.
Любые предложения, заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 18 апреля 2011

Вы можете сделать все подкачки на сервере sql.

Например, см.

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;
2 голосов
/ 18 апреля 2011

Если вы используете SQL Server 2008, вы можете использовать встроенные выражения для общих таблиц и функцию 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

Надеюсь, это поможет

...