Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Aus TurboDB Blob in Stream schreiben (https://www.delphipraxis.net/169843-aus-turbodb-blob-stream-schreiben.html)

machstuhl 15. Aug 2012 13:48

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:
  Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);
  Stream0.Position := 0;
  FBLOB1.Create;
  FBLOB1.Write(Stream0, fmOpenRead);
  FBLOB1.CopyFrom(Stream0, Stream0.Size);
Der Code im Programm (J = TJpegImage)
Code:
  J.LoadFromStream(T.BLOB1);
  Image1.Picture.Assign(J);
Das Problem besteht denke ich ganz am Anfang, bei der Übergabe des Blobs an den Stream.

Hat wer einen guten Rat parat?

Lemmy 15. Aug 2012 14:16

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

machstuhl 15. Aug 2012 14:21

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von Lemmy (Beitrag 1178374)
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

Zufällig nicht, das wäre ja viel zu einfach :D.
Casten brauch ich denke ich nichts.

der Fehler tritt in folgender Zeile auf.
Code:
Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);
edit:

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);

Lemmy 15. Aug 2012 15:10

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von machstuhl (Beitrag 1178376)
Casten brauch ich denke ich nichts.

Ok, wenn du denkst..

Zitat:

Zitat von machstuhl (Beitrag 1178376)
der Fehler tritt in folgender Zeile auf.
Code:
Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);

gut für dich, schlecht für uns... weil wir nicht wissen was für ein Fehler...

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

mikhal 15. Aug 2012 15:22

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)

Lemmy 15. Aug 2012 15:51

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von mikhal (Beitrag 1178381)
Wie heißt denn die Query (oder die Table), deren Feld BLOB1 heißt...

ich vermute stark, dass das ne "with...." Konstruktion ist. Äh nein, ich hoffe es...


Zitat:

Zitat von mikhal (Beitrag 1178381)
PS: Ich bin an dieser Stelle immer sehr faul, ich caste immer:
Delphi-Quellcode:
(Query.FindField('Blub') As TBlobField).SaveToStream(s)

er denkt ja, dass er nicht casten muss, also müssen wir halt den schweren Weg gehen.... ;-)

DeddyH 16. Aug 2012 07:05

AW: Aus TurboDB Blob in Stream schreiben
 
Das hier dürfte übrigens auch nicht so recht klappen:
Zitat:

Delphi-Quellcode:
FBLOB1.Create;

Vielmehr soll das wohl
Delphi-Quellcode:
FBLOB1 := TMemoryStream.Create;
heißen.

machstuhl 16. Aug 2012 09:36

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von mikhal (Beitrag 1178381)
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)

Code:
SQL.Text := 'Select * from TEST1 where ID = :I';
prepare;
ParamByName('I').AsInteger := FID;
ist die Query.

Zitat:

Zitat von Lemmy (Beitrag 1178380)
Zitat:

Zitat von machstuhl (Beitrag 1178376)
Casten brauch ich denke ich nichts.

Ok, wenn du denkst..

Zitat:

Zitat von machstuhl (Beitrag 1178376)
der Fehler tritt in folgender Zeile auf.
Code:
Stream0 := CreateBlobStream(FieldByName('BLOB1'), bmRead);

gut für dich, schlecht für uns... weil wir nicht wissen was für ein Fehler...

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

ja, beides.
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.

Bummi 16. Aug 2012 09:51

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.

machstuhl 16. Aug 2012 10:02

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:
(FindField('BLOB1') As TBlobField).SaveToStream(MS);
hat die Lösung gebracht, thx dafür.

nächstes Problem
Code:
J := TJPEGImage.Create;
J.LoadFromStream(MS);
Form3.Image1.Picture.Assign(J);
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.

Die Fehlermeldung ist eine Zugriffsverletzung bei Adresse ABCDEFGJ usw.

Klaus01 16. Aug 2012 10:11

AW: Aus TurboDB Blob in Stream schreiben
 
Wird es so besser?

Delphi-Quellcode:
J := TJPEGImage.Create;
ms.seek(0,soFromBeginning); // oder ms.position :=0
J.LoadFromStream(MS);
Form3.Image1.Picture.Assign(J);
Grüße
Klaus

machstuhl 16. Aug 2012 10:17

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von Klaus01 (Beitrag 1178448)
Wird es so besser?

Delphi-Quellcode:
J := TJPEGImage.Create;
ms.seek(0,soFromBeginning); // oder ms.position :=0
J.LoadFromStream(MS);
Form3.Image1.Picture.Assign(J);
Grüße
Klaus

Nein.

Ein
Code:
(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
bringt auch keine Besserung.

Thx für die Mühen =)

Klaus01 16. Aug 2012 10:22

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:
(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;
Grüße
Klaus

DeddyH 16. Aug 2012 10:23

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.

machstuhl 16. Aug 2012 10:35

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1178454)
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.

Ja, es existiert beides.

Zitat:

Zitat von Klaus01 (Beitrag 1178453)
.. 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:
(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;
Grüße
Klaus

done, bringt leider nicht viel, da er bei
Code:
Form3.Image1.Picture.Assign(J);
direkt rausspringt.

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:
J.LoadFromStream(MS);
J.SaveToFile('C:\test.jpeg');
speichert mir die File auf C. D.h. der Stream ist korreckt und das Bild ist im TJpegImage angekommen.

Klaus01 16. Aug 2012 10:38

AW: Aus TurboDB Blob in Stream schreiben
 
Zitat:

Zitat von machstuhl (Beitrag 1178456)
done, bringt leider nicht viel, da er bei
Code:
Form3.Image1.Picture.Assign(J);
direkt rausspringt.

Wie kann ich dem TImage verklickern, dass da ein JPEG ankommt, oder liegt da nicht der Hase im Pfeffer?

Das die Fehlerbenhandlung den Fehler nicht behebt war mit klar - nur dachte ich, dass eventuell
ein verwertbare Fehlermeldung dabei herauskommen würde.

Das TImage weiß das ein jpg hereinkommt, Du übergibst ja die jpg Instanz.

Grüße
Klaus

machstuhl 16. Aug 2012 11:28

AW: Aus TurboDB Blob in Stream schreiben
 
Habs, danke an alle.

Der Code in der Klasse.

Code:
FBLOB1 := TMemoryStream.Create;
(FindField('BLOB1') As TBlobField).SaveToStream(FBLOB1);
FBLOB1.Position := 0;
Der Code vom Formular
Code:
T := TTEST1_tdb.create;
T.ID := 8;
T.Load;
J := TJpegImage.Create;
J.LoadFromStream(T.BLOB1);
Image1.Picture.Assign(J);
FreeAndNil(J);
FreeAndNil(T);
Im Endeffekt lag es dadran, dass ich aus der Klasseunit heraus irgendwie nicht Image1 befüllen konnte. kA warum.

Sir Rufo 17. Aug 2012 03:41

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 20:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz