Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL -> Text mit ' einfügen ? (https://www.delphipraxis.net/88228-sql-text-mit-einfuegen.html)

HolgerCW 12. Mär 2007 10:57

Datenbank: ORACLE • Version: 9 • Zugriff über: TDatabase

SQL -> Text mit ' einfügen ?
 
Hallo zusammen,

ich führe eine Insert-Anweisung so durch:

Delphi-Quellcode:
INSERT INTO Tabelle(Wert) VALUES(''' + Wert + ''')
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.

Gruss

Holger

Die Muhkuh 12. Mär 2007 10:59

Re: SQL -> Text mit ' einfügen ?
 
Hi Holger,

versuch mal:

SQL-Code:
INSERT INTO Tabelle(Wert) VALUES(' + QuotedStr(Wert) + ')

HolgerCW 12. Mär 2007 11:21

Re: SQL -> Text mit ' einfügen ?
 
Das hat geklappt. Vielen Dank

Gruss

Holger

Valeo Pupsus 15. Mär 2007 20:01

Re: SQL -> Text mit ' einfügen ?
 
Benutzen Parameter bitte. Oracle Shared Pool liebet das.
Delphi-Quellcode:
...
Q.Close;
Q.Clear;
Q.SQL.Text := 'INSERT INTO Tabelle(Wert) VALUES(:pMeineParam)';
Q.ParamByName('pMeineParam').AsString := 'An Klas'Kotten 10';
Q.ExecSQL;
...
[edit=r_kerber]Delphi-Tags eingefügt. Mfg, r_kerber[/edit]

Kedariodakon 15. Mär 2007 20:28

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

Hansa 16. Mär 2007 03:35

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:
Q.SQL.Text := 'jhlkkjhjkhkl';
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 ?

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.

Valeo Pupsus 16. Mär 2007 09:23

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.

Kedariodakon 16. Mär 2007 09:40

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

bttb930 16. Mär 2007 09:56

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:

Zitat von Hansa
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:
Q.SQL.Text := 'jhlkkjhjkhkl';
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 ?

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.


Hansa 16. Mär 2007 13:01

Re: SQL -> Text mit ' einfügen ?
 
Zitat:

Zitat von bttb930
Also... den Beitrag von Hansa halte ich für absoluten Schwachsinn!!!!

Muss man sich sowas hier anhören ? Schweinerei. :twisted: Du bist bei mir in dieser Frage disqualifiziert. :stupid: Zum Thema : natürlich soll er "Parameter" verwenden. Streng genommen sind das aber keine. Im konkreten Fall ist FieldByName wohl besser geeignet, weil als Funktionswert ein TField zurückgeliefert wird. Es geht schließlich lediglich um ein Tabellenfeld. Guck dir mal TParamByName genau an. Prinzip ist allerdings dasselbe. Jetzt kommt dann noch so etwas :

Delphi-Quellcode:
Q.SQL.Text := 'INSRT INTO Tabelle(Wert) VALUES(:pMeineParam';
Q.ParamByName('pMeineParam').AsString := 'An Klas'Kotten 10';
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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz