MySql Dateipfad speichern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

MySql Dateipfad speichern

Beitrag von Bernie110 »

Hallo Zusammen,

ich hätte einmal eine kleine strategische Frage wie Ihr das so macht.

Ich habe mir in MySQL eine kleine Tabelle angelegt , STAMM_Land .
In dieser Tabelle werden alle Daten über ein Land gespeichert. Also LänderCode, Name, Kontinent usw.

Jetzt wollte ich natürlich diesen Ländern ihre Flagge zuordnen.

Dabei war meine Überlegung einfach den Bild-Pfad der Flagge in ein weiteres Feld Namens FLAF_PATH = Varchar(Max) auf den SQL Server zu speichern.
Das Problem das nun entsteht ist, daß der Pfad nicht richtig abgespeichert wird. Die \ werden einfach nicht übernommen.

Jetzt war meine nächste Idee, einfach in meinem Programm Pfade zu diesen Bildern bereitzuhalten. (konfigurierbar) und nur den Namen der Bilddatei auf dem SQl abzuspeichern.
Das wäre wohl sogar besser keine Ahnung. :D

Wie macht Ihr das ?
Zerlegt Ihr den Pfadnamen ?

Wäre für nen kleinen Schubbs in die richtige Richtung echt dankbar.
Lg Bernie

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: MySql Dateipfad speichern

Beitrag von Eb »

Die \ werden einfach nicht übernommen.

Das kann daran liegen, dass der Backslash als Escape-Zeichen interpretiert wird.
Um das zu verhindern muss man ihn im select statement doppelt schreiben.

Folgendes funktioniert bei mir:

Code: Alles auswählen

pfad := 'c:\\temp\\flagge1.png';
select_stmt := 'insert into STAMM_Land (id,FLAF_PATH) values (3,''' + pfad  + ''' )';
query2.SQL.Text:=select_stmt;
query2.ExecSql
  

Eb

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: MySql Dateipfad speichern

Beitrag von Bernie110 »

Eb hat geschrieben:
Die \ werden einfach nicht übernommen.

Das kann daran liegen, dass der Backslash als Escape-Zeichen interpretiert wird.
Um das zu verhindern muss man ihn im select statement doppelt schreiben.

Folgendes funktioniert bei mir:

Code: Alles auswählen

pfad := 'c:\\temp\\flagge1.png';
select_stmt := 'insert into STAMM_Land (id,FLAF_PATH) values (3,''' + pfad  + ''' )';
query2.SQL.Text:=select_stmt;
query2.ExecSql
  

Eb


Cool, dann muss ich doch theoretisch nur die einen \ durch 2 \\ ersetzen.
Muss ich gleich mal versuchen :-)
Danke ! Hilft mir schon !!
Lg Benrie

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

Re: MySql Dateipfad speichern

Beitrag von six1 »

Du hast zwar nicht explizit danach gefragt, aber mit einer zusätzlichen Dateiablage könntest du Probleme haben, falls du mal von einem anderen Arbeitsplatz auf die DB zugreifst und die Bilder auf diesem PC nicht vorhanden sind.
Man kann in der MYSQl DB auch BLOB Felder definieren und Bilder direkt in die DB schreiben.
Falls es sich nicht um riesige Bilder und sehr viele Einträge in der Tabelle handelt, funktioniert das sehr gut.
Hier mal ein paar Code Fragmente:

Bild in DB speichern:

Code: Alles auswählen

 
var
  Stream: TMemoryStream;
begin
     // Änderungen speichern
    ZQuery6.active:=false;
    ZQuery6.SQL.text:=
     ' insert into sprache ' +
     ' (kennung, sprache, bild) ' +
     ' values ' +
     ' (:kennung, :sprache, :bild) ';
    ZQuery6.ParamByName('kennung').asstring:=Form5.Edit1.text;
    ZQuery6.ParamByName('sprache').asstring:=Form5.Edit2.text;
    Stream := TMemoryStream.Create;
    Stream.Position := 0;
    Image1.Picture.SaveToStream(Stream);
    Stream.Position := 0;
    ZQuery6.ParamByName('bild').LoadFromStream(Stream, ftBlob);
    ZQuery6.ExecSQL;
    freeandnil(Stream);   
end;
 


Bild aus Tabelle laden:

Code: Alles auswählen

 
var
    Stream: TMemoryStream;
begin
   ZQuery3.SQL.text:=
    'Select * from sprache order by lfdnr';
   ZQuery3.Active:=true;
   Stream := TMemoryStream.Create;
   Stream.Position := 0;
   TBlobField(ZQuery3.FieldByName('bild')).SaveToStream(Stream);
   Stream.Position := 0;
   Image1.Picture.LoadfromStream(Stream);
   freeandnil(Stream);   
end;
 



Das sind lediglich Auszüge aus einem Programm, aber damit solltest du in der Lage sein, Bilder in eine Tabelle zu speichern und wieder zu laden.
Gruß, Michael

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: MySql Dateipfad speichern

Beitrag von Bernie110 »

Hi six1 ,

danke ;-)
Ich hatte darüber ein paar Dinge gelesen. Die Meisten raten einem davon ab es auf die Art zu speichern. Hat angeblich mit Performance zu tun.
Daher hatte ich mich für den Pfad entschieden.

Egal..jetzt stehe ich vor dem Problem wie ich diese Flaggen in ein DBGrid bekomme :D

Lg Bernie

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: MySql Dateipfad speichern

Beitrag von Warf »

Bernie110 hat geschrieben:Ich hatte darüber ein paar Dinge gelesen. Die Meisten raten einem davon ab es auf die Art zu speichern. Hat angeblich mit Performance zu tun.
Daher hatte ich mich für den Pfad entschieden.


Performancemäßig hat das kaum auswirkungen, da der blob erst gelesen wird wenn du ihn ausliest, in der unterliegenden tabelle ist das nur eine referenz. Ich würde sogar behaupten das: String aus der DB lesen + Datei im dateisystem lesen langsamer ist als die datei direkt aus der DB zu lesen, und solang du den blob nicht liest hat er eh keine auswirkungen. Du solltest damit also soger bessere performance erhalten.

Ich würde natürlich empfehlen sobald eine flagge einmal geladen wurde die im speicher zu halten falls du sie wieder brauchst und nicht immer wieder neu zu laden, das ist aber natürlich auch beim laden mit dem pfad von der platte so und kein Datenbank problem

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: MySql Dateipfad speichern

Beitrag von Bernie110 »

Warf hat geschrieben:
Bernie110 hat geschrieben:Ich hatte darüber ein paar Dinge gelesen. Die Meisten raten einem davon ab es auf die Art zu speichern. Hat angeblich mit Performance zu tun.
Daher hatte ich mich für den Pfad entschieden.


Performancemäßig hat das kaum auswirkungen, da der blob erst gelesen wird wenn du ihn ausliest, in der unterliegenden tabelle ist das nur eine referenz. Ich würde sogar behaupten das: String aus der DB lesen + Datei im dateisystem lesen langsamer ist als die datei direkt aus der DB zu lesen, und solang du den blob nicht liest hat er eh keine auswirkungen. Du solltest damit also soger bessere performance erhalten.

Ich würde natürlich empfehlen sobald eine flagge einmal geladen wurde die im speicher zu halten falls du sie wieder brauchst und nicht immer wieder neu zu laden, das ist aber natürlich auch beim laden mit dem pfad von der platte so und kein Datenbank problem


Hmm.. naja die Flaggen sind alles BitMap Dateien. Und bei ca 80 Ländern wohl eh kein Problem.
Ich fange ja gerade erst an. Muss erst mal mit den ganzen Objekten klar kommen :D

Sieht jetzt so aus :
Bild

Über das Datenmodell hab ich mir noch keine Gedanken gemacht.. Dachte mir.. Ich leg nen Ordner im Lazerus Ordner mit den Flaggen an... so exe usw. so weit bin ich noch nicht.
Wie ist das in einer MultiUser-Umgebung ? Kann man dann auf diesen Ordner zugreifen ?
Stelle mir sowieso vor, dass nur ein Admin ein Land anlegen kann.D.h. er sollte wissen wo die ganzen Flaggen Bilder liegen.
Ist das die falsche Vorgehensweise ?

Lg Bernie

Ps..schön wäre noch wenn man die Flaggen etwas kleiner machen könnte..Geht das ?

Antworten