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

时间:2018-01-10 13:30:29

标签: database delphi delphi-xe

我正在制作一个学校项目,包括创建数据库以及读取和写入数据库。在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个记录但是它无法读取实际数据。我哪里出错了?

2 个答案:

答案 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()函数,之后工作正常