下面是我自己写的代码:procedure TForm1.Button2Click(Sender: TObject);
var
sqlstr:string;
begin
  sqlstr:='select name from pswd where name = ''' + edit1.Text + '''';
  adoquery1.Close;
  adoquery1.SQL.Clear;
  adoquery1.SQL.Add(sqlstr);
  adoquery1.Open;
  if adoquery1.RecordCount >0 then
    begin
      sqlstr:='select pass from pswd where pass = ''' + edit2.Text + '''';
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add(sqlstr);
      adoquery1.Open;
      if adoquery1.RecordCount >0 then
        begin
        form2.Show;
        form1.Hide;
        edit1.Clear;
        edit2.Clear;
        end
      else
        showmessage('密码错误!');
      end  else
    showmessage('用户名错误!');
end;环境:delphi7 Access2003才学没多久,只能想到这些,但这样写问题很多.
问题1: 如果里数据库表里面有多个用户名和密码,比如说AB两套用户名和密码,这样就会出现A的用户名用B的密码也能登陆.问题2: 输入用户名和密码后在后面如果再在后面加上空格,程序判断是正确的,照样能登陆.其他问题还没发现,希望高手帮忙指点一下,改怎么写,谢谢了!!!

解决方案 »

  1.   

    第二个查询改为
    'select pass from pswd where name = ''' + edit1.Text + ''' pass = ''' + edit2.Text + ''''
      

  2.   

    用户名和密码不是应该一条记录么? 那么就 where name = ''' + edit1.Text + '''' and pass = ''' + edit2.Text + ''''
    不就好了?有空格理论上是不应该相同的啊,你是不是做了Trim之类的操作?
      

  3.   

    第二个查询改为 
    'select pass from pswd where name = ''' + edit1.Text + ''' and pass = ''' + edit2.Text + ''''
      

  4.   

    你不会直接
    'select name from pswd where name = ''' + edit1.Text + ''' and pass = ''' + edit2.Text + '''';
    啊?
    干嘛要分开来写?
    然后只要
    if adoquery1.IsEmpty then //表示没记录
      ShowMessage('用户名/密码错误!');
      

  5.   

    按照kernelj 的方法解决了第二个问题,谢谢了...但第一个问题的空格判断的改怎么写啊?
      

  6.   

    回caize131没做任何 Trim之类的操作,数据库字段属性是文本型的,感觉好象对后面的空格不做判断似的。
      

  7.   

    数据库字段用 字符串型(varchar)不是更好吗?
      

  8.   

    不能像你这样写,你可能是这样想的:
      先查询存在该用户名的记录,然后再查询这些用户名中的该密码是不是输入的密码。
      但是,你的ADOQuery事实上是执行了两次查询,它不会在你第一次查询的结果中执行第二次的查询。如一楼OK:
    'select pass from pswd where name = ''' + edit1.Text + ''' pass = ''' + edit2.Text + ''''
      

  9.   

    过滤掉空格就可以了。两个查询分别改为。
    'select name from pswd where name = ''' + trim(edit1.Text) + '''''select pass from pswd where name = ''' + trim(edit1.Text) + ''' and pass = ''' + trim(edit2.Text) + ''''
      

  10.   

    谢谢几楼上几位的解答!
    查询已经按照kernelj改过来了,避免了问题1的错误,想问问kernelj过滤掉空格改怎么做啊,谢谢了!!
      

  11.   


    过滤掉空格就可以了。两个查询分别改为。 
    'select name from pswd where name = ''' + trim(edit1.Text) + '''' 就应该这样查询呀,我也学会了谢谢
    ================================================================