![]() |
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'; |
Re: SQL -> Text mit ' einfügen ?
>Hansa
hm.. Und was machst du, wenn musst du Insert/Update mit kompliziert Bedingungen verwirklichen? |
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.
|
Re: SQL -> Text mit ' einfügen ?
:)
Leider, koennen wir SP in Paradox, FoxPro und so weiter nicht schaffen.. |
Re: SQL -> Text mit ' einfügen ?
Zitat:
|
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... |
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 |
Re: SQL -> Text mit ' einfügen ?
ja,ja,ja...Freitag..Abend... :)
|
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 |
Re: SQL -> Text mit ' einfügen ?
Zitat:
|
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 07:48 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