Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr.
Seite 1 von 2  1 2      

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