Bild in SQLite3 DB speichern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Bild in SQLite3 DB speichern

Beitrag von Lorca »

Hallo zusammen :),

ich habe mal wieder eine blöde frage. :(

Ich möchte gerne ein .JPG Bild in ein Blob Feld einer SQLite3 DB Tabelle speichern.
Das Blobfeld ist mit Kollation: BINARY gekennzeichnet.
Im Programm verwende ich die ZEOS Komponente "Table"

Aber das Bild wird nicht in der DB abgelegt. Und ich weis nicht wo mein Fehler liegt
Ich habe es auf verschiedene Arten versucht, Nicht davon klappt.
Ver 1:
TAB_BlobData.Open;
TAB_BlobData.Insert;
DBImage1.Picture.LoadFromFile( lv_FName ); { Inhalt: C:\Windows\Temp\Deeppurple.jpg }
TAB_BlobData.Post;
TAB_BlobData.Close;

Ver 2:
TAB_BlobData.Open;
TAB_BlobData.Insert;
DBImage1.Picture.LoadFromFile( lv_FName ); { Inhalt: C:\Windows\Temp\Deeppurple.jpg }
DBImage1.Picture.SaveToStream( TAB_BlobData.CreateBlobStream( TAB_BlobData.FieldByName( 'Bild' ), bmWrite ) );
TAB_BlobData.Post;
TAB_BlobData.Close;

Ich habe es auch mit TFilestream etc.PP. versucht. nix davon klappt.

Kann jemand von euch helfen?

Gruß
Lorca :)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6175
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Bild in SQLite3 DB speichern

Beitrag von af0815 »

Such dir direkt die Spalte im Datenset mit FindByName heraus.
Dann sollte sowas funktionieren

Code: Alles auswählen

tblobfield(MyDataset.FieldByName('picture')).LoadFromStream(myStream);
Statt LoadFromStream nimmdann das mit was du das Bild lädst. Ich habe schon lange nichts mehr mit Bildern und Datenbanken gemacht, weil die Bilder einfach zu groß geworden sind, so das es keinen Sinn mehr macht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Bild in SQLite3 DB speichern

Beitrag von Lorca »

Hallo af0815, hallo zusammen, :)

SUPI, das hat geklappt.
Danke schön :)

Gruß
Lorca

Epcop
Beiträge: 140
Registriert: Di 29. Mai 2012, 09:36

Re: Bild in SQLite3 DB speichern

Beitrag von Epcop »

Ist es nicht üblich, das Bild nicht in der DB zu speichern, sondern in der DB nur den Pfad zum Bild?!

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

Re: Bild in SQLite3 DB speichern

Beitrag von theo »

Epcop hat geschrieben:
Mo 3. Apr 2023, 16:41
Ist es nicht üblich, das Bild nicht in der DB zu speichern, sondern in der DB nur den Pfad zum Bild?!
Kommt drauf an. Ein paar funktionale Icons würde ich vielleicht auch noch in der DB speichern, aber für grössere Bilder nur den Pfad.
Was sollen die Binärdaten in der DB? Danach filtern, sortieren etc. kannst du ja nicht.
Für Web-Datenbanken ist es sowieso klar, dass man nur den Pfad speichert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6175
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Bild in SQLite3 DB speichern

Beitrag von af0815 »

Ich denke bei den SInnhaftigkeiten gar nicht mehr nach, weil die Probleme lösen sich dann beim Benutzer sowieso von alleine. :shock:

Dann kommt die Diskussion auch noch und wie speichere ich das Bild wo damit ich den Pfad verwenden kann. Und dann kommt sicher noch, das der Pfad auf einem anderen Rechner nicht gleich ist,....

Ach ja, bei MS-SQL kann man sehr wohl Bilder in der DB speichern. Dazu bietet sich die Filetabelle an. Ist zwar ein wenig kompliziert zum Einrichten und man muss das Serverdesign anpassen, aber es geht.
https://learn.microsoft.com/de-de/sql/r ... rver-ver16
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1424
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Bild in SQLite3 DB speichern

Beitrag von MmVisual »

Ich speichere Bilder ebenfalls in der DB mit ab. Jedoch bevor ich die speichere schicke ich die erst einmal in/durch ein PNG und in ein JPG, je nach dem was dann kleiner raus kommt, das wird dann in der DB abgespeichert.
Wenn das Bild größer als 64KB ist kommt eine Warnung und man kann das Bild automatisch auf eine kleinere Größe schrumpfen lassen.

Der Vorteil der Bilder in der DB: man braucht keine extra Dateifreigabe und die Bilder sind "einfach da".

Durch die Benutzer Abfrage wegen der Größe und dem zusätzlichen Komprimieren in eine geeignete Form hält sich das Datenvolumen in verwaltbare Grenzen.

Von hochauflösenden Fotos mit mehreren MB Daten kann ich abraten, das sollte man besser nicht machen, alleine schon deshalb weil das Bild aus der DB dann garantiert merklich langsamer geladen als wie wenn man es von einem Netzlaufwerk lädt.

Mit dem DBImage.Picture direkt zu speichern ist ebenfalls keine so gute Idee, denn damit werden die Bilder unkomprimiert gespeichert.
Besser das Blob Feld als Stream ansprechen, und mit LoadFromStream das Bild aus dem PNG/JPG Objekt laden / speichern und dann es in ein TImage laden. Es ist zwar aufwändiger, dafür schlussendlich schneller da deutlich weniger Daten über die Datenbank gehen und man kann mit 64KB JPG doch schon ganz ordentliche Bilder ablegen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
six1
Beiträge: 773
Registriert: Do 1. Jul 2010, 19:01

Re: Bild in SQLite3 DB speichern

Beitrag von six1 »

Der TO wird wissen, um welche Daten es geht.
In meinem letzten großen Projekt wäre das undenkbar gewesen mit locker über 250GB abgelegten Dateien 8)
So ein paar Flaggen bretzel ich auch in die DB... falls eine Bildablage oder allgemein Fileablage ansteht, ist das ein denkbar schlechter Weg. (mMn)
Gruß, Michael

Antworten