![]() |
Datenbank: TurboDB • Version: 6 • Zugriff über: SQL
Aus TurboDB Blob in Stream schreiben
Hallo Freunde der Nacht,
über folgendem Problem sitze ich schon einige Tage und komme nicht weiter. Ziel ist es, ein Blobfeld (meistens JPEG) aus der Datenbank auszulesen, in einen Stream zu schreiben und dann in einem TImage auszugeben. Der Code aus der Klasse (FBLOB1 = TMemoryStream, Stream0 = TStream)
Code:
Der Code im Programm (J = TJpegImage)
Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);
Stream0.Position := 0; FBLOB1.Create; FBLOB1.Write(Stream0, fmOpenRead); FBLOB1.CopyFrom(Stream0, Stream0.Size);
Code:
Das Problem besteht denke ich ganz am Anfang, bei der Übergabe des Blobs an den Stream.
J.LoadFromStream(T.BLOB1);
Image1.Picture.Assign(J); Hat wer einen guten Rat parat? |
AW: Aus TurboDB Blob in Stream schreiben
Hallo,
ein
Delphi-Quellcode:
FieldByName('BLOB1').SaveToStream()
gibt es nicht zufällig? ggf. schauen ob du das Feld auf ein TBlobField (oder wie auch immer das bei TubroDB heißt) casten musst... Grüße |
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
Casten brauch ich denke ich nichts. der Fehler tritt in folgender Zeile auf.
Code:
edit:
Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);
mittlerweile habe ich den code ein bisschen umgeändert, funktioniert aber immernoch nicht.
Code:
Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);
J.LoadFromStream(Stream0); Form3.Image1.Picture.Assign(J); |
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
Zitat:
schon mal die Dokumentation gelesen? z.B. das Kapitel über TTdbBlobProvider? oder das über das Demo "Images"? TurboDB ist bei mir schon verdammt lange her, daher kenne ich mich nicht mehr soo gut aus... Grüße |
AW: Aus TurboDB Blob in Stream schreiben
Wie heißt denn die Query (oder die Table), deren Feld BLOB1 heißt...
Irgendwie fehlt diese Information nicht nur mir, sondern wohl auch dem Compiler... Grüße Mikhal PS: Ich bin an dieser Stelle immer sehr faul, ich caste immer:
Delphi-Quellcode:
(Query.FindField('Blub') As TBlobField).SaveToStream(s)
|
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
Zitat:
|
AW: Aus TurboDB Blob in Stream schreiben
Das hier dürfte übrigens auch nicht so recht klappen:
Zitat:
Delphi-Quellcode:
heißen.
FBLOB1 := TMemoryStream.Create;
|
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
Code:
ist die Query.
SQL.Text := 'Select * from TEST1 where ID = :I';
prepare; ParamByName('I').AsInteger := FID; Zitat:
mit einer ttdbDatabase-TdbTable-TDataSource-TdbBlobproviderkette funktioniert es auch. Trotzdem würde ich gerne ohne die Komponenten und nur mit Code arbeiten. Der Fehler ist folgendert: Zugriffsverletzung bei Adresse XXXXXXXX in Modul 'xxxxxx.exe'. Lesen von Adresse XYZXYZXY Thx DeddyH für die Korrektur, nur soweit wird der Code gar nicht ausgeführt. |
AW: Aus TurboDB Blob in Stream schreiben
Liste der Anhänge anzeigen (Anzahl: 1)
Mit beiliegener Unit kannst Du beliebige Grafiken (PNG,JPG etc.) speicher und laden, es wird allerdings eine Info über den Typ im Blob mit abgelegt, gegf. anpassen.
|
AW: Aus TurboDB Blob in Stream schreiben
sorry schonmal für den doppelpost, aber der obere ist irrelevant geworden. das blobfeld ist nun im stream.
Code:
hat die Lösung gebracht, thx dafür.
(FindField('BLOB1') As TBlobField).SaveToStream(MS);
nächstes Problem
Code:
Ich denke das Problem ist, dass die TImage Komponente nicht weiß welcher Bildtyp da ankommt. Weiß einer dafür eine Lösung? Oder liegt das Problem woanders.
J := TJPEGImage.Create;
J.LoadFromStream(MS); Form3.Image1.Picture.Assign(J); Die Fehlermeldung ist eine Zugriffsverletzung bei Adresse ABCDEFGJ usw. |
AW: Aus TurboDB Blob in Stream schreiben
Wird es so besser?
Delphi-Quellcode:
Grüße
J := TJPEGImage.Create;
ms.seek(0,soFromBeginning); // oder ms.position :=0 J.LoadFromStream(MS); Form3.Image1.Picture.Assign(J); Klaus |
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
Ein
Code:
bringt auch keine Besserung.
(FindField('BLOB1') As TBlobField).SaveToStream(MS);
ms.Position := 0; // <<<< J := TJPEGImage.Create; J.LoadFromStream(MS); Form3.Image1.Picture.Assign(J); // Hier tritt der Zugriffsfehler auf Thx für die Mühen =) |
AW: Aus TurboDB Blob in Stream schreiben
.. sollte aber eigentich funktionieren.
Im Stream befindet sich ein jpg Image? Ist der Stream o.k. - sind darin Daten vorhanden? eventuell noch eine Fehlerbehandlung einbauen
Delphi-Quellcode:
Grüße
(FindField('BLOB1') As TBlobField).SaveToStream(MS);
ms.Position := 0; J := TJPEGImage.Create; try try J.LoadFromStream(MS); Form3.Image1.Picture.Assign(J); except on E:Exception do showMessage(E.Message); end; finally j.free; end; Klaus |
AW: Aus TurboDB Blob in Stream schreiben
Existiert das Formular bzw. das TImage auch zu diesem Zeitpunkt? Ich finde den hartkodierten Zugriff auf VCL-Controls in diesem Kontext etwas unglücklich, zumal da auch noch mit benannten Instanzen hantiert wird.
|
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
Zitat:
Code:
direkt rausspringt.
Form3.Image1.Picture.Assign(J);
Daten befinden sich im Stream. Ein ShowMessage(IntToStr(MS.Size)); gibt mir den Wert 777835 zurück. realistisch? Wie kann ich dem TImage verklickern, dass da ein JPEG ankommt, oder liegt da nicht der Hase im Pfeffer?+ edit:
Code:
speichert mir die File auf C. D.h. der Stream ist korreckt und das Bild ist im TJpegImage angekommen.
J.LoadFromStream(MS);
J.SaveToFile('C:\test.jpeg'); |
AW: Aus TurboDB Blob in Stream schreiben
Zitat:
ein verwertbare Fehlermeldung dabei herauskommen würde. Das TImage weiß das ein jpg hereinkommt, Du übergibst ja die jpg Instanz. Grüße Klaus |
AW: Aus TurboDB Blob in Stream schreiben
Habs, danke an alle.
Der Code in der Klasse.
Code:
Der Code vom Formular
FBLOB1 := TMemoryStream.Create;
(FindField('BLOB1') As TBlobField).SaveToStream(FBLOB1); FBLOB1.Position := 0;
Code:
Im Endeffekt lag es dadran, dass ich aus der Klasseunit heraus irgendwie nicht Image1 befüllen konnte. kA warum.
T := TTEST1_tdb.create;
T.ID := 8; T.Load; J := TJpegImage.Create; J.LoadFromStream(T.BLOB1); Image1.Picture.Assign(J); FreeAndNil(J); FreeAndNil(T); |
AW: Aus TurboDB Blob in Stream schreiben
Weil du nicht wahr haben willst, was andere dir hier schreiben.
Stichwort Casten: "Nö, ich muss nicht casten" - Lösung: Casten :roll: Stichwort Direkter Zugriff auf eine Komponente: "Nö, da ist alles da" - Lösung: Ohne direkten Zugriff :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz