Mathias: Probleme mit ForwardOnly-Cursor

Hi,

habe folgendes Proble: Wenn ich eine DB mittels SQL-String Abfrage und dabei einen ForwardOnly-Cursor verwende, dann kann ich die einzelnen Felder des Recordsets nur einmal anzeigen

rsProduct.Open "SELECT * FROM QueryProductLanguage WHERE LanguageID = " & LanguageID & " AND ProductID = " & ProductID, conn, 0, 1

[Aus dieser Abfrage kommt immer ganau ein Datensatz raus.]

<%=rsProduct("ProductDescription")%> [funktioniert perfekt]
<%=rsProduct("ProductDescription")%> [gleiche Zeile darunter nochmal erzeugt keinen Fehler, spuckt aber nur Null-Wert aus]

Wenn ich einen Static-Cursor nehme (..., conn, 3, 1) dann ist alles ok - warum?

Zu Info: NT4-Server, Access-DB, ODBC-Freigabe

Vielleicht weiß ja jemand rat

Mathias

  1. Noch was festgestellt: das Problem tritt scheinbar nur bei Memo-Feldern auf.

    Mathias

  2. Hallo Mathias,

    Vielleicht weiß ja jemand rat

    Zur Zeit nicht unmittelbar. Zumindest konnte ich das bis jetzt noch nicht reproduzieren.

    <%=rsProduct("ProductDescription")%> [funktioniert perfekt]
    <%=rsProduct("ProductDescription")%> [gleiche Zeile darunter nochmal erzeugt keinen Fehler, spuckt aber nur Null-Wert aus]

    Ich halte diese Vorgehensweise jedoch grundsätzlich für falsch, da mit solchen Konstrukten der Server unnötig belastet wird. Besser ist ist das Recordset auszulesen

    myVar = rsProduct("ProductDescription") usw.

    und anschließend alle Objekte zu schließen.

    Vorteil ist, daß Resourcen geschont werden und Du die Variable beliebig oft einsetzten kannst.

    Viele Grüße aus Köln
    Markus

    BTW:
    Trotzdem halte ich weiterhin die Fragestellung für interessant, ob Memos bei ForwardOnly tatsächlich nur einmal gelesen werden können.Werde mich dazu noch mal melden.

    1. Hallo Markus,
      vielen Dank auch nochmal für diesen Tipp

      Ich halte diese Vorgehensweise jedoch grundsätzlich für falsch, da mit solchen Konstrukten der Server unnötig belastet wird. Besser ist ist das Recordset auszulesen

      Leider bietet M$ in dieser Richtung wenig Hilfestellung, provoziert oft sogar eine höchst uneffektive Programmierung.
      Da werden Connections in Sessions gespeichert (z. B., wenn du direkt aus Access eine ASP-Datei "zaubern" lässt) - und dann wundert man sich, dass es ständig Probleme mit dem Zugriff gibt :-(

      Ich probiere dein Rezept mal aus.
      Ist die CacheSize des Recordset-Objekts eigentlich dafür wichtig?

      Mathias

      Greetinx
      Berlin --> Cologne

      1. Noch was:
        Kann man nicht auch das komplette Recordset-Obejkt in eine neue Variable kopieren?

        Set rs = Server.CreateObject("ADODB.Recordset")
        Set rsProduct = Server.CreateObject("ADODB.Recordset")

        rs.Open "SELECT * FROM QueryProductLanguage WHERE LanguageID = " & LanguageID & " AND ProductID = " & ProductID, conn, 0, 1
        Set rsProduct = rs
        rs.Close

        If rs.EOF Then ...

        Das funktioniert aber leider nicht. Bei der EOF-Abfrage gibt's 'ne Fehlermeldung.

        Mache ich was falsch?

        1. Hallo Mathias,

          Set rsProduct = rs
          rs.Close

          If rs.EOF Then ...

          Das funktioniert aber leider nicht. Bei der EOF-Abfrage gibt's 'ne Fehlermeldung.

          Mache ich was falsch?

          Ehrlich gesagt, ja.

          Du schließt das Objekt und willst danach auf das Objekt zugreifen. Das kann nicht funktionieren.

          Nachdem Du das Recordset geöffnet und mit EOF überprüft hast, solltest Du die einzelnen Datenfelder auslesen

          myVar(0) = rs("1.Datenfeld")
          myVar(1) = rs("2.Datenfeld") usw.

          danach die Verbindung schließen und auf Nothing setzen. Dadurch sind wiederum alle Resourcen des Servers freigegeben und können von anderen Quellen verwendet werden.

          Viele Grüße aus Köln
          Markus

          1. Kann ich nicht irgendwie 'ne Kopie von dem Objekt machen? (News-Schlüsselwort?)

            Mathias

            1. Hallo Mathias,

              Kann ich nicht irgendwie 'ne Kopie von dem Objekt machen?

              Warum?
              Pack alles in Variablen, schreib diese wenn nötig in das Application Objekt - und Du kannst immer und überall darauf zugreifen.

              Oder erzähl mal, was Du wirklich vor hast.

              Viele Grüße
              Markus

              1. Hallo,

                Pack alles in Variablen, schreib diese wenn nötig in das Application Objekt - und Du kannst immer und überall darauf zugreifen.

                ich habe maher als 100 Datenfelder und habe wenig Lust, deinen Befehl 100mal zu kopieren und überall die Datenfeldnamen einzutragen.

                Gibt's nicht 'ne Variante für Faule?

                Ich finde es bai Javacsript so toll, da kannst du sagen
                var meinDIV = document.getElementById('...')
                und da hast dann bei deiner neuen Variable eine direkte Referenz auf das Objekt, kannst alle Eigenschaften abfragen und alle Methoden nutzen.
                Sowas möchte ich auch mit dem rs-Obj machen.

                m.

                1. Hallo Mathias,

                  ich habe maher als 100 Datenfelder und habe wenig Lust, deinen Befehl 100mal zu kopieren und überall die Datenfeldnamen einzutragen.

                  Gibt's nicht 'ne Variante für Faule?

                  Klar, die gibt es.

                  <% for each field in rs.fields
                     Response.Write(field.name & ": " &  field.value & "<br><br>")
                     next%>

                  Viele Grüße aus Köln
                  Markus

      2. Hallo Mathias,

        Ist die CacheSize des Recordset-Objekts eigentlich dafür wichtig?

        Nein.

        Mit CacheSize wird lediglich die Größe des Puffers für die Datensätze bestimmt, die der Server lokal als Speicherplatz reserviert/freihält.

        Standardmäßig wird genau ein Datensatz gepuffert, was i.d.R auch vollkommen ausreicht, da ein höherer CacheSize mehr Serverresourcen für jeden Besucher bindet, aber nur geringfügige Geschwindigkeitsvorteile bietet.

        Viele Grüße aus Köln
        Markus

        Berlin --> Cologne

        hui --> weit weg: Auch noch so warm?