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