![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: ASQL
String eintragen der Apostroph enthält
Guten Abend,
ich stehe ein wenig auf dem Schlauch. Ich habe ein Programm das ein Mail System "simuliert". Es arbeitet also als Mail System, die Mails sind aber keinen echten Mails. Dazu nutze ich eine SQLite Datenbank um die Mails (welche auch vom Programm generiert werden können) speichert. Mit virtuellem Absender und Datum. Dazu habe ich mir eine Procedure geschrieben:
Delphi-Quellcode:
Funktioniert fast perfekt. Aufgerufen wird es mit:
procedure addMail(abs: String; txt: String);
var datum: String; begin datum := FormatDateTime('dd.mm.yyyy', Now); fuunc.ASQLite3Query1.SQL.Clear; fuunc.ASQLite3Query1.SQL.Add('INSERT INTO mails (absender, mail, datum) VALUES ('''+abs+''', '''+txt+''', '''+datum+''')'); fuunc.ASQLite3Query1.ExecSQL; end;
Delphi-Quellcode:
Mein Problem ist nun, das es den SQL Befehl zerhaut, wenn im Text oder Absender ein ' vorkommt. Kein Problem, dachte ich und lasse alle ' durch '' ersetzen. Aber dann funktioniert meine String Übergabe nicht mehr weil Delphi '' schon selbst nutzt.
func.addMail('Hans Meier', 'Text');
Kann ich da irgendwas einfaches machen? Bestimmt, ich komme nur grad nicht drauf *grml*. Gruß, Andreas |
AW: String eintragen der Apostroph enthält
Zitat:
|
AW: String eintragen der Apostroph enthält
|
AW: String eintragen der Apostroph enthält
---
|
AW: String eintragen der Apostroph enthält
Zitat:
|
AW: String eintragen der Apostroph enthält
Du könntest es mal mit Parametern probieren.
Das ist nicht nur sicherer, sondern umgeht auch solche Probleme mit Quotes ;-) ![]() |
AW: String eintragen der Apostroph enthält
Zitat:
Aber ich tüftel dann mal da rum, danke :). Edit: @Luckie Danke, das hatte ich schon gefunden. Aber so wie ich das lese, löst das nicht mein Problem... (oder ich verstehe es falsch). |
AW: String eintragen der Apostroph enthält
soo kompliziert ist das auch nicht:
Delphi-Quellcode:
je nachdem mit welcher Schnittstelle Du arbeitest vaariiert die Parameterübergabe etwas:
fuunc.ASQLite3Query1.SQL.Add('INSERT INTO mails (absender, mail, datum) VALUES (:abs_txt,:txt_txt,:datum_txt)');
Delphi-Quellcode:
ggf. müsste da statt .asstring .value stehen und parameters könnten auch params heißen. schau mal nach.
fuunc.ASQLite3Query1.Parameter.ParameterbyName('txt_txt').asstring:=MeinText;
fuunc.ASQLite3Query1.Parameter.ParameterbyName('abs_txt').asstring:=MeinABS; fuunc.ASQLite3Query1.Parameter.ParameterbyName('datum_txt').asstring:=MeinDatum; Gruß K-H |
AW: String eintragen der Apostroph enthält
Du musst, wenn du nicht mit Parametern arbeitest, die Strings aber unbedingt escapen, da man sonst sehr leicht
![]() Was unter Delphi die Standard-Methode zum escapen ist, weiß ich nicht, vielleicht ist
Delphi-Quellcode:
ja schon die Lösung.
QuotedStr
Würde dir aber auch eindeutig zu der Parameter-Variante raten... damit bist du zu 100% sicher unterwegs und gewinnst außerdem eine Menge Übersicht. |
AW: String eintragen der Apostroph enthält
Zitat:
Allerdings nur ein Mal. Wenn ichs dann direkt wieder versuche, bekomme ich ne kryptische Zugriffsverletzung. Durch das "free" im finally Part, dürfte doch aber nichts im Speicher hängen bleiben, oder? |
AW: String eintragen der Apostroph enthält
Würdest du einmal etwas Code spendieren?
Mir fehlt vor allem ein .Close
Delphi-Quellcode:
Gruß
fuunc.ASQLite3Query1.Close;
fuunc.ASQLite3Query1.SQL.Clear; fuunc.ASQLite3Query1.SQL.Add('INSERT INTO mails (absender, mail, datum) VALUES ('''+abs+''', '''+txt+''', '''+datum+''')'); fuunc.ASQLite3Query1.ExecSQL; fuunc.ASQLite3Query1.Close; K-H |
AW: String eintragen der Apostroph enthält
Sorry, Telefon.
Der Code der bei mir 1 Mal funktioniert aber dann eine Zugriffsverletzung macht ist:
Delphi-Quellcode:
with fuunc.ASQLite3Query1 do
try RawSQL := False; SQL.Text := 'INSERT INTO mails (absender, mail, datum) VALUES (:absender,:mail,:datum)'; Params.ParamByName('absender').Value := abs; Params.ParamByName('mail').Value := txt; Params.ParamByName('datum').Value := date; ExecSQL; SQL.Clear; Params.Clear; Close; finally Free; end; |
AW: String eintragen der Apostroph enthält
Das ist ja anscheinend eine Komponente, wieso gibst Du die frei? Dafür ist doch im Normalfall der Owner zuständig. Und ein Close nach ExecSQL macht keinen Sinn, lass Dir da nix einreden.
|
AW: String eintragen der Apostroph enthält
Weil ich "Angst" habe das ich den Arbeitsspeicher zumülle, wenn ich da nix freigebe. Kann das nicht passieren?
|
AW: String eintragen der Apostroph enthält
Das kommt jetzt darauf an. Hast Du sie zur Entwurfszeit auf das Formular gepackt oder zur Laufzeit erzeugt?
|
AW: String eintragen der Apostroph enthält
Zur Entwurfszeit. Ist für mich übersichtlicher.
|
AW: String eintragen der Apostroph enthält
Dann musst Du sie auch nicht freigeben, das machst Du mit anderen Komponenten ja hoffentlich auch nicht.
|
AW: String eintragen der Apostroph enthält
Dann darfst du es auch nicht frei geben. Denn wie oder wann soll es den nach dem Freigeben wieder erstellt werden? Wenn du die Komponente zur Entwurfszeit auf das Formular machst, dann ist das Formular der Owner und gibt die Komponente auch wieder frei.
|
AW: String eintragen der Apostroph enthält
Ah ok, klingt logisch. Ich hatte nur schon so oft gelesen, das irgendwelche Fehler bei DB Programmierung damit zusammenhängen, das man den Arbeitsspeicher nicht sauber genug nutzt.
Aber ohne free und close funktioniert es perfekt, so wie es soll. Danke Euch, hat mir sehr geholfen :). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz