Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Dynamisches Nachladen von Datensätzen mit ADO/ASP

Empfohlene Antworten

Veröffentlicht

Ich habe folgendes Problem:

Mein in ASP programmiertes Gästebuch greift per ADO auf eine Datenbank mit mehr als 4000 Gästebucheinträgen zu. Im Gästebuch kann man Seitenweise vor- und zurückblättern. Jede Seite enthält 20 Gästebucheinträge.

Die SELECT-Anweisung liest alle Datensätze aus der Datenbank in ein RecordSet. Problem dabei: Für jeden Abrufer des Gästebuchs werden so alle Datensätze in den Arbeitsspeicher des IIS geladen, was gut 2 MB sind. Da ich viele Abrufe auf dem Gästebuch habe, ist das ein Problem.

Mit RecordSet.MaxRecords habe ich jetzt übergangsweise die Satz der Datensätze begrenzt.

Frage:

Ist es möglich (wie?) ADO so zu verwenden, dass immer z.B. 100 Datensätzen aus der Datenbank gelesen werden. Wird im RecordSet dann auf den 101 Datensatze gesprungen, werden automatisch die nächsten 100 geladen usw. Das ganze sollte natürlich vorwärts und rückwärts funktionieren. Sowas muss es doch geben!?

Moin,

das klingt nach MS-SQL-Server oder irre ich mich?

Dann kannst du eine laufende Zeilennummer in der Ausgabe erreichen und entsprechend auswerten, wenn du so etwas machst:

select *, (Select Count (*) FROM Tabelle T2 WHERE T2.id < T1.id)+1 as rownum

from Tabelle T1;

Wobei id bei mir ein Autowert ist. Wenn du nun also seitenweise puffern willst (z.B. 20 pro Seite) und du blätterst zu Seite 5 wätre das (Achtung, uingetestet)

select *, (Select Count (*) FROM Tabelle T2 WHERE T2.id < T1.id)+1 as rownum

from Tabelle T1

where (Select Count (*) FROM Tabelle T2 WHERE T2.id < T1.id)+1 between 101 and 120;

hth

Reinhold

Hallo Reinhold,

nein, es ist kein SQL-Server, sondern ein spezieller Datenbanktreiber der Firma Merant. Dieser unterstützt das Feld rowid, so dass man das so wie von Dir vorgeschlagen machen könnte.

Aber, ich dachte eigentlich, dass wenn ADO so viele gute Dinge kann, so etwas von ADO doch dann auch selbst erledigt werden könnte. So muss ich ja auf jeder Seite des Gästebuches einen neuen SELECT-Befehl ausführen. Da muss es doch eine bessere Lösung geben.

Anderes fiktives Beispiel:

Ich hätte z.B eine Datenbank mit 10 Mio. Datensätzen und will diese als CSV-Datei ausgeben, mache SELECT * usw. Dann läd ADO die ganze Datenbank in ein RecordSet. Wenn ich das verhindern will, z.B. weil der PC nicht genügend Arbeitsspeicher hat, soll ich in der Tat die Datenbank mit einzelnen SELECT-Befehlens solange Schritt für Schritt einlesen und ausgeben, bis alle Datensätze durch sind?

Aber, ich dachte eigentlich, dass wenn ADO so viele gute Dinge kann, so etwas von ADO doch dann auch selbst erledigt werden könnte. So muss ich ja auf jeder Seite des Gästebuches einen neuen SELECT-Befehl ausführen. Da muss es doch eine bessere Lösung geben.

Dein Gästebuchskript besteht ja wohl hoffentlich aus EINER EINZIGEN ASP-Datei, oder? Dann kannst du den Anfangs- und Endwert für die between-Angaben nämlich anhand der Seitenzahl errechnen und so dein SQL dynamisch zusammenbasteln.

Wenn nicht hast du wohl einen Denfehler in deiner Logik ...

Reinhold

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.