如何通过Delphi检查MS Access(数据库)中是否存在记录?

问题描述:

嗨我有一个德尔福7项目任务,我们需要包括一个登录系统。我有一个注册页面,数据发送到Access中的表格。现在,当用户需要登录时,需要检查他/她的信息是否存在,然后他将被授予进一步的权限,但不知道如何执行此操作。如何通过Delphi检查MS Access(数据库)中是否存在记录?

+3

先试,然后问。一路上至少必须有*你已经想出的东西。 – Sumurai8

+1

当然,你可以搜索如何使用Delphi和ADO与Access,并且至少拿出*某种*努力来自己做这件事。谷歌'delphi数据库教程',至少。 –

以来,它一直我升级到2005年的一段时间,所以我无法测试它的德尔福7,但在2005年德尔福和至少,你可以使用以下过程:

USES {$IFDEF UseParmsEvenThoughTheyAreNotNecessary } DB {$ELSE } StrUtils {$ENDIF } ,ADODB; 

FUNCTION CanLogIn(CONST UserName,Password : STRING ; CONST AccessDatabaseFile,TableName,UserField,PasswordField : STRING) : BOOLEAN; 
    VAR 
    Connection : TADOConnection; 
    DataSet : TADODataSet; 

    FUNCTION AccessConnStr(CONST FileName : STRING) : STRING; 
    BEGIN 
     {$IFDEF CPUX64 } 
     Result:='Provider=Microsoft.ACE.OLEDB.12.0;Data source='+FileName 
     {$ELSE } 
     Result:='Provider=Microsoft.Jet.OLEDB.4.0.0;Data Source='+FileName 
     {$ENDIF } 
    END; 

    {$IFNDEF UseParmsEvenThoughTheyAreNotNecessary } 
    FUNCTION QuotedStr(CONST STR : STRING) : STRING; 
     BEGIN 
     Result:=''''+ReplaceStr(STR,'''','''''')+'''' 
     END; 
    {$ENDIF } 

    BEGIN 
    Connection:=TADOConnection.Create(NIL); 
    TRY 
     Connection.ConnectionString:=AccessConnStr(AccessDatabaseFile); 
     TRY 
     Connection.Connected:=TRUE; 
     TRY 
      DataSet:=TADODataSet.Create(NIL); 
      TRY 
      DataSet.CommandType:=cmdText; 
      {$IFDEF UseParmsEvenThoughTheyAreNotNecessary } 
       DataSet.ParamCheck:=TRUE; 
       DataSet.Parameters.CreateParameter('UserName',ftString,pdInput,80,UserName); 
       DataSet.Parameters.CreateParameter('Password',ftString,pdInput,80,Password); 
       DataSet.CommandText:='SELECT * FROM ['+TableName+'] WHERE ['+UserField+']=:UserName AND ['+PasswordField+']=:Password'; 
      {$ELSE } 
       DataSet.ParamCheck:=FALSE; 
       DataSet.CommandText:='SELECT * FROM ['+TableName+'] WHERE ['+UserField+']='+QuotedStr(UserName)+' AND ['+PasswordField+']='+QuotedStr(Password); 
      {$ENDIF } 
      TRY 
       DataSet.Open; 
       TRY 
       Result:=NOT DataSet.EOF 
       FINALLY 
       DataSet.Close 
       END 
      EXCEPT 
       Result:=FALSE 
      END 
      FINALLY 
      DataSet.Free 
      END 
     FINALLY 
      Connection.Close 
     END 
     EXCEPT 
     Result:=FALSE 
     END 
    FINALLY 
     Connection.Free 
    END 
    END; 

参数:

UserName = Name of the user attempting to log in 
Password = Password of the user 
AccessDatabaseFile = The access database file 
TableName = The name of the table containing the UserName/Password for allowed users 
UserField = The name of the field in the above table that contains the user name 
PasswordField = The name of the field in the above table that contains the password for the user 

如果发生异常(找不到文件,错误的表名/字段名或你有什么),该功能捕捉这些并返回FALSE。只有当整个函数成功并且用正确的密码在表中找到用户时,该函数是否返回TRUE。

+2

即使这样做,使用参数总是正确的做法。作为额外的奖励,你不必做QuotedStr混乱! (FYI QuotedStr是Delphi中的一个函数) – whosrdaddy

+0

“Right”由谁的定义?当然不是我的。如果不仅“会是这样”(从SQL注入安全) - 是IS。我之前对人们提出过挑战,他们从来没有能够用这种类型的SQL语句构建来进行SQL注入。你可以吗? :-) – HeartWare

+0

请参阅http://www.sqlinjectionwiki.com/Categories.aspx?catId=6和http://www.securityfocus.com/archive/1/511061/30/8400/threaded,了解您的代码为什么是失败。 – Johan