Kategorien:
Suchbegriffe:
Suchfelder:
Suche starten
Neue Beiträge / Top 7
Alle Artikel / Liste
Bücher zu ASP/ASP.Net
Startseite / Hilfe
Fragen zu ASP/ASP.NET
Datenschutzrichtlinen
Impressum / Kontakt
Das ASP.Net Codebook. Die unentbehrliche Referenz für alle ASP.Net-Entwickler [Autoren: Stefan Falz, Karsten Samaschke]
Active Server Pages-FAQ
Active Server Pages - FAQ (v. 1.50) © 2000 - 2020 by Stefan Falz Webconsulting

GetFile! Dynamischer Dateiupload im Browser

Datenbankzugriffe Zurück Druckversion Stefan Falz 10.01.2001
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.

Sehr gut
1 2 3 4 5 6
Ungenügend
Zurück | Bisherige Aufrufe: 18331 | Bisherige Bewertungen: 53 | Durchschnitt: 1,32
Stefan Falz Webconsulting