Schreibe dir doch eine Stored Procedure, der du als Parameter den Benutzernamen übergibst und gleichzeitig über einen OUTPUT-Parameter das Passwort aus der
DB holst ...
Das hat folgende Vorteile ...
- dein Problem mit dem Refresh löst sich in Luft auf
- die durch
ADO gefetchte Datenmenge ist extrem klein (und somit schnell)
- du kannst tausende User Anlegen ohne das die "Abfrage" spührbar langsamer wird
- du sparst Locate bzw. Lookup in deiner ADOTable ... spart noch mal Zeit ...
[EDIT]
Kleines Beispiel
SQL SERVER ...
SQL-Code:
CREATE PROCEDURE GetPasswd
@Username varchar(20), -- Input Parameter, muss durch dein Prog übergeben werden
@Passwd OUTPUT varchar(20) -- da landet dein Passwort drin. Den Parameter kannst du mit Delphi auswerten
AS
-- Benutzertabelle abfragen und Variable @Passwd füllen
SELECT @Passwd = EncryptedPasswd
FROM Benutzertabelle
WHERE UPPER(FELD_Benutzername) = UPPER(@Username)
RETURN
GO
In Delphi ...
Delphi-Quellcode:
function Login(Username,Password:
String):boolean;
var SP: TAdoStoredProc;
pw:Variant;
begin
// ungetestet
// gibt true zurück wenn User und DB übereinstimmen
Result:=False;
// TADOStoredProc zur Laufzeit erstellen
SP := TAdoStoredProc.Create(
nil);
try
// SP mit deiner TADOConnection verbinden
SP.Connection := deine_Adoconnection;
// SP mit der Stored Procedure 'GetPasswd' verbinden
SP.ProcedureName := '
GetPasswd';
// Parameterlisten holen
SP.Parameters.Refresh;
// Input Parameter 'Username' füllen
SP.Parameters[1].Value := Username;
// SP ausführen und offen halten (nicht SP.Execute, da du den Output Parameter noch abfragen musst ...
SP.Open;
// Output Parameter aus SP lesen
pw:=SP.Parameters[2].Value;
// SP Schließen
SP.CLose
finally
// SP freigeben
FreeAndNil(SP);
end;
// Wenn der Benutzer nicht in der DB gefunden wurde ist der Output Parameter der SP = NULL
if vartype(pw) = vtNULL
then
begin
result:=false;
Showmessage('
Hi, dich kenne ich nicht... '+#13#10+
'
Wenn du neu bist melde dich bitte beim Admin !'+#13#10+
'
Falls du dich vertippt hast, versuche es noch einmal.');
exit;
end;
// vergleichen ob das Passwort aus der DB mit Password übereinstimmt ...
Result:= ((Decrypt(PW)=Password);
end;
[/EDIT]
Schöne Grüße,
Jens