[Delphi] waarde uit een db in een variabele

Pagina: 1
Acties:

  • Dreamstar
  • Registratie: Maart 2000
  • Laatst online: 11-03 10:34
Ola,

Ik heb een (volgens mij heel klein probleem) waar ik niet uit kom. Zit hier al een uur of 4 te zoeken, en kan niks bruikbaars vinden.

Ik heb een programma waarin men moet inloggen, en op basis daarvan moet gekeken worden of die persoon admin. rechten heeft binnen dat programma.
De database ziet er zo uit : username, password, real-name, admin (ja/nee)

Maar hoe krijg ik mijn progsel dus zo ver dattie op basis van user/pass het goeie record selecteerd, het goeie veld (das nog niet zo moeilijk) alleen daarna moet het in een variabele gepropt worden zodat het programma er verder mee kan werken.

Het selecteren lukt me wel, gewoon Tquery en een fatsoenlijke sql query is ook het probleem niet, maar hoe duw ik dus die ene waarde in een variabele ?

Kan iemand me een schopje in de goede richting geven ?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Zoiets: variabele := query.FindField('admin').AsBoolean;

[ Voor 39% gewijzigd door cameodski op 26-03-2004 16:09 ]

Never underestimate the power of


  • whoami
  • Registratie: December 2000
  • Nu online
Kijk eens naar de databank componenten binnen Delphi, kijk eens hoe je een SQL query kunt maken binnen delphi, kijk hoe je parameters kunt gebruiken binnen die query.
(Ok, dat kan je dus al).
Kijk vervolgens naar de member's van die TQuery (bv. FieldByName()) en doe dit:
code:
1
sNaam := MyQuery.FieldByName ('veldnaam').AsString;

https://fgheysels.github.io/


  • Dreamstar
  • Registratie: Maart 2000
  • Laatst online: 11-03 10:34
Sorry voor de late reactie, maar was vergeten om et zooitje code + de db door te mailen naar huis, dus heb et hele weekend niks kunnen doen. (ivm verjaardag te lui om het ff opnieuw te doen)

Ik heb bovenstaande optie's geprobeerd, beide lijken me behoorlijk logische optie's. Ik krijg alleen bij beide optie's dezelfde foutmelding :
Project project1.exe raised exception class EDBEngine Error with message 'General SQL Error'.
[Microsoft][ODBC Microsoft Access Driver]Too few parameters. Expected 1.'. Process stopped.
Use Step or Run to continue.
De code van dat stuk ziet er als volgt uit :
code:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
var name, pw, sqlquery: string;
    admin_rechten : boolean;
begin
   Query1.sql.Clear;
   name := invoer_naam.Text;
   pw := invoer_wachtwoord.Text;
   sqlquery := 'select * from naam where username = '''+name+''' and password =  '''+pw+''';' ;
   Query1.SQL.Add(sqlquery);
   Query1.Active := true;
   admin_rechten := query1.FieldByName('adminrechten').Asboolean;
end;


Nu zit ik me dus af te vragen waar ik verkeerd zit. Het veld adminrechten is aanwezig, die heeft ook een waarde, dus das denk ik het probleem niet. de var admin_rechten staat als boolean, dit klopt ook. Als ik die fieldbyname opdracht probeer zonder .Asboolean geeft hij ook direct aan dat ik 2 verschillende types gebruik, boolean & tstring dus hij ziet de verschillende soorten wel. Tijden het compileren krijg ik ook nergens foutmeldingen op.

Ziet iemand hier toevallig nog ergens een fout in ?

thnx iig voor de tot nu toe geboden oplossingen.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Er zit waarschijnlijk een fout in je query. Bekijk wat je query is vlak voor dat je Active := True doet. Gebruik ook eerst eens simple query zonder where clause. Controleer of je tabel en velden wel echt bestaan.

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Nu online
Waarom gebruik je trouwens geen parameters in je query ipv die where clause dmv string concatenation op te bouwen:

code:
1
2
Query1.SQL.Text := 'SELECT * FROM tabel WHERE naam = :p_Naam';
Query1.ParamByName ('p_Naam').AsString := textBox1.Text;


Zo heb je geen gedoe meer met escaping etc....

(Ik denk trouwens dat password wel eens een keyword kan zijn. Dan kan je 2 dingen doen: of je geeft die kolom een andere naam, of je zet blokhaken rond je veldnamen:
code:
1
select * from tabel where [username] = 'blaat' AND [password] = 'blaat'

[ Voor 39% gewijzigd door whoami op 29-03-2004 10:44 ]

https://fgheysels.github.io/


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
Ik zie een paar dingen die je in ieder geval kan veranderen.

code:
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
var name, pw, sqlquery: string;
    admin_rechten : boolean;
begin
   Query1.sql.Clear;
   name := invoer_naam.Text;
   pw := invoer_wachtwoord.Text;
   sqlquery := 'select * from naam where username = '''+name+''' and password =  '''+pw+''';' ;

De var sqlquery heb je niet nodig. Gebruik:
code:
1
Query1.SQL.Text := 'select * from naam where username = :name and password = :pw';

En je ziet direct nummer 2: Gebruik van parameters.
Met
code:
1
2
Query1.ParamByName('name').asString := name;
Query1.ParamByName('pw').asString := pw;

wordt de code overzichtelijker.

Gebruik
code:
1
Query1.Open

in plaats van active := true;

En tot slot zou ik geen select * doen. Maar select Adminrechten.


O, en nog één puntje:
Wat denk je dat er gebeurt als ik als de volgende naam en pw invoer? ;)
code:
1
2
name := 'SysRq or SysRq = SysRq'
pw   := 'SysRq or SysRq = SysRq'

-


  • whoami
  • Registratie: December 2000
  • Nu online
SysRq schreef op 29 maart 2004 @ 10:54:

O, en nog één puntje:
Wat denk je dat er gebeurt als ik als de volgende naam en pw invoer? ;)
code:
1
2
name := 'SysRq or SysRq = SysRq'
pw   := 'SysRq or SysRq = SysRq'
Door gebruik te maken van parametrized queries, omzeil je dit; alle quotes ed zullen nl. ge-escaped worden.

https://fgheysels.github.io/


  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
whoami schreef op 29 maart 2004 @ 11:00:
[...]


Door gebruik te maken van parametrized queries, omzeil je dit; alle quotes ed zullen nl. ge-escaped worden.
:) Dat bedoelde ik ook, zoals het nu opgelost is (dus in de textregel zonder params) kan het fout gaan.

-


  • Dreamstar
  • Registratie: Maart 2000
  • Laatst online: 11-03 10:34
Ok, het werkt nu.

Heb een showmessage erin gezet, en door die test kwam dus naar voren dat de query wel aangepast wordt (sqlquery dus) alleen daar zat blijkbaar een fout in, zodat de TQuery niet meer active gezet kon worden. De fouten kwam daar dus vandaan.

Heb de procedure even herschreven, en nu krijg ik nergens foutmelding meer op.

De code ziet er nu zo uit :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var name, pw : string;
    admin_rechten : boolean;
begin
   name := invoer_naam.Text;
   pw := invoer_wachtwoord.Text;
   Query1.SQL.Clear;
   Query1.SQL.Text := 'select adminrechten from naam where gebruikersnaam = :gebruikersnaam and wachtwoord = :gebruikerswachtwoord';
   Query1.ParamByName('gebruikersnaam').asString := name;
   Query1.ParamByName('gebruikerswachtwoord').asString := pw;
   Query1.Open;
   admin_rechten := query1.FieldByName('adminrechten').Asboolean;
end;

Moet ik alleen nog ff kijken hoe ik die boolean op mijn scherm krijg :P

Thnx iig O+ :*

  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
Vergeet de query1.close niet :)

[ Voor 8% gewijzigd door SysRq op 29-03-2004 14:40 ]

-


  • Dreamstar
  • Registratie: Maart 2000
  • Laatst online: 11-03 10:34
Mja, is dat eigenlijk hard nodig ?
Het werkt nu, en deze query wordt alleen in et begin van het programma gebruikt om dus te kijken of een user admin rechten heeft of niet. Op basis van die true/false wordt beslist welk scherm hij voor zich moet krijgen. Dan zit je dus in het daadwerkelijke programma.

  • whoami
  • Registratie: December 2000
  • Nu online
Dreamstar schreef op 29 maart 2004 @ 15:01:
Mja, is dat eigenlijk hard nodig ?
Ja, van zodra je de query niet meer nodig hebt, sluit je hem, zodat de resources die toch niet meer nodig zijn, kunnen vrijgegeven worden.
In een multi-user omgeving zou je zelfs je connectie moeten sluiten van zodra je ze een tijdje niet meer nodig hebt. Op die manier heb je geen onnodige connecties naar de DB (remember licentie-kosten), en worden er geen onnodige resources verspild.
Door gebruik te maken van connection-pooling kan -bij het openen van een connectie- een reeds bestaande connectie uit de pool gehaald worden. Daardoor heb je de kost niet om een connectie te maken.

https://fgheysels.github.io/


  • Dreamstar
  • Registratie: Maart 2000
  • Laatst online: 11-03 10:34
Daar heb je idd een punt, met die licentiekosten. Het resources verhaalt moet ik sowieso nog naar kijken, et ding is me op dit moment een beetje aso m.b.t. geheugengebruik.

Ik heb naast die regel code waar het progsel de variabele admin_rechten moet vullen ff een 2de regel erbij geprakt waarin hij dus true of false in een string moet zetten, en daarna een showmessage die die "nieuwe" variabele weergeeft. Alleen showmessage geeft dus een leeg scherm. Zou dit aan de conversie van boolean naar string kunnen zitten, of is het waarschijnlijker dat hij gewoon de waarde niet goed uit de DB trekt ?

  • SysRq
  • Registratie: December 2001
  • Laatst online: 07:59
code:
1
2
3
4
if adminrechten then
  Showmessage('true')
else
  ShowMessage('false')

-


  • Dreamstar
  • Registratie: Maart 2000
  • Laatst online: 11-03 10:34
LOL, daar had ik dus nog niet aan gedacht. Ik zat te zoeken naar een vervanger van showmessage.
* Dreamstar denkt dattie gaat proberen om NU naar huis te gaan. Et hok waar ik in zit is te warm om logisch in te denken.

Et lag dus aan het omzetten van boolean naar string.
Pagina: 1