MySql Dateipfad speichern
MySql Dateipfad speichern
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.
Wie macht Ihr das ?
Zerlegt Ihr den Pfadnamen ?
Wäre für nen kleinen Schubbs in die richtige Richtung echt dankbar.
Lg Bernie
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.
Wie macht Ihr das ?
Zerlegt Ihr den Pfadnamen ?
Wäre für nen kleinen Schubbs in die richtige Richtung echt dankbar.
Lg Bernie
-
- 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
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
Re: MySql Dateipfad speichern
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
Re: MySql Dateipfad speichern
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:
Bild aus Tabelle laden:
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.
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
Re: MySql Dateipfad speichern
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
Lg Bernie
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
Lg Bernie
-
- Beiträge: 1912
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: MySql Dateipfad speichern
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
Re: MySql Dateipfad speichern
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
Sieht jetzt so aus :
Ü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 ?