Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sql Befehle mit Parametern absetzen (https://www.delphipraxis.net/42388-sql-befehle-mit-parametern-absetzen.html)

badrulecracker 18. Mär 2005 09:50

Datenbank: Mysql • Version: 4.0 • Zugriff über: ZeosLib

Sql Befehle mit Parametern absetzen
 
Hi,

ich habe mir nach einigen Schwierigkeiten die Zeos Komponente installieren können. Nun bin ich ganz eifrig dabei, meine Mysql Verbindung zu erstellen.

Bei dem Auslesen aus der Datenbank kommt mir doch leider ein Fehler auf. Ich weiss nicht genau wieso, deshalb hier am besten mal der Quellcode
Delphi-Quellcode:

Userauth.SQL.Clear;
Userauth.SQL.Text := 'SELECT `Benutzername`,`Passwort` FROM `user` WHERE `Benutzername` = '':usr'';';
Userauth.Params.Clear;
Userauth.Params.CreateParam(ftString,'usr', ptInput);
Userauth.ParamByName('usr').AsString := User.Text;

Userauth.ExecSQL;
Egal ob ich :usr in Hochkommata setze, wie hier oder ganz ohne, das Erebnis aus Userauth.sql.text ist immer:

SELECT `Benutzername`,`Passwort` FROM `user` WHERE `Benutzername` = ':usr';

Er übernimmt leider die Eingabe aus User.text nicht. Ich wollte mal fragen, wieso nicht?
Oder gibt es da eine andere möglichkeit solche sachen zu übergeben.
Mit
'WHERE `Benutzername` = '''+User.text+''' funktionniert es leider auch nicht richtig, außerdem finde ich das ein wenig umständlich.

Hat da jemand eine Idee?

Mfg, brc

RavenIV 18. Mär 2005 09:59

Re: Sql Befehle mit Parametern absetzen
 
warum benutzt du die property "SQL" und "Params" gemeinsam?

ich schreibe das ganze SQL-statement immer in Sql.Text:
Delphi-Quellcode:
query.Sql.Text := 'SELECT * FROM tabelle WHERE feld LIKE ''abc'';';
die "Params" hab ich noch nie gebraucht...

gruessle

nieurig 18. Mär 2005 10:00

Re: Sql Befehle mit Parametern absetzen
 
Hi,
ich kenne die ZEOS Bibliothek nicht aber:

1.) Versuchmal im SQL Statement die Hochkomma um den Parameternamen wegzulassen.
2.) Ich denke auch das .Clear und .CreateParam kann weg. Zumindest bei den ADOQuery wird mit dem Setzen des Statements eine neue Parameterliste erzeugt und man kann den Parametern sofort Werte zuweisen.

Viel Erfolg
Niels

@RavenIV: Parameter sind meiner Meinung nach die bessere Lösung. Besonders wenn man auf Datumsfelder zugreift muss man sich nicht selbst um die unterschiedliche Schreibweise kümmern.

RavenIV 18. Mär 2005 10:01

Re: Sql Befehle mit Parametern absetzen
 
hab noch was gefunden:
bist du sicher, dass dein statement funktioniert?
...WHERE feld = ''abc''...

versuch das mal in der SQL-console.

gruessle

alcaeus 18. Mär 2005 10:02

Re: Sql Befehle mit Parametern absetzen
 
So gehts:

Delphi-Quellcode:
Userauth.SQL.Clear;
Userauth.SQL.Text := 'SELECT `Benutzername`,`Passwort` FROM `user` WHERE `Benutzername` = :usr;';
Userauth.ParamByName('usr').AsString := User.Text;
Userauth.ExecSQL;
Das schöne an Params ist, dass du dich nicht um Hochkommata und ähnliches kümmern muss :)

Greetz
alcaeus

badrulecracker 18. Mär 2005 10:13

Re: Sql Befehle mit Parametern absetzen
 
Hi,

@alcaeus:
showmessage(userauth.sql.text);
ergibt:
SELECT `Benutzername`, `Passwort` FROM user WHERE `Benutzername` = :usr;

:(
Eigentlich sollte er mir doch ausgeben:
SELECT `Benutzername`, `Passwort` FROM user WHERE `Benutzername` = das_was_ich_eingegeben_habe;

@nieurig:
Ist es nicht von SQL zwangsweise vorgegeben, dass man den String in Hochkommata schreibt?
Clear und CreateParam kann man weglasse habe ich festgestellt, allerdings macht es leider keinen Unterschied, was das Ergebnis betrifft...:-/

RavenIV 18. Mär 2005 10:17

Re: Sql Befehle mit Parametern absetzen
 
warum schreibst du nicht einfach:
Delphi-Quellcode:
Userauth.SQL.Text := 'SELECT `Benutzername`,`Passwort` FROM `user` WHERE `Benutzername` = ' + User.Text + ';';
ich mach das immer so und es klappt hervorragend.

meiner meinung nach sind die params nur aus der steinzeit übrig geblieben, man benötigt sie nicht mehr.

gruessle

Igotcha 18. Mär 2005 10:26

Re: Sql Befehle mit Parametern absetzen
 
Also ich verstehe das Problem nicht, da schon die "gute" Lösung gezeigt wurde ;-)

Ich mache das immer so:

Delphi-Quellcode:
 MainForm.AIOSZQR0.SQL.Text:='SELECT * FROM sys_user WHERE u_username=:username AND u_password=:password';
    MainForm.AIOSZQR0.ParamByName('username').AsString:=Edit1.Text;
    MainForm.AIOSZQR0.ParamByName('password').AsString:=strPass;
    MainForm.AIOSZQR0.Open;
So kannst du auch 10 Parameter im SQL-Statement haben, ohne über irgendwelche "'" zu stolpern.

Gruß Igotcha

Martoeng 18. Mär 2005 10:30

Re: Sql Befehle mit Parametern absetzen
 
Hi,

also ich mache es immer folgendermaßen:

Delphi-Quellcode:
Userauth.SQL.Text := 'SELECT Benutzername, Passwort FROM user WHERE Benutzername = ' + quotedstr(User.Text);
oder, wenn ich nur nach einem Teilstring suche:

Delphi-Quellcode:
Userauth.SQL.Text := 'SELECT Benutzername, Passwort FROM user WHERE Benutzername LIKE ' + quotedstr('%' + User.Text + '%');
Klappt völlig problemlos!


@Raven:

Zitat:

Userauth.SQL.Text := 'SELECT `Benutzername`,`Passwort` FROM `user` WHERE `Benutzername` = ' + User.Text + ';';
^^Das dürfte nicht klappen, weil sql den Inhalt von User.text so als Feldnamen versteht, oder ?!

MfG

Martoeng

alcaeus 18. Mär 2005 10:34

Re: Sql Befehle mit Parametern absetzen
 
Zitat:

Zitat von Martoeng
^^Das dürfte nicht klappen, weil sql den Inhalt von User.text so als Feldnamen versteht, oder ?!

Genau.

Zitat:

Zitat von badrulecracker
@alcaeus:
showmessage(userauth.sql.text);
ergibt:
SELECT `Benutzername`, `Passwort` FROM user WHERE `Benutzername` = :usr;

Ja klar. Dein SQL sieht so aus. Bei der Ausführung mit ExecSQL werden dann die Parameterwerte eingefügt.
So kannst du z.B. 10000 Records oder einfügen, musst aber nur ein mal das SQL zusammenbauen. Danach musst du nur noch die Parameter setzen :)

Greetz
alcaeus

RavenIV 18. Mär 2005 10:41

Re: Sql Befehle mit Parametern absetzen
 
Zitat:

Zitat von alcaeus
Ja klar. Dein SQL sieht so aus. Bei der Ausführung mit ExecSQL werden dann die Parameterwerte eingefügt.
So kannst du z.B. 10000 Records oder einfügen, musst aber nur ein mal das SQL zusammenbauen. Danach musst du nur noch die Parameter setzen :)

aha.
wieder was gelernt ;-)
dann muss ich das doch glatt mal ausprobieren...

gruessle

Jelly 18. Mär 2005 10:58

Re: Sql Befehle mit Parametern absetzen
 
Zitat:

Zitat von RavenIV
warum schreibst du nicht einfach:
Delphi-Quellcode:
Userauth.SQL.Text := 'SELECT `Benutzername`,`Passwort` FROM `user` WHERE `Benutzername` = ' + User.Text + ';';
ich mach das immer so und es klappt hervorragend.gruessle

Und was meinst passiert aus deinem SQL Befehl, wenn User.Text selbst Hochkommata ' enthält :roll:

badrulecracker 18. Mär 2005 11:42

Re: Sql Befehle mit Parametern absetzen
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von Martoeng
^^Das dürfte nicht klappen, weil sql den Inhalt von User.text so als Feldnamen versteht, oder ?!

Genau.

Zitat:

Zitat von badrulecracker
@alcaeus:
showmessage(userauth.sql.text);
ergibt:
SELECT `Benutzername`, `Passwort` FROM user WHERE `Benutzername` = :usr;

Ja klar. Dein SQL sieht so aus. Bei der Ausführung mit ExecSQL werden dann die Parameterwerte eingefügt.
So kannst du z.B. 10000 Records oder einfügen, musst aber nur ein mal das SQL zusammenbauen. Danach musst du nur noch die Parameter setzen :)

Greetz
alcaeus

Soetwas habe ich mir schon gedacht...
Stimmt habe es jetzt nochmal mit

showmessage(inttostr(userauth.rowsaffected));

ausprobiert und es funktioniert tatsächlich...:) vielen dank!
Die Variante mit den Parametern ist doch wesentlich komfortabler als mit den ganzen Hochkommata gedönse..

mfg, brc

Hansa 18. Mär 2005 12:03

Re: Sql Befehle mit Parametern absetzen
 
Langer Thread, obwohl alcaeus die Lösung schon früh gezeigt hat. 8) Deshalb noch ein Tip : benutze die Komponente SQLMonitor, um mal nachzusehen, was jetzt genau von der Datenbank verlangt wird. Ist insbesondere sehr hilfreich wegen der Klammern usw. Zumindest Schreibfehler oder falsch gesetzte Parameter lassen sich so leicht lokalisieren.

P.S.: Zeos wird die ja wohl haben ? :shock:

Stevie 18. Mär 2005 12:26

Re: Sql Befehle mit Parametern absetzen
 
Zitat:

Zitat von Hansa
P.S.: Zeos wird die ja wohl haben ? :shock:

Aber sicher!!! :???:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 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 by Thomas Breitkreuz