初学DELPHI,很多地方不懂,最近被一个问题困扰了很久,望各位大虾相助!写一个用户登陆部件,根据用户输入的ID和密码,搜索数据库判断,如果正确就返回UserNO,不正确就返回0存储过程如下:
CREATE PROCEDURE spLogin
(
@parUserID varchar(50),
@parUserPwd varchar(50)
)
AS
DECLARE @UserNO int
DECLARE @Row int SELECT @UserNO=UserNO
FROM TUser
WHERE UserID=@parUserID
AND UserPwd=@parUserPwd
IF(@UserNO=0)
RETURN 0
         SELECT @Row=@@Rowcount
   IF(@Row>0)
RETURN @UserNO
GO1.本人使用ADOStoredProc组件,在设置Parameters属性时,参数的Value一栏不知如何填,我试着为参数@parUserID和=@parUserPwd填上Edit1.text和Edit2.text,但还有一个@return_Value就不知如何填了。2.在代码方面就这样写,不知对不对,
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.ParamByName('@parUserID').value:=edit1.text;
ADOStoredProc1.Parameters.ParamByName('@parUserPwd').value:=edit2.text;
ADOStoredProc1.Prepared:=true;
ADOStoredProc1.ExecProc;
但如何取得过程返回的UserNO或0呢?    这个问题是很菜,但已经快要把我搞到发疯了。希望各位大虾搭救一下,不胜感激!(最好详细点)再谢!

解决方案 »

  1.   

    只要你的数据库和存储过程连接好了,参数里面自动就加入了存储过程里的参数,不用你来管
    也不要设置
    Delphi代码:
    with ADOStoredProc1 do
    begin
      close;
      Parameters.ParamValues['@paruserID'] := edit1.text;
      Parameters.ParamValues['@paruserpwd'] := edit2.text;
      ExecProc;
    end;最后郑重说明:你的存储过程写的糟糕啊
    CREATE PROCEDURE spLogin
    (
    @parUserID varchar(50),
    @parUserPwd varchar(50)
    )
    AS
    Declare @values varchar(20),
    @counts int
    SELECT UserNO,@counts = count(*) 
    FROM TUser
    WHERE UserID=@parUserID
    AND UserPwd=@parUserPwd
    if @counts = 0
    @values = '0'
    else
    @values = UserNo

    Select @values
    GO
    试一下(我还没试,不知道对不)
      

  2.   

    对了
    在Select userNo,@sconts = count(*) 前加:set nocount no
    在select @values 前加:set nocount off
      

  3.   

    感谢回复!
    只是,在代码方面如何取得这个@values值?
      

  4.   

    //一个例子
    with form1.adostoredproc1 do
       begin
          close;
          procedurename:='mywage';
          parameters.Clear;
          parameters.CreateParameter('@lnmonth',ftInteger,pdinput,8,0);
          Parameters.ParamByName('@lnmonth').Value :=mm-1;
          try
             open;            except
             Application.MessageBox('连接数据库失败','系统提示',mb_OK);
             Application.Terminate;
          end
       end;----------------存储过程:mywage--------------------------
    CREATE PROCEDURE mywage   @lnmonth int
    AS
    select a.nameid,a.name,(year(getdate())-year(a.workage)+1)*5 as gl,b.dagz,b.gjj,b.ydj,
       case a.rank 
          when '技术员' then 20 
          when '助工' then 50 
          when '工程师' then 80 
          when '高工' then 100 
       end as zz
    from human a left join wage b on a.nameid=b.nameid and b.wagemonth=@lnmonth
    GO
      

  5.   

    楼主使用 RETURN 来返回值是可以的,不一定必须要使用 SELECT,而且是有区别的,RETURN 表示存储过程的返回值,而 SELECT 表示的是返回一个结果集,虽然这个结果集只有一行和一列。
    RETURN 返回的使用存储过程的参数来处理,这个参数的类型是返回值类型的,存储过程执行完成之后,就可以获取这个参数值,这个参数中已经存放了存储过程的返回值了。SELECT 需要 OPEN 这个结果集,按照 DATASET 来处理。
      

  6.   

    感谢CloneCenter(复制中心)的讲解!
    小弟最想知道的是取返回值的那一条语句怎样写!