2012-07-13 5 views
2

Je voudrais créer un type de fenêtre de connexion dans Delphi. Malheureusement, je ne peux pas l'obtenir pour correspondre au nom d'utilisateur et mot de passe.Nom d'utilisateur et mot de passe de base de données dans Delphi?

J'ai une base de données .mdb de base, avec un tableau Utilisateurs. Dans cette table, il y a un nom d'utilisateur et un mot de passe. Je veux que Delphi vérifie le nom d'utilisateur et mot de passe dans la base de données et si elle correspond à ceux dans les boîtes d'édition, il va au prochain formulaire ou montre un message, sinon il ne fait rien. Quand j'entre la première ligne de la base de données, les valeurs de nom d'utilisateur et de mot de passe, j'obtiens le succès, mais avec le second, rien. J'ai l'impression que j'ai besoin d'un moyen de le faire passer aux valeurs de la deuxième rangée et de les vérifier et ainsi de suite. Il n'y a actuellement aucune relation dans la base de données.

Ceci est ma mise en page des données d'accès: ADOConnection -> ADOTable -> DataSource

Merci à l'avance!

+0

Pouvez-vous comprendre la structure de votre table et le code que vous utilisez pour valider l'utilisateur et le mot de passe? – RRUZ

+0

vous devriez mieux ne jamais stocker un mot de passe simple dans le db, mais utiliser un hash avec du sel (par exemple le nom d'utilisateur) ... –

+0

J'ai l'idée que l'OP pourrait penser que votre Hash with Some Salt était en fait un peu de nourriture , impliquant des pommes de terre. –

Répondre

1

Selon votre estimation, une solution peut être de déplacer l'enregistrement par enregistrement pour vérifier chacun d'eux. Exemple:

function MatchPass(Table: TADOTable; const Name, Pass: string): Boolean; 
begin 
    Result := False; 
    Table.First; 
    while not Table.Eof do begin 
    if Table.FieldByName('Username').AsString = Name then begin 
     Result := Table.FieldByName('Password').AsString = Pass; 
     Exit; 
    end; 
    Table.Next; 
    end; 
end; 

Peut-on appeler comme:

if MatchPass(ADOTable1, Edit1.Text, Edit2.Text) then 
    .. 


Une autre solution peut être de laisser la recherche ADOTable pour un enregistrement correspondant:

function MatchPass(Table: TADOTable; const Name, Pass: string): Boolean; 
begin 
    Result := Table.Locate('Username;Password', VarArrayOf([Name, Pass]), []); 
end; 
+0

Ne vaut-il pas mieux utiliser une phrase sql? – RRUZ

+0

@RRUZ - Je ne suis pas sûr que l'un ou l'autre ait un avantage significatif. Mais nous avons déjà un ADOTable comme indiqué dans la question. –

+0

Merci Sertac! Il n'y a aucune raison pour laquelle je devrais utiliser ADOTable, au lieu de ADOQuery. Donc, par curiosité, à quoi ressemblerait la déclaration SQL? – coder123

Questions connexes