Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: Zwei Anwendungen, eine Datenbank - Synchronisieren???

  Alt 14. Feb 2005, 01:47
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
  Mit Zitat antworten Zitat