所以我正在使用它:
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:无法对已关闭的数据集执行此操作'
如何在不使用功能的情况下验证所有这些?
答案 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作为变量的名称,这可能会导致混淆。