【问题标题】:Having weird ADO database issues with DelphiDelphi 遇到奇怪的 ADO 数据库问题
【发布时间】:2023-03-04 00:55:02
【问题描述】:

对于我一直在做的一个学校项目的问题,我非常感谢一些帮助。大家觉得哪里有问题?
我与一位朋友交谈,他说我必须确保在任何给定时间我只有一个表的活动属性设置为 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:数据集未处于编辑或插入模式

【问题讨论】:

    标签: delphi delphi-7 ado


    【解决方案1】:

    您对EditFilterFiltered 的使用均不正确。仅在实际编辑行时才需要Edit;光标(记录指针)位置的任何更改都将取消或发布更改,从而使表格脱离编辑模式(从而导致您的错误)。

    您也不应该使用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;
    

    【讨论】:

    • 您好,非常感谢。在您发布此内容之前,我对 ADO 的理解似乎有所欠缺,但现在我完全理解了一切:)。是的,我认为当我决定使用密码进行过滤时,我有点脑残;我确实改变了它,但它一定是在我的代码的不同版本中。非常感谢您的帮助,它现在运行良好。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多