![]() |
Datenbank: ORACLE • Version: 9 • Zugriff über: TDatabase
SQL -> Text mit ' einfügen ?
Hallo zusammen,
ich führe eine Insert-Anweisung so durch:
Delphi-Quellcode:
Wenn die Variable Wert jetzt z.B. "An Klas'Kotten 10" annimmt, führt dies zu einem Fehler, da dort das Zeichen ' vorkommt. Wie kann ich dieses abfangen. Wert habe ich als String deklariert.
INSERT INTO Tabelle(Wert) VALUES(''' + Wert + ''')
Gruss Holger |
Re: SQL -> Text mit ' einfügen ?
Hi Holger,
versuch mal:
SQL-Code:
INSERT INTO Tabelle(Wert) VALUES(' + QuotedStr(Wert) + ')
|
Re: SQL -> Text mit ' einfügen ?
Das hat geklappt. Vielen Dank
Gruss Holger |
Re: SQL -> Text mit ' einfügen ?
Benutzen Parameter bitte. Oracle Shared Pool liebet das.
Delphi-Quellcode:
[edit=r_kerber]Delphi-Tags eingefügt. Mfg, r_kerber[/edit]
...
Q.Close; Q.Clear; Q.SQL.Text := 'INSERT INTO Tabelle(Wert) VALUES(:pMeineParam)'; Q.ParamByName('pMeineParam').AsString := 'An Klas'Kotten 10'; Q.ExecSQL; ... |
Re: SQL -> Text mit ' einfügen ?
Also wenn du sowas wie Parameter nutzen kannst, wie "Valeo Pupsus" angesprochen hat, würd ich auch lieber diese nehmen schon aus Sicherheitstechnischen Gründen...
Bye Christian |
Re: SQL -> Text mit ' einfügen ?
Sicherheitstechnisch kann da nicht viel passieren, wenn denn alles stimmt. Allerdings sind Tür und Tor für Fehler weit geöffnet. Valeo Pupsus :shock: liefert gleich ein schönes Bsp. Dieses lässt sich sicherlich in der Art nicht compilieren wegen Schreibfehler. Er hat vergessen aus dem ' im String ein '' zu machen. Wäre der Ausdruck syntaktisch zwar korrekt, aber nicht logisch dann kracht es zur Laufzeit umso mehr. Delphi würde bei diesem sinnlosen SQL-String nicht mal meckern :
Delphi-Quellcode:
Jetzt wird aber nicht nur ein Feld manuell besetzt, sondern sogar das ganze Insert-Statement. Durch schlichtes Zusammensetzen eines Strings und diesen dann an die DB schicken. Diese Strings werden meistens viel zu lang und deshalb unübersichtlich. Warum werden die (vorhandenen) Methoden von TDataSet nicht benutzt ?
Q.SQL.Text := 'jhlkkjhjkhkl';
Delphi-Quellcode:
Edit1.Text := 'An Klas''Kotten 10'; // falls Wert von Hand besetzt wird ' -> ''
DS.Insert; DS.FieldByName('NAME').AsString := Edit1.Text; .. weitere Felder DS.Post; // Commit usw. |
Re: SQL -> Text mit ' einfügen ?
>Hansa
>Er hat vergessen aus dem ' im String ein '' zu machen. Ja, leider, aber das ist eine Kleinigkeit. Der Sinn im SQL-Statement fuer Oracle Parameter benutzen. >aber nicht logisch dann kracht es zur Laufzeit umso mehr Warum? >Warum werden die (vorhandenen) Methoden von TDataSet nicht benutzt ? Du kannst dataset nicht brauchen. Du kannst nur insert/update machen brauchen. |
Re: SQL -> Text mit ' einfügen ?
nunja, wenn man direkt Strings von Benutzern per Insert einfügt, sollte man immer ein wenig vorsichtig sein, zumindest bin ich es...
Man weis ja nie wer vor dem Rechner sitzt und da was in die TextBox einklimpert... Stichwort "SQL-Injektion" IHMO ist man da mit Parametern eigendlich immer auf der sicheren Seite... Bye Christian |
Re: SQL -> Text mit ' einfügen ?
Also... den Beitrag von Hansa halte ich für absoluten Schwachsinn!!!!
ParamByName ist die richtige Lösung und dass man den SQL.Text auf ein INSERT-Statement setzt die beste Lösung. Besser als die von Hansa vorgeschlagene. Zitat:
|
Re: SQL -> Text mit ' einfügen ?
Zitat:
Delphi-Quellcode:
Aber Achtung ! Da sind noch zwei neue Fehler eingebaut und Delphi wird die nicht erkennen (können). String ohne Syntaxfehler ist eben String. Anders als der alte Fehler mit den ''. Wird das Dataset allerdings nicht selber von Hand bestückt, sondern per SQL-Generator und notfalls noch von Hand geändert, dann wird ein Fehler schon früh genug bemerkt, sogar ohne zu compilieren (active auf true setzen reicht schon). Danach besteht kein Grund mehr die vorhandenen TDataSet-Methoden wie Insert nicht zu benutzen und sie von Hand in den Source zu schreiben. :wall:
Q.SQL.Text := 'INSRT INTO Tabelle(Wert) VALUES(:pMeineParam';
Q.ParamByName('pMeineParam').AsString := 'An Klas'Kotten 10'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 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