PDA

View Full Version : Blob-Handling



infomio
28-03-03, 06:30
Ich hab ein Blobfeld via SQL-Befehl in einer Tabelle. Prima! Nur wenn ich es mit Daten füllen will, sei es mit einem '' oder 'blabla', dann kommt der Fehler:

Indexfehler: Eingabevariable mit...nicht verträglich bzw. Daten abgeschnitten ???

Hilfeeeee!

Fuerchau
28-03-03, 09:18
BLOB-Felder können nur über Pointer adressiert werden, d.h., SQL liefert beim Select nur einen Pointer auf den Bereich:

d myBlobPtr S *
d MyBlob s 1000 based(myBlobPtr)
d MyBlob2 s 1000

/exec sql
+ select myblob into :myblobptr ....
/end-exec

Das gleiche gilt auch bei Update/Insert, in diesem Fall ist die Adresse selbst zur Verfügung zu stellen:

eval myblobptr = %Addr(myBlob2)
/exec sql
+ update mytable set myblob=:myblobptr ...
/end-exec

Der Unterschied ist hier, dass der BLOB-Bereich nicht von SQL angelegt wird.
Natürlich kann die gelesene Variable auch für Update/Insert verwendet werden.

Es ist darauf zu achten, dass die Variable MyBlob nicht größer definiert sein darf, als in der Tabelle definiert, da es sonst zu Speicherschutzfehlern kommt.

infomio
28-03-03, 11:42
erstmal dankeschön Herr Fuerchau. Jetzt verstehe ich, warum ich nix sehe, wenn ich ein Blobfeld öffne und einiges mehr. Allerdings greife ich über CA-ODBC auf die Datenbank zu, und programmiere in Delphi. Und da weiss ich nicht wie ich, wenn ich einen neuen Satz anlege, den Pointer für das Blobfeld rauskriege, welches noch gar nicht existiert!!!

Fuerchau
28-03-03, 16:46
Das ist etwas anderes.
Ich weiß zwar nicht, wie die Delphi-Unterstützung aussieht, aber BLOB's werden per ODBC als sog. CHUNK'S geladen, d.h., dass der Feldinhalt nicht sofort verfügbar ist.
Für das Feld-Objekt gibt es die Methoden GetChunk() bzw. PutChank() mit der die Daten Blockweise gelesen bzw. geschrieben werden.
GetChunk solange, bis keine Daten mehr da sind (Fehlerereignis), Putchunk bis alle daten geschrieben sind.

BLOB-Felder werden erst beim Zugriff auf den Inhalt tatsächlich von der AS/400 geladen.