Entwickler-Ecke

Datenbanken - Probleme bei Auslesen von Jpeg aus Blob-field


DataCool - Mo 25.11.02 15:13
Titel: Probleme bei Auslesen von Jpeg aus Blob-field
Hi Leute,

sonst habe ich immer übereine BDE-Connection ein Jpeg mit folgendem Code aus einem Blob-Field ausgelesen (Auszug aus einer Funktion):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
          TmpJPeg := TJPEGImage.Create;
          blob := TBlobStream.Create(Query1.FieldByName(FieldName) as TBlobField, bmRead);
          try
            try
              TmpJPeg.LoadFromStream(Blob);
              result := TmpJPeg;
            except
              result := nil;
              raise;
            end;
          finally
            Blob.free;
          end;


unter Interbase mit direkter Verbindung ohne Bde bekommich immer den Fehler:
Zitat:
"Ungültige Typenumwandlung"

Was kann ich tun ?

(26.11. 09:25 Tino) Code-Tags hinzugefügt.


Udontknow - Mo 25.11.02 16:59

Hi!

Du benutzt also nun was anderes als die BDE, ja? Also DBX oder andere Komponenten. Hast du denn wirklich alle Komponenten ausgetauscht?
Ist Query1 garantiert nicht mehr das TQuery-Objekt?

Cu,
Udontknow


DataCool - Mo 25.11.02 17:24

Ja, ich habe definitiv alle Komponenten ausgetauscht !
Ich benutze nämlich für alle Datenbank-Anwendungen eine generelle Datenbank-Klasse, die Intern jeweils die richtigen Datenbank-Object verwendet !


Udontknow - Mo 25.11.02 17:32

Hmmm, frage ich mal anders: Von welchem Typ ist Query1?

Cu,
Udontknow


DataCool - Mo 25.11.02 17:34

Von Typ TIBQuery


Udontknow - Mo 25.11.02 17:50

Aus der Delphi-Hilfe:
Zitat:

TBlobStream

Beschreibung

Mit TBlobStream können die Werte eines BLOB-Feldes in einer BDE-aktivierten Datenmenge verfügbar gemacht...


Du hast keine BDE-Komponenten, also darfst du auch nicht TBlobStream benutzen. Stattdessen schaue mal bei TIBBlobStream nach.

Cu, :D
Udontknow


DataCool - Di 26.11.02 09:51

Mit IBBlobStream hab ich es auch schon versucht, aber ich bekomme es damit nicht hin :?: :!: :cry:


LCS - Di 26.11.02 12:01

Hi
die Variante funktioniert sowohl mit BDE als auch mit IBX:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
   if  not BildFeld.IsNull then begin
       Daten  := TMemoryStream.Create;
       Bild  := TJpegImage.Create;
       BildFeld.SaveToStream(Daten);
       Daten.Position := 0;
       Bild.LoadFromStream(Daten);
       Daten.Free;
       ....
   end;


Gruss Lothar


DataCool - Di 26.11.02 12:19

Von welchem Typ ist Deine Var Bildfeld ?

ich bekomme nämlich immer bei :
BildFeld.SaveToStream(Daten);
eine Schutzverletzung :cry:


LCS - Di 26.11.02 13:04

Hi
BildFeld ist vom Typ TBlobField. Die Bilddaten wurden vorher auf die gleiche Art und Weise in der Datenbank abgelegt.

Quelltext
1:
2:
3:
4:
5:
       img.Picture.LoadFromFile(dlg.FileName);
       BildDat := TMemoryStream.Create;
       img.Picture.Graphic.SaveToStream(BildDat);
       bildDat.Position := 0;
       BildFeld.LoadFromStream(BildDat);


Gruss Lothar


Sephiroth - Di 26.11.02 14:40

Also ich benutzte zwar IBO statt IBX aber denke das macht keinen Unterschied. Ich hab ebenfalls eine Routine um ein Bild in eine Datei abzuspeichern (kann man ja abändern für deine Zwecke)


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure ReadImage(strPfad : String);
var stmImage: TMemoryStream;
    BlobField: TIB_Column;
begin
  stmImage   := TMemoryStream.Create;
  try
    with dmHaupt, dmHaupt.qryIBQuelle do begin
      BlobField:=FieldByName('BILD');
      BlobField.AssignTo(stmImage);
      if not BlobField.IsNull then stmImage.SaveToFile(strPfad);
    end;
  finally
    stmImage.Free;
  end;
end;


Hoffe das kann helfen.