2009-12-14 18 views
10

Estoy accediendo a una base de datos Microsoft Access 2002 (MDB) utilizando ASP.NET a través de la clase OdbcConnection, que funciona bastante bien, aunque muy lentamente.¿Cómo implemento la paginación en SQL para MS Access?

Mi pregunta es acerca de cómo implementar la paginación en SQL para las consultas a esta base de datos, ya que sé que puedo poner en práctica la cláusula TOP como:

SELECT TOP 15 * 
FROM table 

pero soy incapaz de encontrar una manera de limitar esto a un desplazamiento como se puede hacer con SQL Server usando ROWNUMBER. Mi mejor intento fue:

SELECT ClientCode, 
    (SELECT COUNT(c2.ClientCode) 
     FROM tblClient AS c2 
     WHERE c2.ClientCode <= c1.ClientCode) 
    AS rownumber 
FROM tblClient AS c1 
WHERE rownumber BETWEEN 0 AND 15 

el que falla con:

Error Origen: Microsoft Jet Database Engine

mensaje de error: No determinado valor de alguno de los requisitos parámetros.

No puedo resolver este error, pero supongo que tiene algo que ver con la subconsulta que determina un rownumber?

Cualquier ayuda sería apreciada con esto; mis búsquedas en Google han dado resultados poco útiles :(

+0

Esta Q tiene 59 visualizaciones (en ese momento) y no veo ni un solo voto alternativo. ¿Es esto solo una cuestión de DBA? –

Respuesta

10

Si desea aplicar paginación en la EM de acceso utilizan esta

SELECT * 
FROM (
    SELECT Top 5 sub.ClientCode 
    FROM (
     SELECT TOP 15 tblClient.ClientCode 
     FROM tblClient 
     ORDER BY tblClient.ClientCode 
    ) sub 
    ORDER BY sub.ClientCode DESC 
) subOrdered 
ORDER BY subOrdered.ClientCode 

Donde 15 es el PosInicial + PageSize y 5 es el PageSize.

EDIT para comentar:

El error que está recibiendo, es porque usted está tratando de re ference un nombre de columna asignar en el mismo nivel de la consulta, es decir, rownumber. Si se va a cambiar la consulta a:

SELECT * 
FROM (
    SELECT ClientCode, 
      (SELECT COUNT(c2.ClientCode) 
      FROM tblClient AS c2 
      WHERE c2.ClientCode <= c1.ClientCode) AS rownumber     
    FROM tblClient AS c1 
) 
WHERE rownumber BETWEEN 0 AND 15 

No debe dar un error, pero yo no creo que esto es el resultado de búsqueda que desea.

+0

Gracias! Aunque todavía estaba teniendo algunos problemas debido al analizador SQL de ODBC (ver mi respuesta). – Codesleuth

+0

Echa un vistazo a la respuesta editada. –

+1

Por supuesto, sí * golpea la cabeza * Podría haber usado también una cláusula HAVING, creo, pero no estoy seguro con JET - es como tratar de trabajar con SQL recubierto de vidrios rotos. – Codesleuth

3

Ver astander's answer para la respuesta original, pero aquí es mi implementación final que tenga en cuenta algunas reglas ODBC analizador (para los primeros 15 registros después de saltar 30):

SELECT * 
FROM (
    SELECT Top 15 -- = PageSize 
    * 
    FROM 
    (
    SELECT TOP 45 -- = StartPos + PageSize 
    * 
    FROM tblClient 
    ORDER BY Client 
) AS sub1 
    ORDER BY sub1.Client DESC 
) AS clients 
ORDER BY Client 

La diferencia aquí es que necesito la paginación para trabajar cuando se ordena por nombre de cliente, y necesito todas las columnas (bueno, en realidad solo un subconjunto, pero lo resuelvo en la consulta externa).

1

utilizo este código SQL para implementar la paginación con acceso

Select TOP Row_Per_Page * From [
Select TOP (TotRows - ((Page_Number - 1) * Row_Per_Page)
From SampleTable Order By ColumnName DESC
] Order By ColumnName ASC

he publicado un artículo con algunas capturas de pantalla on my blog

0

Uno Manera fácil de usar limit o get pagina Al trabajar en el acceso se usa una biblioteca ADODB que admite la paginación para muchos DB con la misma sintaxis. http://phplens.com/lens/adodb/docs-adodb.htm#ex8 Es fácil de modificar/anular la clase de buscapersonas para obtener el número requerido de filas en formato de matriz a continuación.

0

Este es el método simple de paginación utilizando las clases OleDbDataAdapter y Datatable. Estoy usando un comando SQL diferente para simplificar.

 Dim sSQL As String = "select Name, Id from Customer order by Id" 
     Dim pageNumber As Integer = 1 
     Dim nTop As Integer = 20 
     Dim nSkip As Integer = 0 
     Dim bContinue As Boolean = True 
     Dim dtData as new Datatable 
     Do While bContinue 

      dtData = GetData(sSQL, nTop, nSkip, ConnectionString) 

      nSkip = pageNumber * nTop 
      pageNumber = pageNumber + 1 

      bContinue = dtData.Rows.Count > 0 
      If bContinue Then 
       For Each dr As DataRow In dtData.Rows 
        'do your work here 
       Next 
      End If 
     Loop 

Aquí está la Función GetData.

Los códigos anteriores devolverán 10 filas de la tabla Cliente cada vez que el ciclo funcione hasta el final del archivo.