Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Frage zu Firebird Blob und Image (https://www.delphipraxis.net/116502-frage-zu-firebird-blob-und-image.html)

Grolle 30. Jun 2008 21:12

Datenbank: Firebird • Version: 2.1 • Zugriff über: IBDac

Frage zu Firebird Blob und Image
 
Hallo,

ich möchte gerne ein Image in Firebird als Blob einfügen. Die Frage ist nur wie?
Delphi-Quellcode:
ContactsQuery.ParamByName('P33').AsBlob := main.Image3.????
Muss ich x.AsBlob verwenden, oder x.AsIbBlob? Was mache ich, wenn ich das Feld (Blob := '')
zurücksetzen möchte?

Viele Grüße ...

marabu 30. Jun 2008 21:27

Re: Frage zu Firebird Blob und Image
 
Hallo Stefan,

hier wurde das Thema auch schon behandelt: klick

Grüße vom marabu

Grolle 30. Jun 2008 21:31

Re: Frage zu Firebird Blob und Image
 
Hi,

danke für den Link. Hatte dann wohl das falsche Stichwort für die Suche.

Viele Grüße...

Grolle 30. Jun 2008 22:11

Re: Frage zu Firebird Blob und Image
 
Hi,

muss ich da noch etwas beachten? Folgender Code wirft eine Exception:
Delphi-Quellcode:
  if main.Image3 <> nil then
  begin
    s := TMemoryStream.Create;
    main.Image3.Picture.Graphic.SaveToStream(s);
    ContactsQuery.ParamByName('P33').LoadFromStream(s, TBlobType(0));
  end;
  ContactsQuery.ExecSQL;
Viele Grüße ...

// Edit: Gespeichert wird ein JPEG. Muss ich das erst umwandeln?

marabu 1. Jul 2008 07:29

Re: Frage zu Firebird Blob und Image
 
Moin, da fallen mir zwei Dinge auf:

Die Position im Stream muss auf 0 zurück gesetzt werden.
Eventuell musst du dich vergewissern, dass Graphic.SaveToStream() auch wirklich im JPEG-Format schreibt.

Delphi-Quellcode:
type
  TDemoForm = class(TForm)
    // ...
    SaveBtn: TButton;
    Image: TImage;
    Database: TIBDatabase;
    taDefault: TIBTransaction;
    Q: TIBQuery;
    // ...
    procedure SaveBtnClick(Sender: TObject);
  private
    photo: TJpegImage;
    // ...
  end;

{ --- }

function ibSaveJpeg(q: TIBQuery; const paramName: string; jpeg: TJpegImage): Boolean;
var
  s: TStream;
begin
  s := TMemoryStream.Create;
  jpeg.SaveToStream(s);
  s.Position := 0;
  q.ParamByName(paramName).LoadFromStream(s, TBlobType(0));
end;

procedure TDemoForm.SaveBtnClick(Sender: TObject);
begin
  Q.SQL.Text := 'INSERT INTO contacts(id, photo) VALUES(123, :photo)';
  ibSaveJpeg(Q, 'photo', photo);
  Q.ExecSQL;
  taDefault.CommitRetaining;
end;
Freundliche Grüße

Grolle 1. Jul 2008 09:09

Re: Frage zu Firebird Blob und Image
 
Hi,

habe den Code jetzt wie folgt geändert:
Delphi-Quellcode:
  if main.Image3 <> nil then
  begin
    img := TJPEGImage.Create;
    img.Assign(main.Image3.Picture.Bitmap);
    s := TMemoryStream.Create;
    img.SaveToStream(s);
    s.Position := 0;
    ContactsQuery.ParamByName('P33').LoadFromStream(s, TBlobType(0));
    FreeAndNil(img);
  end;
  ContactsQuery.ExecSQL;
Bekomme jetzt die Exception 'Data type is not supported'? Das Feld in
der Tabelle ist ein Binary-Blob, was doch richtig sein müsste, oder?

Viele Grüße ...

marabu 1. Jul 2008 15:02

Re: Frage zu Firebird Blob und Image
 
Der Code sieht okay aus, auch wenn die Logik (IF-Bedingung, ExecSQL außerhalb) nicht ganz stimmt.

Die Fehlermeldung wird vom Server zurückgegeben.
Meinen Code habe ich mit FireBird 1.5 getestet, der Zugriff erfolgt mit IBQuery.
Welche Zugriffstechnik verwendest du?

Grolle 1. Jul 2008 15:08

Re: Frage zu Firebird Blob und Image
 
Hi,
Zitat:

Zitat von marabu
Der Code sieht okay aus, auch wenn die Logik (IF-Bedingung, ExecSQL außerhalb) nicht ganz stimmt.

davor werden ja noch andere Werte übergeben, aber nen try-except muss da wohl noch rein :roll:

Zitat:

Zitat von marabu
Welche Zugriffstechnik verwendest du?

Ich benutze IBDac Version 2.20 und Firebird 2.1.


Viele Grüße ...

marabu 1. Jul 2008 15:34

Re: Frage zu Firebird Blob und Image
 
Mit IBDAC kenne ich mich leider nicht aus.
Zum Produkt gehören Demos, speziell eine namens BlobPictures.
Vielleicht solltest du dir die mal ansehen.

mkinzler 1. Jul 2008 15:37

Re: Frage zu Firebird Blob und Image
 
Was für einen Typ (Sub_Type) hat das Feld in der Datenbank?

Grolle 1. Jul 2008 15:46

Re: Frage zu Firebird Blob und Image
 
Binary bzw. 0

Viele Grüße ....

Grolle 16. Jul 2008 11:42

Re: Frage zu Firebird Blob und Image
 
Hi,

also mit dem folgenden Source bekomme ich jetzt keine Fehlermeldung mehr,
aber das Bild ist auch nicht in der Datenbank vorhanden?:
Delphi-Quellcode:
  ContactsQuery.ParamByName('P31').AsInteger := 3;
  ContactsQuery.ParamByName('P32').AsBlob := main.Memo1.Text;
  if main.Image3 <> nil then
  begin
    img := TJPEGImage.Create;
    img.Assign(main.Image3.Picture.Bitmap);
    s := TMemoryStream.Create;
    img.SaveToStream(s);
    s.Position := 0;
    ContactsQuery.ParamByName('P33').LoadFromStream(s, ftBlob);
    FreeAndNil(img);
    FreeAndNil(s);
  end;
  ContactsQuery.ExecSQL;
Fragende Grüße ...

mikhal 16. Jul 2008 15:38

Re: Frage zu Firebird Blob und Image
 
Hast du mal versucht, einen Breakpoint zu setzen und getestet, ob deine if-Bedingung überhaupt greift?

Grüße
Mikhal

PS: Hat TJpegImage überhaupt eine Bitmap?

Grolle 16. Jul 2008 20:14

Re: Frage zu Firebird Blob und Image
 
Hallo,

es klappt jetzt. Eine kurze Frage noch:
Delphi-Quellcode:
    img := TJPEGImage.Create;
img.Assign(main.Image3.Picture.Graphic);
Kann ich mit img.Assign jedes Bild bzw. jeden Bildtyp aus einem TImage laden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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-2025 by Thomas Breitkreuz