2009-12-14 2 views
10

Ich greife auf eine Microsoft Access 2002-Datenbank (MDB) unter Verwendung von ASP.NET über die Klasse OdbcConnection zu, was sehr gut funktioniert, wenn auch sehr langsam.Wie implementiere ich die Paginierung in SQL für MS Access?

Meine Frage ist, wie für Abfragen auf diese Datenbank Paginierung in SQL zu implementieren, da ich weiß, dass ich die TOP Klausel umsetzen kann:

SELECT TOP 15 * 
FROM table 

aber ich bin nicht in der Lage, einen Weg zu finden, diese zu begrenzen, ein Offset wie mit SQL Server mit ROWNUMBER getan werden kann. Mein bester Versuch war:

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 

, die mit fehlschlägt: Source

Fehler: Microsoft Jet Database Engine

Fehlermeldung: kein Wert angegeben für einen oder mehrere erforderlichen Parameter.

Ich kann diesen Fehler nicht funktioniert, aber ich nehme an, es etwas mit der Unterabfrage zu tun hat, die eine rownumber bestimmt?

Irgendwelche Hilfe würde mit diesem geschätzt werden; Meine Suchen auf Google haben nicht hilfreich Ergebnisse gezeitigt :(

+0

Dieses Q hat 59 Ansichten (zu der Zeit) und ich sehe keine einzige Verbesserung. Ist das nur eine DBA-Sache? –

Antwort

10

Wenn Sie das Paging in MS Acces verwenden diese

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 

Wo 15 ist die StartPos + Pagesize und 5 ist die Pagesize anwenden möchten.

EDIT Kommentar:

Der Fehler, den Sie erhalten, ist, weil Sie erneut versuchen Geben Sie einen Spaltennamen in derselben Ebene der Abfrage ein, nämlich Zeilennummer. Wenn Sie Ihre Abfrage ändern waren:

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 

sollte es keinen Fehler geben Sie, aber ich nicht denke, dass dies das Paging gewünschte Ergebnis.

+0

Danke! Obwohl ich immer noch Probleme mit dem ODBC SQL Parser hatte (siehe meine Antwort). – Codesleuth

+0

Werfen Sie einen Blick auf die bearbeitete Antwort. –

+1

Natürlich, ja * Slaps Kopf * Könnte auch eine HAVING-Klausel verwendet haben, denke ich, aber ich bin nicht sicher mit JET - es ist wie der Versuch, mit SQL in Glasscherben beschichtet arbeiten. – Codesleuth

3

Siehe astander's answer für die ursprüngliche Antwort, aber hier ist meine letzte Implementierung, die (30, nachdem das Überspringen für die ersten 15 Einträge) einige ODBC-Parser Regeln berücksichtigt:

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 

Der Unterschied hier ist, dass ich die Notwendigkeit Paginierung funktioniert, wenn nach Kundenname sortiert, und ich brauche alle Spalten (naja, eigentlich nur eine Teilmenge, aber ich sortiere das in der äußersten Abfrage).

1

Ich benutze diese SQL-Code die Paginierung mit Access

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

Ich habe einen Artikel mit einigen Screenshots veröffentlicht on my blog

0

One zu implementieren einfache Möglichkeit, Limit oder Pagina zu verwenden Beim Arbeiten im Zugriff soll die ADODB-Bibliothek verwendet werden, die die Paginierung für viele DBs mit derselben Syntax unterstützt. http://phplens.com/lens/adodb/docs-adodb.htm#ex8 Es ist einfach zu ändern/Pager-Klasse überschreiben, um die erforderliche Anzahl von Zeilen im Array-Format dann zu holen.

0

Dies ist die einfache Methode der Paginierung mit OleDbDataAdapter und Datatable-Klassen. Ich verwende zur Vereinfachung einen anderen SQL-Befehl.

 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 

Hier ist die GetData-Funktion.

Die obigen Codes geben 10 Zeilen aus der Tabelle Kunde jedes Mal zurück, wenn die Schleife bis zum Ende der Datei läuft.