procedure Tcheckuserform.BitBtn1Click(Sender: TObject);
begin
  if logintimes>0 then
  begin
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select * from operator2 where name=:name');
    ADOQuery1.Parameters.Items[0].Value:=Edit1.Text;
    ADOQuery1.Open;
    if (ADOQuery1.RecordCount=1) and (ADOQuery1.FieldByName('loginpass').AsString=Edit2.Text) then
    begin
      logintimes:=0;
      self.Hide;
      MainForm:=TMainForm.Create(Application);
      MainForm.ShowModal;
    end
    else
    begin
      if logintimes=1 then
      begin
        MessageDlg('三次用户名或密码输入错误,程序将关闭,请重新启动程序',mtinformation,[mbok],0);
        ADOQuery1.Close;
        self.Close;
      end;
      MessageDlg('用户名或密码错误,请检查!',mtinformation,[mbok],0);
      Edit1.SetFocus;
    end;
    logintimes:=logintimes-1;
  end;
end; 
 
  连接的MS SQL2000。测试连接正常,但是输入正确的用户和密码就提示用户或者密码错误。我的表很简单:
operator2    列名:name      数据类型:varchar  长度:50
             列名:loginpass 数据类型:varchar  长度:50
logintime是用来判断用户在3次密码或者用户名有错后系统将关闭的,初始值是3,用户或者密码错一次logintime就减1

解决方案 »

  1.   

    这样吧,你加一个调试语句
    再提示“用户名或密码错误,请检查”前加一句
    ShowMessage(Edit2.Text+'<>'+ADOQuery1.FieldByName('loginpass').AsString);看看Show出来的有没有什么不对
      

  2.   

    我写的是这样的
    adoquery1.sql.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('select * from user where name=:uname and ps=:pword');
    adoquery1.parameters.parambyname('uname').value:=edit1.text;
    adoquery1.parameters.parambyname('pword').value:=edit2.text;
    adoquery1.open;if adoquery1.isempty then
     begin
      applicatin.messagebox('用户或密码错误','提示信息',MB_OK+MB_ICONSTOP);
      edit1.clear;
      edit2.clear;
      edit1.setfocus;
     end
    else
     showmessage('success');
    end;
      

  3.   

    你把工程打包发给我,我帮你看一下[email protected]
      

  4.   

    三个基本的常识性错误
    1、logintimes没有初始化
    2、ADOQuery1.RecordCount=1模式判断有很大问题,如果用户名没有会出现很多莫名其妙的错误,因为你是通过参数查询的
    3、没有退出机制,仅仅是窗口隐藏
      

  5.   

    这是全部的代码:unit unt_CheckUser;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, Buttons, SkinCaption, WinSkinData;type
      Tcheckuserform = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        SkinData1: TSkinData;
        SkinCaption1: TSkinCaption;
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure Edit1Change(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      checkuserform: Tcheckuserform;
      logintimes:Integer;implementationuses Main;{$R *.dfm}procedure Tcheckuserform.BitBtn1Click(Sender: TObject);
    begin
      if logintimes>0 then
      begin
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('Select * from operator2 where name=:name');
        ADOQuery1.Parameters.Items[0].Value:=Edit1.Text;
        ADOQuery1.Open;
        if (ADOQuery1.RecordCount=1) and (ADOQuery1.FieldByName('loginpass').AsString=Edit2.Text) then
        begin
          logintimes:=0;
          self.Hide;
          MainForm:=TMainForm.Create(Application);
          MainForm.ShowModal;
        end
        else
        begin
          if logintimes=1 then
          begin
            MessageDlg('&Egrave;&yacute;&acute;&Icirc;&Oacute;&Atilde;&raquo;§&Atilde;&ucirc;&raquo;ò&Atilde;&Uuml;&Acirc;&euml;&Ecirc;&auml;&Egrave;&euml;&acute;í&Icirc;ó&pound;&not;&sup3;&Igrave;&ETH;ò&frac12;&laquo;&sup1;&Oslash;±&Otilde;&pound;&not;&Ccedil;&euml;&Ouml;&Oslash;&ETH;&Acirc;&AElig;&ocirc;&para;&macr;&sup3;&Igrave;&ETH;ò',mtinformation,[mbok],0);
            ADOQuery1.Close;
            self.Close;
          end;
          ShowMessage(Edit2.Text+'<>'+ADOQuery1.FieldByName('loginpass').AsString);
          MessageDlg('&Oacute;&Atilde;&raquo;§&Atilde;&ucirc;&raquo;ò&Atilde;&Uuml;&Acirc;&euml;&acute;í&Icirc;ó&pound;&not;&Ccedil;&euml;&frac14;ì&sup2;é&pound;&iexcl;',mtinformation,[mbok],0);
          Edit1.SetFocus;
        end;
        logintimes:=logintimes-1;
      end;
    end;procedure Tcheckuserform.BitBtn2Click(Sender: TObject);
    begin
      self.Close;
    end;procedure Tcheckuserform.Edit1Change(Sender: TObject);
    begin
      if Edit1.Text<>'' then
      begin
        BitBtn1.Enabled:=True;
      end
      else
      begin
        BitBtn1.Enabled:=False;
      end;
    end;procedure Tcheckuserform.FormShow(Sender: TObject);
    begin
      Edit1.SetFocus;
      ADOConnection1.Connected:=False;
      ADOConnection1.LoginPrompt:=False;
      ADOConnection1.Connected:=True;
      BitBtn1.Enabled:=False;
      logintimes:=3;
    end;end.
      

  6.   

    是不是ADOQuery1.RecordCount=1判断出错?ShowMessage(IntToStr(ADOQuery1.RecordCount));试试
      

  7.   

    程序我收到了,因为没有装SQL,所以用Access数据库模拟了一下,至少在判断方面程序没有错误估计是你数据库里面的字段含有空格了改为Trim(ADOQuery1.FieldByName('loginpass').AsString)=Trim(Edit2.Text)来判断试试
      

  8.   

    还有就是,你用hide将主程序隐藏了,这样你关闭MainForm时必须将主程序关闭,否则你的应用程序根本结束不了。
      

  9.   

    如果你加了Trim还是不行的话,你建一个Access数据库来测试一下,还有问题你将Access数据库发到我邮箱。
      

  10.   

    可能是你数据库里面的字段含有空格,但是你用眼睛很难看出来所以一般都会用Trim函数将字符串首尾的空格去掉后再判断的显然'test '和'test'根本不相同,只有去除空格才相同。
      

  11.   

    还有就是,你用hide将主程序隐藏了,这样你关闭MainForm时必须将主程序关闭,否则你的应用程序根本结束不了。
    怎么解决呢?具体点,我菜鸟,刚学不久
      

  12.   

    简单点的处理方法是,你在MainForm的OnClose事件里面添加一个CheckUserForm.Close;