Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Delphi检查MS Access(数据库)中是否存在记录?_Delphi_Login System - Fatal编程技术网

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

如何通过Delphi检查MS Access(数据库)中是否存在记录?,delphi,login-system,Delphi,Login System,嗨,我有一个Delphi7项目任务,我们需要包括一个登录系统。我有一个寄存器页,其中数据进入Access中的表。现在,当用户需要登录时,它需要检查他/她的信息是否存在,然后他将被授予进一步访问的权限,但不知道如何做到这一点。我升级到2005年及以后已经有一段时间了,因此我无法在Delphi 7上测试它,但在Delphi 2005及以后,至少可以使用以下过程: USES {$IFDEF UseParmsEvenThoughTheyAreNotNecessary } DB {$ELSE } StrU

嗨,我有一个Delphi7项目任务,我们需要包括一个登录系统。我有一个寄存器页,其中数据进入Access中的表。现在,当用户需要登录时,它需要检查他/她的信息是否存在,然后他将被授予进一步访问的权限,但不知道如何做到这一点。

我升级到2005年及以后已经有一段时间了,因此我无法在Delphi 7上测试它,但在Delphi 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。

先尝试,然后询问。在这一过程中,至少你已经了解了一些东西。当然,你可以搜索如何在Access中使用Delphi和ADO,并且至少自己先想出一些方法来实现这一点。至少谷歌“delphi数据库教程”。即使如此,使用参数始终是正确的做法。作为额外的奖励,你不必做QuotedStr乱七八糟的事!(仅供参考QuotedStr是Delphi中的一个函数)再次:为允许SQL注入的用户名和密码提供值。我过去挑战过的人中没有一个人能够做到这一点,除非得到证明,否则我坚持我的主张,这是不可能的……几点评论:Delphi中有一个内置的
QuotedStr
函数。上面的代码不受SQL注入的约束,因为它不使用
\'
来转义单引号。在非Unicode Delphi(例如7)中使用参数将破坏Unicode(
WideString
)参数。@再说一遍,我并不是说您的代码易受注入攻击,但您在“哦,我确定此查询不可注入”和“出于安全考虑,现在我必须使用参数”之间的界限在哪里?如果你总是使用参数,你不必提出这个问题,句号。我知道这是一个糟糕的编码实践(问问索尼和其他许多被黑客攻击的公司;)@whosrdaddy,告诉我。但是我们中的一些人没有时间/$将一个大型应用程序切换到一个现代的Delphi版本:/无论如何,如果Unicode不是一个问题,我肯定会在这种情况下使用参数,这是一个很好的做法。但是,因为没有使用参数而自动否决答案是错误的。特别是因为您无法证明上述答案受SQL注入的影响。HeartWare可以编辑他的答案并提出一个替代方案。