在 Delphi 中从 DataModule 读取和写入 .accdb 文件

Reading and writing .accdb file from DataModule in Delphi

我正在制作一个学校项目,其中包括创建数据库以及读取和写入数据库。在 DataModule 中,我使用 TAdoCommand 在 运行 时间内创建了数据库,效果很好,现在我需要读取和写入它。我使用访问将一些测试数据放入数据库,但它无法读取数据库。

DataModule 这是设计中的数据模块的图片。我创建了一个连接、查询、数据源和 table,它们都链接在一起。 TAdoCommand 用于创建数据库。查询中的SQL命令为“SELECT用户名,密码 来自用户

然后我有一个登录表单,我希望用它来读取用户 table 和数据库以检查用户是否存在于数据库中。

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 输入测试数据时,它 returns 消息框 "Incorrect username or password. Try again"。所以它认识到 table 中有超过 0 条记录,但是它无法读取实际数据。我哪里错了?

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;