我正在制作一个学校项目,包括创建数据库以及读取和写入数据库。在DataModule中,我使用TAdoCommand在运行时创建了数据库,该工作很有效,现在我需要读取和写入它。我使用访问权限将一些测试数据放入数据库,但无法读取数据库。
DataModule这是设计中数据模块的图片。我创建了一个连接在一起的连接,查询,数据源和表。 TAdoCommand用于创建数据库。查询中的SQL命令是" SELECT Username,Password 来自用户"
然后我有一个登录表单,我希望用它来读取带有数据库的Users表,以检查用户是否存在于数据库中。
procedure TLoginFrm.LoginBtnClick(Sender: TObject);
var Username, Password : String;
i, NoOfRecords : Integer;
IsMatch : Boolean;
begin
NoOfRecords := modFile.adoDataSet.RecordCount;
if NoOfRecords = 0 then
begin
NewUserFrm.Show;
Application.Messagebox('There are currently no users. Please create new user.','Error');
UsernameBox.Text := '';
PasswordBox.Text := '';
end
else
begin
IsMatch := False;
modFile.adoDataSet.First;
Username := modFile.adoDataSet.FieldByName('Username').AsString;
Password := modFile.adoDataSet.FieldByName('Password').AsString;
for i := 1 to NoOfRecords do
begin
if (Username = UsernameBox.Text) and (Password = PasswordBox.Text) then
begin
LoginFrm.Hide;
CurrentUser := Username;
MainMenuFrm.Show;
IsMatch := True;
end
else
begin
modFile.adoDataSet.Next;
Username := modFile.adoDataSet.FieldByName('Username').AsString;
Password := modFile.adoDataSet.FieldByName('Password').AsString;
end;
end;//End of for loop
if not IsMatch then
begin
Application.MessageBox('Incorrect username or password. Try again.','Error');
UsernameBox.Text := '';
PasswordBox.Text := '';
LoginBtn.SetFocus;
end;
end;//End of parent Else
end;
当我使用Access输入测试数据时,它会返回消息框"不正确的用户名或密码。再试一次"。因此它识别出表中有超过0个记录但是它无法读取实际数据。我哪里出错了?
答案 0 :(得分:1)
你For
循环在这里没有为你工作。相反,您需要以这种方式迭代数据集:
else
begin
isMatch := false;
modFile.AdoDataset.first;
while not modFile.AdoDataset.eof do
begin
Username := modFile.AdoDataset.fieldbyname('Username').asstring;
Password := modFile.AdoDataset.fieldbyname('Password').asstring;
if (uppercase(Username) = uppercase(UsernameBox.text)) and (uppercase(Password) = uppercase(PasswordBox.text)) then
begin
IsMatch := True;
LoginFrm.Hide;
CurrentUser := Username;
MainForm.Show;
Exit; // no need to continue on once you have a match
end;
modFile.AdoDataset.next;
end;
end
else ...
您也可以完全跳过使用循环并只使用定位
else
begin
isMatch := modFile.AdoDataset.Locate('Username;Password', VarArrayOf[UsernameBox.text, PasswordBox.text], [loCaseInsensitive]);// remove loCaseInsensitive if you prefer case sensitivity
if isMatch then
begin
CurrentUser := UsernameBox.text;
Loginfrm.Hide;
MainForm.Show;
end;
end;
答案 1 :(得分:-1)
似乎上述代码工作但是当通过Access将数据插入数据库时,Access将使用空格填充数据库中的剩余字符容差。 解决方案:在密码和用户名上使用Trim()函数,之后工作正常