Bild in SQLite3 DB speichern
Bild in SQLite3 DB speichern
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
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6217
- 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
Such dir direkt die Spalte im Datenset mit FindByName heraus.
Dann sollte sowas funktionieren
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.
Dann sollte sowas funktionieren
Code: Alles auswählen
tblobfield(MyDataset.FieldByName('picture')).LoadFromStream(myStream);
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Bild in SQLite3 DB speichern
Hallo af0815, hallo zusammen,
SUPI, das hat geklappt.
Danke schön
Gruß
Lorca
SUPI, das hat geklappt.
Danke schön
Gruß
Lorca
Re: Bild in SQLite3 DB speichern
Ist es nicht üblich, das Bild nicht in der DB zu speichern, sondern in der DB nur den Pfad zum Bild?!
Re: Bild in SQLite3 DB speichern
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6217
- 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
Ich denke bei den SInnhaftigkeiten gar nicht mehr nach, weil die Probleme lösen sich dann beim Benutzer sowieso von alleine.
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
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).
-
- Beiträge: 1470
- 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
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.
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
Re: Bild in SQLite3 DB speichern
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
So ein paar Flaggen bretzel ich auch in die DB... falls eine Bildablage oder allgemein Fileablage ansteht, ist das ein denkbar schlechter Weg. (mMn)
In meinem letzten großen Projekt wäre das undenkbar gewesen mit locker über 250GB abgelegten Dateien
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