Delphi-PRAXiS

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:

Valeo Pupsus 16. Mär 2007 13:29

Re: SQL -> Text mit ' einfügen ?
 
>Hansa
hm..
Und was machst du, wenn musst du Insert/Update mit kompliziert Bedingungen verwirklichen?

Thanatos81 16. Mär 2007 13:36

Re: SQL -> Text mit ' einfügen ?
 
Bin zwar nicht Hansa, aber ich würde dann eine Stored Procedure in der DB anlegen, die die Bedingungen berücksichtigt und diese von Delphi aus mit Parametern füllen.

Valeo Pupsus 16. Mär 2007 14:10

Re: SQL -> Text mit ' einfügen ?
 
:)
Leider, koennen wir SP in Paradox, FoxPro und so weiter nicht schaffen..

mkinzler 16. Mär 2007 15:17

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

Zitat von Valeo Pupsus
:)
Leider, koennen wir SP in Paradox, FoxPro und so weiter nicht schaffen..

Hier gings aber um Oracle. :mrgreen:

Thanatos81 16. Mär 2007 15:19

Re: SQL -> Text mit ' einfügen ?
 
Falls es um neue Projekte geht, würde ich euch zu ner embedded Lösung eines "ordentlichen" SQL-RDBMS raten. Gerade Paradox ist hoffnunglos überaltet und macht z.B. unter Vista zumindest meinen Erfahrungen nach Probleme.

Falls es doch bei Paradox bleibt würde ich solche Inserts auch per Insert, FieldByName, Post usw. lösen, hab mit SQL in Verbindung mit Paradox eh keine guten Erfahrungen...

bttb930 16. Mär 2007 15:36

Re: SQL -> Text mit ' einfügen ?
 
Das Problem das Hansa verunsichert hat man bei allen Strings die nicht einfach eine Message nach draußen sind. Auch Dateinamen kann ich in einem String falsch schreiben. Dann kracht's halt auch. Also generell auf Strings verzichten??

Jedenfalls hat ein INSERT-Statement den Vorteil, dass man nicht erst die DB abfragen muss, um was einzufügen.

Hansa würde (wenn ich ihn richtig verstehe) das Dataset mit einer Tabelle verbinden, die dann öffnen, dann ein Append machen, Felder beschreiben und Post und Schließen. Ich würde INSERT bla INTO blub schreiben, die Parameter setzen und ausführen.

Bei Hansa würde im schlechtesten Fall erstmal bei Open der gesamte Tabelleninhalt an Delphi gepumpt. Nicht so toll. Bei INSERT eben nicht.

Hansa hat außerdem den Nachteil, dass er keine komplizierten Abfragen abschicken kann. Denn: Die müsste er ja in Strings verpacken... und oh Gott, da kann ein Fehler drin sein. Also nichts mit JOINs oder ähnlichem, der Compiler würde es ja nicht bemerken.

Deshalb habe ich Hansa's Argumentation mit "Schwachsinn" bezeichnet. Man kann auch a := b / c; schreiben. Ist c = 0 gibt auch das einen Fehler den der Compiler nicht bemerken wird. Sowas passiert - wenn man damit ein Problem hat, dann muss man ausreichend mit try-except arbeiten.

Jedenfalls bleibe ich dabei: Möchte ich nur Daten in eine Tabelle einfügen, dann ist das mit INSERT i.d.R. am besten.

Amen

Valeo Pupsus 16. Mär 2007 15:42

Re: SQL -> Text mit ' einfügen ?
 
ja,ja,ja...Freitag..Abend... :)

marabu 16. Mär 2007 15:54

Re: SQL -> Text mit ' einfügen ?
 
Privjet Val,

und herzlich willkommen in der Delphi-PRAXiS.

Hast schon Recht gehabt mit den Parametern. Das muss hier aber mindestens einmal pro Woche diskutiert werden, sonst sind wir nicht zufrieden.

Freundliche Grüße

Hansa 16. Mär 2007 18:34

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

Zitat von Thanatos81
Bin zwar nicht Hansa, aber ich würde dann eine Stored Procedure in der DB anlegen, die die Bedingungen berücksichtigt und diese von Delphi aus mit Parametern füllen.

Was glaubst Du denn, wie ich das konkret mache ? :mrgreen: bttb??? soll mal jetzt aber zuerst seinen fortgesetzten "Schwachsinn" erklären. Man stelle sich nämlich mal vor, die SP müsste auch noch im Source genauestens ohne Fehlerprüfung zur Designzeit als String zusammengesetzt und ausgeführt werden. Wie siehts bei 100 Zeilen SP und mehrfachem (((())))) aus ? Oder ''''''''' Wer sieht in maximal 10 Sek. die Fehler und kann sie auch in 1 Min. beseitigen ? @bttb??? : Fehler gefunden ? :shock: Dass Parameter benutzt werden sollen, da sind wir uns ja anscheinend einig, aber das beseitigt längst nicht alle sonstigen Design-Fehlerquellen in DB / Delphi.

Valeo Pupsus 17. Mär 2007 17:10

Re: SQL -> Text mit ' einfügen ?
 
In den meisten Fällen hat SQL Server ein "query cache"(Shared Pool im Oracle).
In der Regel: moechte den(cache) benutzen - benutzen Parametern im deine Ainfragern bitte. Das ist ganz einfach.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.

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