TDBImage wie funktionieren die?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
stinketier
Beiträge: 40
Registriert: Di 3. Mär 2015, 15:35

TDBImage wie funktionieren die?

Beitrag von stinketier »

Halli Hallo,

ich habe mal einpaar Fragen zum Thema Bilder in einer Datenbank:

- Wie bekomme ich denn soein Bild überhaupt in eine Tabelle rein?
(hat jemand mal ein bespiel für mich)
- TDBImage wird genommen um es anzuzeigen oder?

grundsätzlich hab ich grad mal etwas drüber gelesen. Ich arbeite recht gerne mit SQLite. Da müsste ich das Tabellen Feldtyp Bloob nehmen?
mein Problem ist grade nur wie ich eine Auswahlmöglichkeit zusammen zubauen um die Bilder in die Tabelle zuladen.

Viele Grüße
und danke für eure Hilfe

stinketier
Beiträge: 40
Registriert: Di 3. Mär 2015, 15:35

Re: TDBImage wie funktionieren die?

Beitrag von stinketier »

sooo

ich schaffe es zwar ein bild in die Datenbank zuladen

Code: Alles auswählen

 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    zQuery1.SQL.Text:= 'insert into bild (bild) values (:bild)';
    zQuery1.ParamByName('bild').LoadFromFile(OpenDialog1.FileName, ftBlob);
    zQuery1.ExecSQL;
 
  end;
end;
 


aber es anzeigen?
fehlanzeige :(

was mache ich falsch
ich habe unten ein Beispiel angehängt
Dateianhänge
V1.zip
ein kleinen beispielprogramm
(1.14 MiB) 71-mal heruntergeladen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TDBImage wie funktionieren die?

Beitrag von Michl »

Hab mir eben dein Projekt runtergeladen, es lauffähig gemacht (Variable Form1 hinzugefügt, Compilerfehlermeldungen bearbeitet), einen Button hinzugefügt (Button1) und in dessen OnClickEventhandler folgenden Code geschrieben:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  zQuery2.SQL.Text:='SELECT bild FROM bild';
  zQuery2.Open;
end


Sieht dann so wie im Anhang aus.

PS: auch Bezeichner in einer Datenbank sollten eindeutig sein
Dateianhänge
project1.png

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

stinketier
Beiträge: 40
Registriert: Di 3. Mär 2015, 15:35

Re: TDBImage wie funktionieren die?

Beitrag von stinketier »

vielen dank

na mit bezeichnern bin ich eigentlich sehr ordenlich und überlegt
lach aber bei beispielen sollte ich mir das auch mal angewöhnen

na dann schaue ich mir das gleich mal an

VG und danke nochmal

stinketier
Beiträge: 40
Registriert: Di 3. Mär 2015, 15:35

Re: TDBImage wie funktionieren die?

Beitrag von stinketier »

hab ich nun auch gemacht

fehlermeldung bekomme ich keine

kannst du mir mal die den quellcode schicken?
weil wie ich drehe oder wende bild bleibt leer

:(

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TDBImage wie funktionieren die?

Beitrag von theo »

So ganz nebenbei gesagt ist es nicht unbedingt optimal, Bilder in Datenbanken zu speichern.
Ich persönlich würde nur Pfade speichern, und die Bilder in ein Verzeichnis des Dateisystems legen.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TDBImage wie funktionieren die?

Beitrag von Michl »

Habe festgestellt, dass scheinbar in der Lazarus Version 1.2.6 ein Bug in der DBImage ist. Da ich nicht wusste, ob es an der DBImage oder Zeos lag, hatte ich noch ein Bsp. mit SQLDB (Lazarus-Bordmitteln) erstellt. Ein Workaround stellt die Nutzung eines einfachen TImages dar.

Einfaches Bsp. (Windows 32bit - SQLite3.dll dabei), welches unter Lazarus 1.2.6 und 1.5 funktioniert, angehangen (das Bsp von dir wird dir nichts nützen, da ich mit Zeos-Trunc und Lazarus-Trunc rumwerke - die Verwendung eines TImages funktioniert aber identisch unter Zeos).

Bild

theo hat geschrieben:So ganz nebenbei gesagt ist es nicht unbedingt optimal, Bilder in Datenbanken zu speichern.
Ich persönlich würde nur Pfade speichern, und die Bilder in ein Verzeichnis des Dateisystems legen.
Das wäre testwürdig, welches Verfahren für sich selbst schneller/günstiger ist. Ich hatte eben schon einen Test dazu gefunden: https://www.sqlite.org/intern-v-extern-blob.html
Dateianhänge
TestDBImage.zip
(1.01 MiB) 80-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: TDBImage wie funktionieren die?

Beitrag von theo »

@Michl: Naja, das hat natürlich verschiedene Aspekte. Es geht ja nicht nur um Geschwindigkeit beim Lesen.
Andere Aspekte wären z.B.: Schreiben, RAM Speicherverbrauch, SSD- vs. CPU-Speed, Webserver Caching, das Funktionieren der gesamten DB mit großen Binardatenmengen etc.
Aus meiner Sicht "nützt" ein BLOB in einer Datenbank nichts. Man filtert und sortiert ja nicht danach. Es ist einfach nur ein fettes, dummes Stück Speicher, welches man mitschleppen muss. :mrgreen:

Ich gebe zu, dass dies keine technische fundierte sondern eher eine gefühlsmäßige Begründung ist. :wink:
Mit Datenbanken kenne ich mich nicht besonders gut aus.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TDBImage wie funktionieren die?

Beitrag von Michl »

theo hat geschrieben:Naja, das hat natürlich verschiedene Aspekte. Es geht ja nicht nur um Geschwindigkeit beim Lesen.
Andere Aspekte wären z.B.: Schreiben, RAM Speicherverbrauch, SSD- vs. CPU-Speed, Webserver Caching, das Funktionieren der gesamten DB mit großen Binardatenmengen etc.
+ 1
Ein Aspekt, der zugunsten einer Datenbank unbedingt mit erwähnt werden muss, ist die Tatsache, dass mit einem einfachen "Select" die Daten des Images vorliegen (falls die Datenbank ordentlich funktioniert). Bei einer Dateilösung müsste neben der Datenbankstruktur eine (plattformabhängige) Filestruktur vorgehalten werden, die idealerweise diverse Fehlermöglichkeiten behandelt.

Ich denke, kleine Blobs kann eine Datenbank durchaus verkraften (Bilder habe ich, außer zu diesem Test, zwar auch noch nicht in einer Datenbank vorgehalten, diverse Blobs allerdings schon).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TDBImage wie funktionieren die?

Beitrag von m.fuchs »

Nicht zu vergessen: Wenn man beispielsweise SQLite benutzt, kann man eine komplexe Dateistruktur mit Blobs abbilden und muss trotzdem nur eine Datei weitergeben.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Ich_bin_dabei
Beiträge: 8
Registriert: Fr 27. Mär 2015, 10:34

Re: TDBImage wie funktionieren die?

Beitrag von Ich_bin_dabei »

Bin zwar neu hier und habe auch noch nicht viel Ahnung von freepascal, aber mit Database-BLOBs habe ich schon recht umfangreiche Tests hinter mir.

Hier mal ein Testergebnis bezüglich des tatsächlichen Speicherverbrauchs (Datenträger):

Tatsächliche Bildgröße 1395619 bytes
Tatsächlicher Speicherverbrauch in der DB (PgSQL) 1499136 bytes (Als blob in bytea Feld)

Habe momentan keine DB laufen, aber ich glaube die vorher/nachher Abfrage habe ich mit
SELECT pg_size_pretty(pg_database_size('postgres')); im SQL-Editor gemacht.

Auf jeden Fall solltest Du davon ausgehen, das die Bilder in der DB bis zu 10% mehr Speicher kosten.

Grüße

Antworten