Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi JPG als blob in firebird-table speichern (https://www.delphipraxis.net/45237-jpg-als-blob-firebird-table-speichern.html)

Meta777 2. Mai 2005 17:52

Datenbank: Firebird • Version: 1.5 • Zugriff über: Delphi 7

JPG als blob in firebird-table speichern
 
Huhu DP-ler,

wie kann man ein jpg in ein Blob-Feld speichern und lesen? :stupid:
Habe schon einiges hier und dort gelesen, auch die OH bietet ja ein Beispiel, aber alle benutzen ein TClientDataSet oder TTable oder ähnliches. Ich bin jedoch auf der Suche nach einer Möglichkeit das ganze über eine einfache TIBQuery zu realisieren.
Falls ihr eine Idee, nen Tut oder sonstiges habt, bitte posten!

Danke & Gottes Segen

marabu 2. Mai 2005 21:21

Re: JPG als blob in firebird-table speichern
 
Zitat:

Habe schon einiges hier und dort gelesen
Hättest du mal nur die Erbgeschichte von TIBQuery studiert. Was mit TTable funktioniert, funktioniert auch mit TIBQuery, da beide mit TFields arbeiten. Na ja, du bist zu faul zum Lesen und ich bin zu faul zum Testen - ich denke wir sind quitt.

Delphi-Quellcode:
function LoadJpeg(dbField: TField; jpeg: TJPegImage): boolean;
var
  s: TStream;
begin
  s := dbField.DataSet.CreateBlobStream(dbField, bmRead);
  Result := false;
  try
    jpeg.LoadFromStream(s);
    Result := true;
  finally
    s.Free;
  end;
end;

function SaveJpeg(dbField: TField; jpeg: TJPegImage): boolean;
var
  s: TStream;
begin
  s := dbField.DataSet.CreateBlobStream(dbField, bmWrite);
  Result := false;
  try
    jpeg.SaveToStream(s);
    Result := true;
  finally
    s.Free;
  end;
end;
Grüße vom marabu

spacewolf 3. Mai 2005 06:39

Re: JPG als blob in firebird-table speichern
 
Könntest Du das mal als kleines Beispiel mit dem: LoadJpeg und SaveJpeg
in einer query aufzeigen ???

tät mich escht interessieren... :-) danke für Deine Geduld


Andreas

Meta777 3. Mai 2005 11:13

Re: JPG als blob in firebird-table speichern
 
Zitat:

Zitat von marabu
Hättest du mal nur die Erbgeschichte von TIBQuery studiert. Was mit TTable funktioniert, funktioniert auch mit TIBQuery, da beide mit TFields arbeiten. Na ja, du bist zu faul zum Lesen und ich bin zu faul zum Testen - ich denke wir sind quitt.

:thumb:
Also, dass du mich besser kennst als ich mich selbst überrascht mich fast ein wenig...
Aber wahrscheinlich hät ich zu meinen posting einfach noch ein paar Details schreiben sollen.
Nuja, also soweit war ich auch schon. Dein source geht nicht. Jedenfalls nicht ohne weiteres.
Ich hab der SaveJpg noch "dbField.DataSet.Edit;" und "dbField.DataSet.Post;" hinzugefügt.
der query hab ich auch dem "UpdateObject" ein TIBUpdateSQL zugewiesen (und auch das SQL generieren lassen). Hier mal das SQL für "insert":
SQL-Code:
insert into BLOBLTEST
  (ID, TEXT, PIC)
values
  (:ID, :TEXT, :PIC)
Aufrufen tu ich die SaveJPG wie folgt:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  pic: TJPEGImage;
begin
  pic := TJPEGImage.Create;
  pic.LoadFromFile('d:\test.jpg');
  try
    if SaveJpeg(ibqBlob.FieldByName('PIC'), pic) then begin
      ibqBlob.Transaction.Commit;
    end;
  finally
    pic.Free;
  end;
end;
Zum lesen benutz ich:
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  pic: TJPEGImage;
begin
  pic := TJPEGImage.Create;
  if LoadJpeg(ibqBlob.FieldByName('PIC'), pic) then begin
    pic.SaveToFile('D:\t.jpg');
  end;
end;
Es gibt keinerlei Exceptions aber wenn ich das Bild wieder lade ist d:\t.jpg 0 Byte groß!?
Was mach ich falsch?

Bin für jeden Hinweis dankbar.

PS: Hier das Script für die Test-Tabelle:
SQL-Code:
CREATE TABLE BLOBLTEST (
    ID   INTEGER NOT NULL,
    TEXT VARCHAR(10),
    PIC  BLOB SUB_TYPE 0 SEGMENT SIZE 2048

marabu 3. Mai 2005 11:42

Re: JPG als blob in firebird-table speichern
 
Hi,

habe jetzt doch mal getestet. Dabei musste ich zu meiner Schande feststellen, dass ich den Code für den ADO/OLEDB Zugriff einfach angepasst hatte, ohne das Handbuch vorher zu lesen. Im Gegensatz zu AdoQuery ist IbQuery eine Nur-Lesen-Komponente. Die Vorgehensweise unterscheidet sich dann etwas. Hoffentlich kommst du mit meinem Code klar.

Zerknirschte Grüße vom marabu

Delphi-Quellcode:
procedure ibLoadJpeg(q: TIBQuery; fieldName: string; jpeg: TJpegImage);
var
  s: TStream;
begin
  s := q.CreateBlobStream(q.FieldByName(fieldName), bmRead);
  jpeg.LoadFromStream(s);
  s.Free;
end;

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

procedure TMainForm.LoadBtnClick(Sender: TObject);
begin
  Q.SQL.Text := 'SELECT passphoto FROM s3gallery WHERE persnr = 123';
  Q.Open;
  ibLoadJpeg(q, 'passphoto', photo);
  Q.Close;
end;

procedure TMainForm.SaveBtnClick(Sender: TObject);
begin
  Q.SQL.Text := 'UPDATE s3gallery SET passphoto = :passphoto WHERE persnr = 123';
  ibSaveJpeg(Q, 'passphoto', photo);
  Q.ExecSQL;
end;

Meta777 3. Mai 2005 14:53

Re: JPG als blob in firebird-table speichern
 
Danke!

Gottes Segen

Airblader 3. Mai 2005 15:21

Re: JPG als blob in firebird-table speichern
 
Ich werfe mal einen MySQL FAQ Link rein, der sich aber sicher auf alle Datenbanken bezieht, wäre hier sicher ein
interessanter Artikel.

16.3. Ist es sinnvoll, Bilder in einer Datenbank abzulegen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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