Entwickler-Ecke
Datenbanken - ein BLOB Feld entkomprimieren
borrou - Mo 13.01.03 17:27
Titel: ein BLOB Feld entkomprimieren
Hallo an allen:)
Wer kann mir einen Tip geben warum das Lesen des BLOB Feldes 'Bild' mit eine Zugriffsverletzung endet und zwar beim Ausführen der Methode
getBLOBData an der Stelle, wo InData erzeugt wird.
Hier die Code:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| function TDBWerkzeug.getBLOBData(ACol:TIB_Column):TStream; var OutData:TStream; InData:TBlobStream; ZStream:TCustomZLibStream; ZLibBuffer, ZLibBufferSize:LongInt; Count:Integer; begin Result:=nil; InData:=TBlobStream.Create(TBlobField(ACol),bmRead);// hier die Zugriffsverletzung //wurden Daten aus dem Blob-Feld gelesen? if InData.Size=0 then begin InData.Free; // ShowMessage(cErrNullData); Exit; end; try // Exportdatei anlegen OutData:=TMemoryStream.Create; try //komprimierte Blob-Daten entkomprimieren ZStream:=TDecompressionStream.Create(InData);; try //in 4096-Byte Häppchen in die Datei schreiben While true do begin Count:=ZStream.Read(ZLibBuffer,ZLibBufferSize); if Count<>0 then OutData.WriteBuffer(ZLibBuffer,Count) else Break; end; finally // end; finally //Free--> Buffer wird geleert ZStream.Free; // Ergebnis zuweisen Result:=OutData; end; finally // end; end; |
squery ist eine IB_Componente, die zur Laufzeit erzeugt wird und mittels SQL.Text und Open die Ergebnismenge hält.
Grafik ist ein TPicture Objekt das der Grafik aus der Datenbank speichern
soll.
Quelltext
1: 2: 3: 4:
| if squery.FieldByName('BILD').BlobSize>0 then Grafik:=TPicture(getBLOBData(squery.FieldByName('BILD'))) else Grafik:=nil; |
Wer kann mir weiterhelfen?
Danke!
LCS - Di 14.01.03 09:21
Hi
leider kenn ich weder die Komponenten die du verwendest, noch weis ich was TIB_Column ist. Was ich allerdings weiss ist, dass ich bei Zugriff auf Blobs auch schon in die Schreibtischplatte gebissen habe :mrgreen:
Versuch doch mal anstelle der Zeile mit dem BlobStream folgendes:
Quelltext
1: 2:
| MemoryStream := TMemoryStream.Create; TBlobField(ACol).SaveToStream(MemoryStream); |
Dürfte allerdings nur dann klappen, wenn TIB_Column irgendwie von TField abgeleitet wurde.
Gruss Lothar
borrou - Di 14.01.03 10:00
Titel: BLOB Felder
Hallo Lothar,
danke für dein Vorschlag.
TIB_Column ist eine IBObject Komponente, die beide VCL TField und
TParam kombiniert und zur Ein- und Ausgabe der Spalteninhalt einer
Tabelle dient.
So wie es aussieht habe ich ein Kompatibilitätsproblem an der Stelle
Quelltext
1:
| InData:=TBlobStream.Create(TBlobField(ACol),bmRead); |
( der Cast schlägt fehl)
da TIB_Column direkt vom TObject abgeleitet ist, ein TBlobField aber
erwartet wird ( hat TComponent als Oberklasse).
Grüsse,
Boris
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!