Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage mit Sonderzeichen (https://www.delphipraxis.net/26064-sql-abfrage-mit-sonderzeichen.html)

djmasi 17. Jul 2004 14:08


SQL-Abfrage mit Sonderzeichen
 
Hallo Leute,

sitze gerade an ner kleinen DB (Firebird). Meine Abfrage funktionieren eigentlich wunderbar, ausser die Abfragebedingung enthält Sonderzeichen wie z.B. ein '. :gruebel:

Delphi-Quellcode:
procedure TFMain.DoQuerySong(Field: String;Node: TTreeNode);
var
  SQL: String;
begin
  //main sql query
  Screen.Cursor := crSQLWait;
  SQL := 'select * from SONG ';
  SQL := SQL + 'inner join ARTIST on ARTIST.ID = SONG.ARTIST_ID ';
  SQL := SQL + 'inner join SONG_DETAIL on SONG_DETAIL.SONG_ID = SONG.ID ';
  SQL := SQL + 'inner join GENRE on GENRE.ID = SONG.GENRE_ID ';
  SQL := SQL + 'inner join LANGUAGE on LANGUAGE.ID = SONG.LANGUAGE_ID ';
  SQL := SQL + 'where '+ Field + ' = ''' + Node.Text + ''' order by SONG';
  ...
Das ist ein Teil meiner Abfrage, die ich dynamisch an ein TpFIBDataSet sende. Aufgerufen wird das ganze hier:
Delphi-Quellcode:
  if Node.Parent = NdArtists then
  begin
    PGenre.Hide;
    PQuery.Align := alClient;
    DoQuerySong('ARTIST.ARTIST', Node);
    PQuery.Show;
    Exit;
  end;
Wenn aber z.B. ein Artist wie "Lil' Kim" abgefragt wird, ist ja das ' zu viel. Rauslassen kann ich's ja aber auch net. Hat vielleicht jemand 'ne Idee?

Danke

mschaefer 17. Jul 2004 14:17

Re: SQL-Abfrage mit Sonderzeichen
 
Moin, moin

Du bist völlig in Delphi aufgegangen! Nun ist SQL keine Wirth- oder Borland-Entwicklung,
deshalb tausche das ' in der SQL gegen ein " aus.

Delphi-Quellcode:
  'where '+ Field + ' = "' + Node.Text + '"' + Order ;
Ist wirklich etwas leidlich...

Grüße // Martin

djmasi 17. Jul 2004 14:24

Re: SQL-Abfrage mit Sonderzeichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Normalerweise sollte es so gehen, aber nach Deinem Vorschlag bekam ich die angehängte Fehlermeldung
:wall:

Bernhard Geyer 17. Jul 2004 14:28

Re: SQL-Abfrage mit Sonderzeichen
 
Das mit den ' als Trenner als Texttrenner für SQL passt schon.
Dein Problem ist eher das ein ' in einem String den String-Abschluß "zerstört".

Das kannst Du umgehen, indem Du mit Parametern arbeitest (Oder deinen String "Escapest", ist aber von DB zu DB unterschiedlich). Im Forum findest Du genug beispiele, wenn Du nach SQL + Parameter suchst.

Auch bist Du damit gegen SQL-Injection geschützt.
Wenn jetzt jemand nach "Text'; DROP TABLE <Deine Tabelle>;" sucht, so hast Du damit evtl. ein größeres Problem. 8)

djmasi 17. Jul 2004 15:00

Re: SQL-Abfrage mit Sonderzeichen
 
Also hab das mit den Params ausprobiert - ohne Erfolg :(

Delphi-Quellcode:
  SQL := SQL + 'where '+ Field + ' =:search order by SONG';

  with DMMedia.DSSong do
  begin
    Close;
    SelectSQL.Clear;
    ParamByName('search').AsString := Node.Text;
    SelectSQL.Add(SQL);
    Open;
Jetzt bekomme ich die Meldung, dass Parameter "search" nicht in DSSong existiert. Ich hab's auch schon davor geschrieben aber das selbe. Im OI von DSSong gibt es keine Params-Eigenschaft. Laut einem Beitrag von Sharky geht es aber so. Hmm

Bernhard Geyer 17. Jul 2004 15:29

Re: SQL-Abfrage mit Sonderzeichen
 
Tausch mal die SQL-Zuweisung und die Parameterzuweisung

Delphi-Quellcode:
  SQL := SQL + 'where '+ Field + ' =:search order by SONG';

  with DMMedia.DSSong do
  begin
    Close;
    SelectSQL.Clear;
    SelectSQL.Add(SQL);
    ParamByName('search').AsString := Node.Text;
    Open;
Ohne SQL-Anweisung kann es auch keine Parameter geben.

djmasi 17. Jul 2004 15:34

Re: SQL-Abfrage mit Sonderzeichen
 
Ach man manchmal könnte ich mich selber... :wall:

Mit etwas Verstand hätte man das ja sehen müssen. Naja bei 35° sollte man doch lieber am See sein...
:thuimb: Also danke nochmal für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 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