procedure TForm3.Button1Click(Sender: TObject);
begin
 with dm2.query1 do
 begin
 close;
 sql.clear;
 sql.add('select * from 用户表1');
 sql.add('where 用户名=:usename');
 sql.add('and 密码=:password');
 parambyname('usename').Asstring:=edit1.text;
 parambyname('password').AsString:=edit2.Text;
 prepare;
 open;
 user_type:=fieldbyname('用户类型').Value;
 name:=fieldbyname('用户名').Value;
 end;
 if dm2.query1.recordcount=0 then
      showmessage('登录失败,请重新登录!')  else
 begin
  with dm2.StoredProc1 do
  begin
   params[0].AsString:=name;
   params[1].AsString:=user_type;
   params[2].AsString:='用户登陆';
   prepare;
   execproc;
  end;
  end;
   showmessage('登录成功!');
  end;
end.

解决方案 »

  1.   

    open后面是不是应该跟一个execsql啊???
      

  2.   

    是哪里出错呀?
     我觉得是不是
       params[0].AsString:=name;
       params[1].AsString:=user_type;
       name,user_type是否定义,是否为空
    其他地方我实在看不出那还可能出错
      

  3.   

    procedure TForm3.Button1Click(Sender: TObject);
    begin
     with dm2.query1 do
     begin
     close;
     sql.clear;
     sql.add('select * from 用户表1');
     sql.add('where 用户名=:usename');
     sql.add('and 密码=:password');
    >>>>>>   ^^^在and前面加一个空格
     parambyname('usename').Asstring:=edit1.text;
     parambyname('password').AsString:=edit2.Text;
     prepare;
    ^^^^^^^^^没必要,浪费服务器端的资源
     open;//以下有问题,此序反了,应该是先判断recordcount是否>0,然后才去读值
     user_type:=fieldbyname('用户类型').Value;
     name:=fieldbyname('用户名').Value; end;
     if dm2.query1.recordcount=0 then
          showmessage('登录失败,请重新登录!')  else
     begin
      with dm2.StoredProc1 do
      begin
       params[0].AsString:=name;
       params[1].AsString:=user_type;
       params[2].AsString:='用户登陆';
                                 ^^^^错别字哦 ^_*
       prepare;
       execproc;
      end;
      end;
       showmessage('登录成功!');
    //此段语句有逻辑问题,最后始终会县是登录成功,哪怕刚才显示了登录失败
      end;
    end.
      

  4.   

    name和user_type是我定义的两个全局变量,没有符初值,好象是
        params[0].AsString:=name;
       params[1].AsString:=user_type;
    这两句语句有问题,可我该怎么写呢
      

  5.   

    是不是这两句有问题
     user_type:=fieldbyname('用户类型').Value;
     name:=fieldbyname('用户名').Value;
    编译的时候可以通过,可是在运行时,因为没有把值符给name和user_type而导致在给存储过程符的值是空值,使系统出错,我是这么觉得的,有另一种方法来实现上面两句的功能吗