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

时间:2015-11-15 19:31:34

标签: 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 then begin
      Result := dbMarks.tblMarks.FieldByName('Password').AsString = edtPassword.Text;
      Exit;
    end;
    dbMarks.tblMarks.Next;
  end;
end;

我想从我的数据库中获取用户名和密码,然后验证输入的信息是否与数据库的信息匹配。如果我执行此代码,我会继续:'tblMarks:无法对已关闭的数据集执行此操作'

如何在不使用功能的情况下验证所有这些?

2 个答案:

答案 0 :(得分:3)

您必须确保数据集实际为Active。您无法对已关闭的操作执行操作。首先设置数据集属性Active := True

答案 1 :(得分:3)

如果tblMarks是一个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;

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