![]() |
Speichern von Datenfeldern mit Anführungszeichen im Text...
hallo,
mein problem ist eigentlich recht simpel zu beschreiben und ich denke es müsste ständig auftauchen. dennoch konnte ich weder hier im forum noch per google irgendwelche infos dazu finden??? da mich nun das gefühl beschleicht ich stelle mich dabei einfach nur ziemlich dämlich an, wollte ich's vorab erwähnt haben :? sobald ich ein datenfeld aktualisieren oder neu anlegen möchte welches ein einziges " anführungszeichen enthält oder eine ungrade anzahl an ' beeinflusst das direkt meinen code. soll heissen, z.b. ein anführungszeichen in einem edit-feld das ich auslese wirkt sich gleich auf meinen sql-befehl aus und beendet diesen z.b. mittendrin. das dann fehlermeldungen wie "typ für feld x unbekannt" oder "rechtes anführungszeichen fehlt"... als beispiel:
Code:
QueryEinzelfelder.sql.clear;
QueryEinzelfelder.SQL.Text := 'INSERT INTO einzelfelder(id,typ,beschreibung,aktiv,text,bemerkungen,timestamp) VALUES ("", "' + combobox1.Text + '", "' + edit2.Text + '", "' + feld_aktiv + '", "' + memo2.Text + '", "' + memo1.Text + '", NOW())'; QueryEinzelfelder.ExecSQL; bin ratlos und vor allem für jeden tipp dankbar... gruß mgalli |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
so weit ich weiß sollte man bei insert-statements einfache Hochkommas benutzen - vielleicht liegts daran
versuch mal 'INSERT INTO einzelfelder(id,typ) VALUES ('''', ''' + AnsiReplaceStr(Edit1.Text,'''','''''') + ''')'; wie in Delphi so muß auch in SQL ein einfaches Hochkomma verdoppelt werden. Schau mal in der Delphi Hilfe unter "Zeichen-Strings" nach Ciao Marco |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
Hi,
die Funktion 'QuotedStr' könnte Dir weiterhelfen. Gruß, Barnti |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
dafür gibt es in der unit sysutils
die function quotedstr z.b. quotedstr(edit1.text) |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
Für bessere Übersicht/Performance kann ich da nur die Verwendung von Parametern empfehlen:
Delphi-Quellcode:
Da ID bei dir anscheinend durch einen Trigger in der DB gesetzt wird, musst du es auch nicht in deine Spaltenliste aufnehmen.
With ADOQuery Do
Begin SQL.Text := 'Insert Into EinzelFelder' + #10 + ' (Typ, Beschreibung, Aktiv, Text, Bemerkungen, Timestamp)' + #10 + 'Values' + #10 + ' (:i_Typ,' + #10 + ' :i_Beschreibung,' + #10 + ' :i_Aktiv,' + #10 + ' :i_Text,' + #10 + ' :i_Bemerkungen,' + #10 + ' :i_TimeStamp)'; // mit Prepared wird das Statement nach SQL-Variablen (Parametern) durchsucht Prepared := True; Parameters.ParamByName('i_Typ').Value := ComboBox1.Text; Parameters.ParamByName('i_Beschreibung').Value := Edit2.Text; Parameters.ParamByName('i_Aktiv').Value := Feld_Aktiv; Parameters.ParamByName('i_Text').Value := Memo2.Text; Parameters.ParamByName('i_Bemerkungen').Value := Memo1.Text; Parameters.ParamByName('i_TimeStamp').Value := Now(); ExecSQL; End; p.s.: Control-Bezeichnungen wie: ComboBox1, Edit1,Memo2,... sorgen dafür, dass du deinen Code in 2 Wochen genau Durchlesen musst um zu wissen was du da eigentlich machen wolltest. Bei aussagekräftigen Bezeichnungen reicht meistens ein kurzes "Überfliegen". Edit: Delphi-SchlussTag gesetzt |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
Hallo Robert,
ich wollte Dich schon länger mal fragen, warum Du Deine Zeilenumbrüche bei den SQL-Anweisungen nur mit #10 machst? Ich persönlich nehme (wohl aus Gewohnheit) immer #13#10, soweit ich weiß ist #10 ja aus der Unix-Welt, oder? |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
In Oracle ist ein #13#10 nicht zulässig, da man mit einem simplen #10 ein Zeichen/Zeile einspart.
(Bei Zugriffen von außerhalb der DB geht auch CrLf, wird aber vom ADO / ODBC Treiber in Lf übersetzt) Da es in bisher jeder DB funktioniert hat, habe ich mir das angewöhnt. In meiner ![]()
Code:
Edit: Tippfehler
;PL/SQL Developer SpecialCopy definition
;<LINE_1> for first line ;<LINE_*> for all other lines ;<LINE_N> for last line ; With ADOQuery Do Begin SQL.Text := '<line_1>' + #10 + '<line_*>' + #10 + '<line_n>'; Prepared := True; Parameters.ParamByName('XYZ').Value := ABC; ExecSQL/Open; End; |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
Hallo Robert,
danke für Deine Erklärungen, ich benutze auch die DOA-Kompos von Allroundautomations. Den PL/SQL Dev. setze ich nur sporadisch ein, das "SpecialCopy" kannte ich noch gar nicht! :firejump: Ich habe jetzt bei meinen Soßen nachgeschaut, wenn ich DOA verwende nutze ich immer Sql.Add('sql-befehl') und nicht Sql.Text, daher ist mir das mit dem nicht erlaubten #13#10 auch nie aufgefallen :oops:. |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
@mGalli
Ich hoffe doch, das dein Problem geklärt ist, auch wenn es etwas abseits wurde Nochmal OT :roll: Der PL/SQL Dev. ist so ziemlich die genialste DB-Oberfläche, die mir unter die Augen gekommen ist. Du kannst auch direkt den SQL-Code zwischen einer OracleQuery in Delphi und dem TestWindow hin&her schieben. Hast du die 2 PlugIn-Delphi-Projekte gesehen (unter ..\PLSQL Developer\PlugInDoc\). Das ist mal eine PlugIn-Doku!!! |
Re: Speichern von Datenfeldern mit Anführungszeichen im Text
leider wurde hir nicht geantwortet wie das problem gelöst wurde, weil ich habe das gleiche und schon fast alles probirt :cry:
Delphi-Quellcode:
auf den feldern steht:
Form1.Query1.SQL.Add
('INSERT INTO Artikelliste (Artikel_Nummer,Artikel,Hersteller,Hersteller_Nummer,EAN_Code,Warengruppe,Nettopreis_EUR,Status,Beschreibung) VALUES ('+QuotedStr(text[1])+','+QuotedStr(text[2])+','+QuotedStr(text[3])+','+QuotedStr(text[4])+','+QuotedStr(text[5])+','+QuotedStr(text[6])+','+QuotedStr(text[7])+','+QuotedStr(text[8])+','+QuotedStr(text[9])+')'); text[1]:='20259'; text[2]:='Geh K Ext. 5,25" MULTICASE CA-800B2 IDE=>USB2.0 (Lü)'; text[3]:='Multicase'; text[4]:='ME-320U2'; text[5]:='-'; text[6]:='Gehäuse'; text[7]:='46,46'; text[8]:='Auf Lager'; text[9]:='Geh MULTICASE 5,25" USB 2.0 Multicase Hotline : 02131-66191-30 - inkl. internen Netzteil - ME-320 Series<br'+' />- Kunststoff Gehäuse - Ali-Chipssatz ( bis 300GB ) Irrtümer und technische Änderungen vorbehalten'; ich habe schon versucht einzelne text[x] einfach mit '-' zu füllen um zu testen welcher string das problem macht hat aber nichts geholfen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 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