存储过程:
CREATE PROCEDURE checkpwd
(
 @ll_find int output,
 @username char(18),
 @pwd char(18),
 @duiname char(18)
 )
AS
SELECT  @ll_find = count(*)
FROM usert
WHERE username=@username and duiname=@duiname and pwd=@pwd
select @ll_find
GO
三层客户端代码
procedure TFrmLogin.Button2Click(Sender: TObject);
begin
DataModule1.checkpwd.Params.ParamByName('@username').AsString:=uname.Text;
DataModule1.checkpwd.Params.ParamByName('@pwd').AsString:=pwd.Text;
DataModule1.checkpwd.Params.ParamByName('@duiname').AsString:=duiname.Text;
DataModule1.checkpwd.Execute;
edit1.Text:=IntToStr(DataModule1.checkpwd.Params.ParamByName('@ll_find').AsInteger);
end;
其中,checkpwd是TClientDataset,对应的就是上面的存储过程。出现的问题是:
第一次按按钮,正常运行。如果密码(@pwd)正确,edit就显示1,如果密码不正确edit就显示0。但是,如果我再按一下按钮,就会出现异常,EDatabaseError没有找到参数@username.大哥门,我这两天急需解决这个问题。
而且execute换成open也是一样的情况。

解决方案 »

  1.   


    DataModule1.checkpwd.Close;
    ...
    DataModule1.checkpwd.Params.ParamByName('@username').AsString:=uname.Text;
    DataModule1.checkpwd.Params.ParamByName('@pwd').AsString:=pwd.Text;
      

  2.   

    建议在存储过程执行最后放入
    DataModule1.checkpwd.Close;
      

  3.   

    过程执行前要CLOSE啊,重复调用肯定报错
      

  4.   

    过程执行前要CLOSE啊,重复调用肯定报错
      

  5.   

    procedure TFrmLogin.Button2Click(Sender: TObject);
    begin
    DataModule1.checkpwd.Close;
    DataModule1.checkpwd.Params.ParamByName('@username').AsString:=uname.Text;
    DataModule1.checkpwd.Params.ParamByName('@pwd').AsString:=pwd.Text;
    DataModule1.checkpwd.Params.ParamByName('@duiname').AsString:=duiname.Text;
    DataModule1.checkpwd.Execute;
    edit1.Text:=IntToStr(DataModule1.checkpwd.Params.ParamByName('@ll_find').AsInteger);
    end;
    也8行的,一开始我就这样做的。