使用Delphi数据库信息的登录表单

使用Delphi数据库信息的登录表单,delphi,Delphi,所以我用这个: procedure TfrmLogin.btnLoginClick(Sender: TObject); var Result:Boolean; begin Result := False; dbMarks.tblMarks.First; while not dbMarks.tblMarks.Eof do begin if dbMarks.tblMarks.FieldByName('Username').AsString = edtUsername.Text

所以我用这个:

procedure TfrmLogin.btnLoginClick(Sender: TObject);
var
  Result:Boolean;
begin
  Result := False;
  dbMarks.tblMarks.First;
  while not dbMarks.tblMarks.Eof do begin
    if dbMarks.tblMarks.FieldByName('Username').AsString = edtUsername.Text then begin
      Result := dbMarks.tblMarks.FieldByName('Password').AsString = edtPassword.Text;
      Exit;
    end;
    dbMarks.tblMarks.Next;
  end;
end;
我想从我的数据库中获取用户名和密码,然后验证输入的信息是否与数据库的信息匹配。如果我执行这段代码,我会不断得到:“tblMarks:无法在关闭的数据集上执行此操作”


如何在不使用函数的情况下验证所有这些内容?

您必须确保数据集实际处于活动状态。不能对已关闭的对象执行操作。首先设置数据集属性
Active:=True

如果tblMarks是一个TAdoTable,从您删除的注释中可以看出它是一个TAdoTable,或者其他TAdoxxx数据集,那么使用其Locate方法要比使用while循环在数据集中循环查找用户名和密码快得多,效率也更高。试试像这样的东西

[...]
begin

  if not dbMarks.tblMarks.Active then
    dbMarks.tblMarks.Open;
  Result := dbMarks.tblMarks.Locate('UserName', edtUsername.Text,   [loCaseInsensitive]);

  Result := Result and (edtPassword.Text = dbMarks.tblMarks.FieldByName('Password').AsString);

  if Result then begin
     // do whatever to log in the user, etc
  end;
[etc]
顺便说一句,将这样的代码放入ButtonClick处理程序是初学者的错误。ButtonClick处理程序最好调用执行实际检查的函数:

function TfrmLogin.LogIn(const UserName, Password : String) : Boolean;
begin
  if not dbMarks.tblMarks.Active then
    dbMarks.tblMarks.Open;
  Result := dbMarks.tblMarks.Locate('UserName', edtUsername.Text,   [loCaseInsensitive]);
  Result := Result and (edtPassword.Text = dbMarks.tblMarks.FieldByName('Password').AsString);
end;

注意,在函数中,identifier Result是函数名的别名,因此最好不要在其他地方使用Result作为变量名,这可能会导致混淆。

您需要将结果设置为全局变量,或者将此过程的所有代码块移动到返回所需布尔值的函数中。不要忘记,以纯文本形式存储密码会带来安全风险。至少,对它们进行散列。你所说的“如何在不使用函数的情况下验证所有这些”是什么意思?