Mannix: Probleme mit BOF

Hallo zusammen,

ich habe folgendes Problem: ich lese Daten aus einer Datenbank und speichere sie in einem Recordset (die DB-Verbindung Con ist dabei schon früher erstellt). Dann will ich die Daten mittels einer While-Schleife ausgeben. Das klappt soweit, bis auf eine Sache: einen Teil der Daten will ich nur für den ersten Datensatz im Recordset ausgeben, für die restlichen Datensätze nicht. Das habe ich mit einer If-Anweisung gemacht, die überprüft ob der Recordset-Zeiger auf den ersten Datensatz zeigt (RSet.BOF). Dieser müsste sich ja zu Beginn der Ausgabe auf dem ersten Datensatz befinden, aber wenn ich mir die Seite anschaue, wird immer der Zweig der If-Anweisung durchlaufen, in den das Programm gehen soll, wenn der Zeiger nicht auf den ersten Datensatz zeigt. Aber warum nur? Kann mir jemand helfen?

Code-Ausschnitt:

Set RSet = Server.CreateObject( "ADODB.Recordset")
RSet.ActiveConnection = Con
RSet.Open "SELECT * FROM ... WHERE ...

While Not RSet.EOF

If Not RSet.BOF Then
     'irgendeine Ausgabe, wenn Zeiger nicht auf 1. Datensatz zeigt
  Else
     'Datenausgabe, wenn Recordset-Zeiger auf 1. Datensatz zeigt
  End If

...

RSet.MoveNext
WEnd
RSet.Close
Con.Close

Viele Grüße und danke im Voraus

Mannix

  1. Hallo!

    Dieser müsste sich ja zu Beginn der Ausgabe auf dem ersten Datensatz befinden, aber wenn ich mir die Seite anschaue, wird immer der Zweig der If-Anweisung durchlaufen, in den das Programm gehen soll, wenn der Zeiger nicht auf den ersten Datensatz zeigt.

    Und wenn Du die AbsolutePosition-Eigenschaft des Recordset verwendest?

    Beste Grüße
    Viennamade

    1. Und wenn Du die AbsolutePosition-Eigenschaft des Recordset verwendest?

      Ich hab mal probiert, die AbsolutePosition-Eigenschaft nach der If-Anweisung auszugeben, da kommt (in jedem Schleifendurchlauf) -1. Warum weiß ich auch nicht, hängt aber bestimmt mit meinem Problem zusammen.

      1. Hallo!

        Und wenn Du die AbsolutePosition-Eigenschaft des Recordset verwendest?

        Ich hab mal probiert, die AbsolutePosition-Eigenschaft nach der If-Anweisung auszugeben, da kommt (in jedem Schleifendurchlauf) -1. Warum weiß ich auch nicht, hängt aber bestimmt mit meinem Problem zusammen.

        Nein, hängt nicht damit zusammen. BOF bedeutet "_vor_ dem ersten Datensatz" und EOF "_nach_ ...". Also kannst Du BOF dafür nicht verwenden.
        Das mit der AbsolutePosition ist aber kurios, auf welche DB greifst Du denn zu? Auf ganz altes DAO?

        Beste Grüße
        Viennamade

        1. Nein, hängt nicht damit zusammen. BOF bedeutet "_vor_ dem ersten Datensatz" und EOF "_nach_ ...". Also kannst Du BOF dafür nicht verwenden.

          Wie kann ich dann abfragen, ob in der Schleife gerade der erste Datensatz an der Reihe ist?

          Das mit der AbsolutePosition ist aber kurios, auf welche DB greifst Du denn zu? Auf ganz altes DAO?

          Ist ne Access 2002-Tabelle.

          1. Hallo!

            Ist ne Access 2002-Tabelle.

            Wenn Du _vor_ dem Öffnen der Verbindung client-seitigen Cursor einstellst?

            conn.CursorLocation=aduseclient

            Beste Grüße
            Viennamade

            1. Ich hab eine Lösung gefunden. Da ja dummerweise die RecordCount-Eigenschaft nicht funktioniert hat, hab ich selber die Datensätze gezählt (while-Schleife), dann mit ner for-Schleife (i = 1 To anzahlDS) das Recordset durchlaufen (immer am Ende jedes Durchlaufs RSet.MoveNext) und innerhalb dieser Schleife eine if-Abfrage, ob i gleich 1 ist (anstatt der BOF-Abfrage).

              Danke für Deine Tipps

        2. Wenn ich RecordCount ausgeben, kommt ebenfalls nur -1.

          1. Hi,

            der Grund dafür ist, dass du die Abfrage als Firehose Cursor

            • ForwardOnly (+ReadOnly)
              ausführst. Der Cursor deines Recordsets weiß daher nicht, an welcher
              AbsolutePosition er sich momentan befindet, oder wieviele Datensätze
              er insgesamt lesen _wird_. MoveFirst und Konsorten funktionieren
              auch nicht.

            Wenn du eine Navigation im Recordset benötigst, solltest du einen
            anderen Cursor verwenden: z.b. adOpenStatic, was einen Snapshot von
            den Ergebnissen erstellt. Verbraucht mehr Ressourcen, bietet dafür
            aber mehr Möglichkeiten.

            ein
            SET myRecordset = ADODBconnection.execute(sqlStatement) führt immer
            zu einem Firehose Cursor - das als zusätzliche Info

            HTH, ciao, Frank