Delphi 出现奇怪的 ADO 数据库问题

Having weird ADO database issues with Delphi

对于我一直在处理的学校项目的问题,我真的很感激能得到一些帮助。你们认为可能有什么问题?
我和一位朋友谈过,他说我必须确保在任何给定时间我只有 1 table 的活动 属性 设置为 true。我试过了,但似乎没有什么不同。可能是我做的不对?

这是我的程序代码:

procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
  sNewPass,sOldPass:string;
begin
  sOldPass:= InputBox('Password verification','Please enter your current password','');

  if sOldPass = sPassword then
  begin
      sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
      if isPasswordValid(sNewPass) then
        begin
           tblUsers.Active := True;
            tblUsers.Edit;
            tblUsers.Filtered := True;

            tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword);
            tblUsers.First;
            tblUsers['Password'] := sNewPass;

            tblUsers.Post;
            tblUsers.Filtered := False;
            tblUsers.Filter := '';


          if bRememberMe then
            begin
              ShowMessage('Password changed, please log in again for security purposes');
              imgLogoutClick(Sender);
            end;

          sPassword := sNewPass;
        end
      else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
  end
  else ShowMessage('Incorrect Password');
end;

我得到的错误:

tblUsers: Dataset not in edit or insert mode

tblUsers.First 可能会导致滚动。我猜数据集发布在那个卷轴上。

在通过 tblUsers['Password'] := sNewPass; 分配新密码之前尝试调用 tblUsers.Edit

正如 MartynA 所建议的,还有另一个问题会阻止您的代码正常工作,即使上述问题已得到修复。 tblUsers.Filter := 'UserID = ' +QuotedStr(sPassword); 很可能不是您想做的。可能应该传递包含 UserID 的变量而不是 sPassword.

如果我没记错的话,应该有一个函数叫Locate。它也应该比过滤器更快。

您对 EditFilterFiltered 的使用都不正确。只有在实际编辑该行时才需要 Edit;光标(记录指针)位置的任何更改都将取消或 post 更改,使 table 退出编辑模式(因此您的错误)。

您也不应使用 Filter 搜索要编辑的数据。请改用 Locate。像这样的东西应该适合你(虽然它可能不是我在我自己的代码中使用的东西):

procedure TForm1.btnChangePassUserClick(Sender: TObject);
var
  sNewPass,sOldPass:string;
begin
  sOldPass:= InputBox('Password verification','Please enter your current password','');

  if sOldPass = sPassword then
  begin
    sNewPass := inputBox('Password change','Please enter a new Password with at least 1 number and letter','');
    if isPasswordValid(sNewPass) then
    begin
      tblUsers.Active := True;

      // I'd think the search should be on the UserID rather than
      // the password. Are you certain this is what you want to do?
      if tblUsers.Locate('UserID', sPassword, []) then
      begin
        tblUsers.Edit;
        tblUsers['Password'] := sNewPass;
        tblUsers.Post;
      end;
      tblUsers.Active := False;

      if bRememberMe then
      begin
        ShowMessage('Password changed, please log in again for security purposes');
        imgLogoutClick(Sender);
      end;

      sPassword := sNewPass;
    end
    else ShowMessage('Please ensure your password contains at least 1 letter and 1 number');
  end
  else 
    ShowMessage('Incorrect Password');
end;