![]() |
AW: Spaß mit UPPERCASE / LOWERCASE ?
I Like! ;)
Ich würde empfehlen, immer auf beiden Seiten die DB Funktion zu nutzen, um eine "analoge" Funktion zu erhalten. Ein UpperCase auf der Spalte macht allerdings einen Index unbrauchbar und verlangsamt die Suche deutlich. Lösungen wären einerseits Expression Indizes wie schon gesagt, allerdings ist es meist nicht vertretbar, alle denkbaren Felder mit diesen Indizes zu versehen. Andererseits gibt es auch Lösungswege über erweiterte like Operatoren (ilike) und jenachdem auch spezielle Collations oder normalisierte Suchspalten. |
AW: Spaß mit UPPERCASE / LOWERCASE ?
Zitat:
|
AW: Spaß mit UPPERCASE / LOWERCASE ?
Zu schön wäre es, wenn jemand Parameter benutzen würde,
aber nocc toller wäre es, wenn endlich mal niemand mehr das QuoteStr für SQL-Statements benutzen täte, denn dafür ist es nicht da und auch noch total falsch.
Delphi-Quellcode:
Es ist hier zwar schwerer ein DROP DATABASE ins Edit zu schreiben, aber zumindestens kann man ganz leicht das SQL verrecken lassen (Syntaxfehler, mit nur einem einzigen \)
EdPfad.Text := 'E:\inPfad\';
SQL.Text := 'SELECT * FROM irgendwas WHERE sonstwas = ' + QuoteStr(EdPfad) + ' AND nochwas'; Einer unserer Kunden kam auf die geile Idee ' in Artikelnamen zu benutzen, was besonders toll Endete, als diese Strings von Delphi durch Python, zurück in PascalScript und zu PSQL wanderte. Teilweise mehrfaches Escaping mit unterschiedlichen Syntaxen (Pascal/Pythen/SQL). QuoteString kennt ausschließlich die Syntax von Pascal-Strings, also nur das '. |
AW: Spaß mit UPPERCASE / LOWERCASE ?
Hallo himitsu,
Zitat:
Vielen Dank für Deine Mühe! |
AW: Spaß mit UPPERCASE / LOWERCASE ?
Zitat:
Ein DropDatabase wäre leicht möglich (hat keiner gemacht). Aber die "bösen Franzosen" mit ihren ' in den Adressen ... |
AW: Spaß mit UPPERCASE / LOWERCASE ?
Zitat:
Delphi-Quellcode:
qryKD.Close;
qryKd.SQL.Text := sSQL + ' AND UPPER(Kd.Name1) LIKE UPPER(:KdName) ORDER BY Kd.Name1'; qryKD.Params[0].AsString := TRIM(edtName1.Text) + '%'; // oder über den Parameternamen: qryKD.ParamByName('KdName').AsString := TRIM(edtName1.Text) + '%'; qryKD.Open; |
AW: Spaß mit UPPERCASE / LOWERCASE ?
Danke, Delphi.Narium
und was bedeutet: Zitat:
|
AW: Spaß mit UPPERCASE / LOWERCASE ?
QuotedStr setzt die Hochkommata pascalkonform und nicht sqlkonform.
Oft passt das mit den ' aber nicht immer und bei dem "nicht immer" ist es möglich, durch geschicktes setzen der Hochkommata "so mal eben" in ein gültig aussehendes SQL weitere SQL-Statements einzufügen, mit denen man im "Idealfall" den gesamten Datenbestand ruinieren kann. Oder mal anders formuliert: Unter Zuhilfenahme von QuotedStr (bzw. dem Zusammenbau von SQLs durch das Zusammenfügen von Strings) kann man Schadcode in ein SQL einfügen und diesen dann per Open bzw. ExecSQL ausführen lassen. Bei der Nutzung von Parametern ist dies nicht möglich. Egal was man da in den Parameter "reinschiebt", es wird immer als Gesamtes (als Inhalt) in einem einzigen Wert interpretiert. Da QuotedStr nur das ' kennt, wird man mit QuotedStr bei allen Datenbanken, die auch noch was anderes als das ' unterstützen / verlangen, scheitern. |
AW: Spaß mit UPPERCASE / LOWERCASE ?
Guten Morgen Delphi.Narium,
vielen Dank für Deine ausführlichen Informationen! Das war sehr hilf- und lehrreich für mich! Da ich aber schon etliche hundert SQL Statements in dieser Form geschrieben habe, werde ich das in Zukunft so machen! Beste Grüße |
AW: Spaß mit UPPERCASE / LOWERCASE ?
QuoteStr:
Eine orgendliche SQL-Library sollte irgendwo eine Quote-/Escape-Funktion besitzen, welche die Sprache des entsprechenden SQL spricht. Wenn man nicht umher kommt und den SQL-Text zusammensetzen muß, entweder direkt oder mit Makros, dann sollte man eben auch die richtige Funktion benutzen. In PgDAC z.B. gibt es eine/zwei Funktion mit zuvielen Parametern, welche 'Strings' und "Bezeicher" behandeln kann. (über Ableitung oder ClassHelper kann man sich dann die Verwendung vereinfachen und sie zum leichtern Auffinden auch direkt an die Klassen der Conneecton oder des Query anhängen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 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