Kategorie: Datenbankzugriffe
Frage: Warum erhalte ich beim Auslesen eines Memofelds einen leeren String?
Um grosse Textmengen (> 255 Zeichen) in einer Access-Datenbank zu speichern, gibt es
den Datenfeldtyp "Memo". Spalten diesen Types können grosse Textmengen aufnehmen.
Da diese Spalten von der Datenbank aber als gesonderter Datentyp behandelt werden,
unterliegen sie einigen Restriktionen.

Der wichtigste Unterschied ist: Im Gegensatz zu Textfeldern, Numerischen Feldern, ... die
man mit z.B. folgendem Code beliebig oft auslesen kann, können Memofelder nur einmal
ausgelesen werden.

[textfeld.asp]
<%
...
Response.Write "------------" & <br>
Response.Write objRS.Fields("<textfeld>") & "<br>"
Response.Write objRS.Fields("<textfeld>") & "<br>"
Response.Write objRS.Fields("<textfeld>") & "<br>"
Response.Write "------------" & <br>
...
%>

Enthält die Spalte <textfeld> des aktuellen Datensatzes den Wert "Hallo Welt" ergibt dies
die folgende Ausgabe:
------------
Hallo Welt
Hallo Welt
Hallo Welt
------------



[memofeld.asp]
<%
...
Response.Write "------------" & <br>
Response.Write objRS.Fields("<memofeld>") & "<br>"
Response.Write objRS.Fields("<memofeld>") & "<br>"
Response.Write objRS.Fields("<memofeld>") & "<br>"
Response.Write "------------" & <br>
...
%>

Enthält die Spalte <memofeld> des aktuellen Datensatzes den Wert "Hallo Welt" ergibt dies
die folgende Ausgabe:
------------
Hallo Welt


------------

Die beiden letzten Ausgaben des Memofeld geben einen leeren String zurück. Dies beruht
auf der Tatsache, dass Memofelder von der Datenbank nicht direkt als String zurückgegeben
werden, sondern durch die Methode GetChunk ausgelesen werden. Diese Methode liest die
Daten aus und gibt sie auch entsprechend zurück. Der Unterschied ist aber, dass der Zeiger
auf der aktuellen Position des Felds stehen bleibt, also am Ende des Felds.
Ein erneuter Zugriff auf dieses Feld liest also lediglich die Daten von der aktuellen Position
bis zum Ende des Feldinhalts. Da der Zeiger aber schon am Ende des Feldinhalts steht, wird
ein leerer String zurückgegeben.



Um dieses Problem zu umgehen, kann der Feldinhalt in eine Variable geschrieben werden (was
bei mehrfachen Zugriffen auf Datenbankfelder sowieso empfehlenswert ist).

[memofeld2.asp]
<%
...
<variable> =  objRS.Fields("<memofeld>")
Response.Write "------------" & <br>
Response.Write <variable> & "<br>"
Response.Write <variable> & "<br>"
Response.Write <variable> & "<br>"
Response.Write "------------" & <br>
...
%>

Enthält die Spalte <memofeld> des aktuellen Datensatzes den Wert "Hallo Welt" ergibt dies
die folgende Ausgabe:
------------
Hallo Welt
Hallo Welt
Hallo Welt
------------

Hinweis: Diese Variante ist auch bei anderen Feldtypen (Text, Zahl, ...) zu empfehlen, wenn
diese mehr als einmal benutzt werden sollen. Bei Textfeldern wird evtl. zuerst geprüft, ob dieses
einen gewissen Wert enthält und dann erfolgt erst die Ausgabe des Felds. Zahlenfelder werden
oft für Berechungen benötigt und werden zum Teil öfters benötigt. Dann sollte man die Feldinhalte
in Variablen speichern und mit diesen Variablen arbeiten. Damit wird die Performance spürbar
gesteigert, da jeweils nur 1 Zugriff auf die Datenbankinhalte erfolgt.

Copyright 2000 - 2024 by Stefan Falz Webconsulting