Probleme mit ForwardOnly-Cursor
Mathias
- datenbank
0 Mathias0 Markus Mühlich0 Mathias0 Mathias0 Markus Mühlich
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
Noch was festgestellt: das Problem tritt scheinbar nur bei Memo-Feldern auf.
Mathias
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.
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
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?
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
Kann ich nicht irgendwie 'ne Kopie von dem Objekt machen? (News-Schlüsselwort?)
Mathias
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
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.
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
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?