TDBImage wie funktionieren die?
-
- Beiträge: 40
- Registriert: Di 3. Mär 2015, 15:35
TDBImage wie funktionieren die?
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
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
-
- Beiträge: 40
- Registriert: Di 3. Mär 2015, 15:35
Re: TDBImage wie funktionieren die?
sooo
ich schaffe es zwar ein bild in die Datenbank zuladen
aber es anzeigen?
fehlanzeige
was mache ich falsch
ich habe unten ein Beispiel angehängt
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;
fehlanzeige

was mache ich falsch
ich habe unten ein Beispiel angehängt
- Dateianhänge
-
V1.zip
- ein kleinen beispielprogramm
- (1.14 MiB) 79-mal heruntergeladen
Re: TDBImage wie funktionieren die?
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:
Sieht dann so wie im Anhang aus.
PS: auch Bezeichner in einer Datenbank sollten eindeutig sein
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
zQuery2.SQL.Text:='SELECT bild FROM bild';
zQuery2.Open;
end;
PS: auch Bezeichner in einer Datenbank sollten eindeutig sein
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 40
- Registriert: Di 3. Mär 2015, 15:35
Re: TDBImage wie funktionieren die?
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
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
-
- Beiträge: 40
- Registriert: Di 3. Mär 2015, 15:35
Re: TDBImage wie funktionieren die?
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

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

Re: TDBImage wie funktionieren die?
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.
Ich persönlich würde nur Pfade speichern, und die Bilder in ein Verzeichnis des Dateisystems legen.
Re: TDBImage wie funktionieren die?
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).

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).

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.htmltheo 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.
- Dateianhänge
-
TestDBImage.zip
- (1.01 MiB) 93-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: TDBImage wie funktionieren die?
@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.
Ich gebe zu, dass dies keine technische fundierte sondern eher eine gefühlsmäßige Begründung ist.
Mit Datenbanken kenne ich mich nicht besonders gut aus.
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.

Ich gebe zu, dass dies keine technische fundierte sondern eher eine gefühlsmäßige Begründung ist.

Mit Datenbanken kenne ich mich nicht besonders gut aus.
Re: TDBImage wie funktionieren die?
+ 1theo 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.
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;
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- 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?
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
-
- Beiträge: 8
- Registriert: Fr 27. Mär 2015, 10:34
Re: TDBImage wie funktionieren die?
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
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