Search code examples
sqlms-accesspagination

How do I implement pagination in SQL for MS Access?


I'm accessing a Microsoft Access 2002 database (MDB) using ASP.NET through the OdbcConnection class, which works quite well albeit very slowly.

My question is about how to implement pagination in SQL for queries to this database, as I know I can implement the TOP clause as:

SELECT TOP 15 *
FROM table

but I am unable to find a way to limit this to an offset as can be done with SQL Server using ROWNUMBER. My best attempt was:

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

which fails with:

Error Source: Microsoft JET Database Engine

Error Message: No value given for one or more required parameters.

I can't work out this error, but I'm assuming it has something to do with the sub-query that determines a rownumber?

Any help would be appreciated with this; my searches on google have yielded unhelpful results :(


Solution

  • If you wish to apply paging in MS Acces use this

    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
    

    Where 15 is the StartPos + PageSize, and 5 is the PageSize.

    EDIT to comment:

    The error you are receiving, is because you are trying to reference a column name assign in the same level of the query, namely rownumber. If you were to change your query to:

    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
    

    It should not give you an error, but i dont think that this is the paging result you want.