Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 登录显示错误消息_Database_Delphi_Login_Filter - Fatal编程技术网

Database 登录显示错误消息

Database 登录显示错误消息,database,delphi,login,filter,Database,Delphi,Login,Filter,我需要我的程序让用户从数据库登录。这需要一个潜水员号码(比如用户名)和一个已经存在于数据库中的密码。不幸的是,我现在不懂SQL,宁愿使用与我在这里所做的类似的技术。我在运行时收到一条错误消息,上面说:adotblDiversInfo:无法在关闭的数据集上执行此操作。非常感谢您事先的帮助(: 这是我的代码: procedure TfrmHomeScreen.btnLogInClick(Sender: TObject); var iDiverNumber : Integer; sPasswo

我需要我的程序让用户从数据库登录。这需要一个潜水员号码(比如用户名)和一个已经存在于数据库中的密码。不幸的是,我现在不懂SQL,宁愿使用与我在这里所做的类似的技术。我在运行时收到一条错误消息,上面说:adotblDiversInfo:无法在关闭的数据集上执行此操作。非常感谢您事先的帮助(: 这是我的代码:

procedure TfrmHomeScreen.btnLogInClick(Sender: TObject);
var
  iDiverNumber : Integer;
  sPassword, sKnownPassword : String;
  bFlagDiverNumber, bFlagPassword, Result : Boolean;
begin
  iDiverNumber := StrToInt(ledDiverNumber.Text);
  sPassword := ledPassword.Text;
  with frmDM do
    adotblDiversInfo.Filtered := False;
    frmDM.adotblDiversInfo.Filter := 'Diver Number' + IntToStr(iDiverNumber);
    frmDM.adotblDiversInfo.Filtered := True;
    if frmDM.adotblDiversInfo.RecordCount = 0 then
      ShowMessage(IntToStr(iDiverNumber) + ' cannot be found')
    else
      begin
        sKnownPassword := frmDM.adotblDiversInfo['Password'];
        if sKnownPassword = sPassword then
          ShowMessage('Login successful')
       else
          ShowMessage('Incorrect password. Please try again');
      end;
end;

您遇到的错误是因为您在尝试访问数据集之前忘记打开该数据集。请在尝试使用该表之前使用
frmDM.adotbdiversinfo.open;
frmDM.adotbdiversinfo.Active:=True;
执行此操作

如果稍加修改,您的代码可能会更简单(更快)。与其过滤整个数据集,只需查看您是否可以
找到相应的记录

procedure TfrmHomeScreen.btnLogInClick(Sender: TObject);
var
  iDiverNumber : Integer;
begin
  if not frmDM.adoTblDiversInfo.Active then
    frmDM.adoTblDiversInfo.Open;

  iDiverNumber := StrToInt(ledDiverNumber.Text);
  sPassword := ledPassword.Text;
  if frmDM.adoTblDiversInfo.Locate('Diver Number', iDiverNumber, []) the
  begin
    if frmDM.adoTblDiversInfo['Password'] = ledPassword.Text then
      ShowMessage('Login successful')
    else
      ShowMessage('Invalid password. Please try again.');
  end
  else
    ShowMessage(ledDiverNumber.Text);
end;

您的问题与SQL无关。错误消息的意思是,您试图对一个数据集执行的操作在您打开该数据集(数据集)之前是无效的。您应该在q中提到错误发生在哪一行,这样读者就不必猜测了。顺便说一句,避免使用“with”就像瘟疫一样。另外,您不应该声明名为
Result
的变量。即使它不是关键字,但它对函数有特殊用途。在过程中声明自己的变量可能会造成混乱。另外:您使用的是纯文本密码吗?!谢谢大家的回复(:Craig,我甚至不知道为什么会有结果。错误发生在运行时而不是设计时,因此我不完全确定如何提及哪一行,MartynA。是的,我使用的是纯文本密码,birger。啊,好的,听起来你的项目好像没有打开调试信息编译器选项,否则当出现异常时s、 IDE会把你带到你的项目中的确切行,在那里是有。如何打开它们与Delphi版本有点不同,所以最好在OLH中查找。一旦你有了,在点击处理程序的第一行上放置一个断点,然后在bp跳闸时使用F8单步执行。非常感谢你!这非常有用helpful@kelly字体我意识到他的答案是你的第一个答案,但这是一个好主意,通过点击勾号图标,养成像Ken的答案一样接受有用答案的习惯。接受答案会增加你自己的代表性以及答案的代表性,从而帮助你清除一些限制,从而强制新用户可以做什么。