2011-04-18 23 views
5

I Am correctamente usando mi propia manera de lograr esto, pero no sé si es eficiente o no, así que esta es la función:¡La forma correcta de implementar paginación en SqlDataReader!

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; 
} 

Funciona bien, pero al ver que el código, cuando Necesito tomar los artículos de la página 10 cuando el tamaño de la página, por ejemplo, 10 por página, selecciono el resultado 10 * 10 superior y luego omito los resultados no deseados usando la instrucción FOR.
Cualquier sugerencia, gracias de antemano.

Respuesta

7

Puede hacer todas las llamadas en el servidor sql.

Por ejemplo, ver

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx

Si no desea hacerlo de esta manera y insiste en usar TOP, a continuación, saltar las filas en el arranque es bastante todo lo que puede hacer y que está bien.

(enlace de arriba)

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; 
+0

Esto funciona bien, pero se necesita mucho tiempo para hacer:/ – Rawhi

+0

Wow, yo siempre había hecho esto FETCH El uso de desplazamiento. Ejecuté una prueba para comparar ese método con este, y el CTE es mucho más eficiente. ¡Gracias! –

2

Si está utilizando SQL Server 2008, puede utilizar el construido en expresiones de tabla comunes y la función ROW_NUMBER() para lograr esto muy fácil y eficiente.

Usted tendrá que escribir la consulta como

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 

reemplazar el 10 y el 100 por el inicio y final de fila de la página

Para obtener más información, véase

http://msdn.microsoft.com/en-us/library/ms186734.aspx

Y

http://msdn.microsoft.com/en-us/library/ms190766.aspx

Esperanza esto ayuda

Cuestiones relacionadas