Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Foto in DB speichern? (https://www.delphipraxis.net/127084-foto-db-speichern.html)

khh 7. Jan 2009 15:06

Datenbank: firebird • Version: 2.1 • Zugriff über: zeos

Foto in DB speichern?
 
hallo zusammen,
wie würdet ihr ein Foto in der DB, auch in Bezug auf die Zugriffsgeschwindigkeit, speichern?

a:)als Blobfeld, und dann welches Delphi-Datenformat verwenden, oder lieber
b:) nur den Pfad in der Db speichern und das Foto auf der Platte ablegen?

Danke für eure Meinungen

Gruss KH

mkinzler 7. Jan 2009 15:11

Re: Foto in DB speichern?
 
Kommt auf deine Vorlieben an. In der Datenbank, hat den Vorteil, das sie einfach verschoben oder auf einen anderen Rechner verschoben werden können.

khh 7. Jan 2009 15:12

Re: Foto in DB speichern?
 
Zitat:

Zitat von mkinzler
Kommt auf deine Vorlieben an. In der Datenbank, hat den Vorteil, das sie einfach verschoben oder auf einen anderen Rechner verschoben werden können.

ist der Zugriff so nicht langsamer?

mkinzler 7. Jan 2009 15:13

Re: Foto in DB speichern?
 
Wenn dann nicht spürbar

chaosben 7. Jan 2009 15:14

Re: Foto in DB speichern?
 
Ich bin ein BLOB-Fan und würde die Fotos in die DB schreiben. Je nachdem wie deine Anwendung aussieht, könntest du dir noch den Namen der Klasse reinschreiben, mit dem man das Bild wieder öffnen kann (z.B. TPNGObject). Dann kannst du ein "FindClass" machen und bist ziemlich variabel, was die Formate angeht.

khh 7. Jan 2009 15:16

Re: Foto in DB speichern?
 
Zitat:

Zitat von chaosben
Ich bin ein BLOB-Fan und würde die Fotos in die DB schreiben. Je nachdem wie deine Anwendung aussieht, könntest du dir noch den Namen der Klasse reinschreiben, mit dem man das Bild wieder öffnen kann (z.B. TPNGObject). Dann kannst du ein "FindClass" machen und bist ziemlich variabel, was die Formate angeht.


kann ich da einfach ein datenformat verwenden,wenn ja welches, oder muss ich das Schreiben des Blob über eine Klasse erledigen ?

mkinzler 7. Jan 2009 15:19

Re: Foto in DB speichern?
 
Was meinst du mit Datenformat?

khh 7. Jan 2009 15:29

Re: Foto in DB speichern?
 
Zitat:

Zitat von mkinzler
Was meinst du mit Datenformat?

naja ich definiere eine variable mit format "Blob" und weise der das Foto zu, so wie ich einen string einer stringvariablen zuweise.
per sql schreib ich dann alles in einem Rutsch in die DB, wenn das denn so funktioniert?

aber blob als datenformat gibts ja nicht :-(

mkinzler 7. Jan 2009 15:31

Re: Foto in DB speichern?
 
TBlobField.LoadFromFile()

khh 7. Jan 2009 15:35

Re: Foto in DB speichern?
 
Zitat:

Zitat von mkinzler
TBlobField.LoadFromFile()

genau das hab ich gemeint , super danke

Gruss KH

khh 7. Jan 2009 15:47

Re: Foto in DB speichern?
 
nochmal Blob :-(

bei der Zuweisung
FQuery1['ARTFOTO']:= FARTFOTO;

FARTFOTO ist von Type TBLOBField ,bekomme ich nen Fehler :
Error: Incompatible type for arg no. 2: Got "TBlobField", expected "Variant"

was mach ich da noch falsch?


dane Gruss KH

DeddyH 7. Jan 2009 15:51

Re: Foto in DB speichern?
 
Zeig doch mal die Routine zum Speichern (vielleicht zeig ich Dir dann auch meine :lol:).

khh 7. Jan 2009 15:56

Re: Foto in DB speichern?
 
Zitat:

Zitat von DeddyH
Zeig doch mal die Routine zum Speichern (vielleicht zeig ich Dir dann auch meine :lol:).

also wie gesagt artfoto habe ich als TBLOBfield definiert.

die restliche Felder hab ich der Übersichtlichkeit wegen hier mal weggelassen.



FQuery1.SQL.clear;
FQuery1.SQL.add('select ');
FQuery1.SQL.add('*');
FQuery1.SQL.add('from artikel where ');
FQuery1.SQL.add('ARTIKEL_ID = :ARTIKEL_ID');
FQuery1.ParamByName('ARTIKEL_ID').AsInteger := FARTIKEL_ID;
FQuery1.open; // liefert eine leere datenmenge
FQuery1.append; // neuen Datensatz anhängen
FQuery1['ARTFOTO']:= FARTFOTO;

FhwdQuery1.post;

DeddyH 7. Jan 2009 16:04

Re: Foto in DB speichern?
 
Wieso holst Du Dir erst eine leere Datenmenge, statt gleich ein Insert zu machen?

khh 7. Jan 2009 16:15

Re: Foto in DB speichern?
 
Zitat:

Zitat von DeddyH
Wieso holst Du Dir erst eine leere Datenmenge, statt gleich ein Insert zu machen?

weil das Ganze ohne das open nicht funktioniert hat.
Lasse mich aber gerne eines Besseren belehren.
EDIT: ich habe append anstatt insert verwendet, weil ich den DS an der geöffneten Datenmenge anhängen wollte und nicht irgendwo zwischenreinschieben.

Gruss KH

DeddyH 7. Jan 2009 16:27

Re: Foto in DB speichern?
 
Hier mal meine Routine (FBLib statt ZEOS, nicht wundern). Allerdings speichere ich vorher ggf. den neuen Datensatz ab und mache danach ein Update, um nicht alles doppelt schreiben zu müssen:
Delphi-Quellcode:
procedure TMyClass.StorePic;
var aStream: TMemoryStream;
begin
  if FPicModified then
    begin
      with TFBLParamDsql.Create(nil) do
        try
          Transaction := FTransaction;
          if not Transaction.InTransaction then
            Transaction.StartTransaction;
          SQL.Text := 'UPDATE Tabelle SET Bild=:bild WHERE ID=:id';
          Prepare;
          ParamByNameAsInt64('id',FID);
          if Assigned(FBild) then
            begin
              aStream := TMemoryStream.Create;
              try
                FBild.SaveToStream(aStream);
                aStream.Position := 0;
                BlobParamByNameLoadFromStream('bild',aStream);
              finally
                aStream.Free;
              end;
            end
          else
            ParamByNameAsNull('bild');
          try
            ExecSQL;
          except
            raise;
          end;
          FPicModified := false;
        finally
          Free;
        end;
    end;
end;

khh 7. Jan 2009 16:31

Re: Foto in DB speichern?
 
ok, ich danke dir

Gruss KH


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