存储过程
ALTER  procedure CheckUser
(
@logid varchar(50),
@pwd varchar(50),
@value varchar(50) output
)
as
select * from UserInfo where UserLogID=@logid and UserPwd=@pwd
set @value= @@rowcount
return @value我在程序中是
   SqlCommand cmd = new SqlCommand("CheckUser", cn);
            cmd.CommandType = CommandType.StoredProcedure;       
            cmd.Parameters.Add(new SqlParameter("@logid", logid));
            cmd.Parameters.Add(new SqlParameter("@pwd", pwd));
            SqlParameter returnvalue = new SqlParameter("@value", SqlDbType.Int, 4);
            returnvalue.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(returnvalue);
            count = Convert.ToInt32(cmd.Parameters["@value"].Value);       
            cmd.ExecuteNonQuery();
但是我获得传出值始终为0,为什么?是存储过程的问题还是程序的问题.

解决方案 »

  1.   

    先ExecuteNonQuery(),再取值。
    参数最好一致。@value   int   output
      

  2.   

    returnvalue.Direction   =  ParameterDirection.InputOutput; 
      

  3.   

    http://www.51ini.com/viewthread.php?tid=150&extra=page%3D1
    RetrunValue是在存储过程中通过return 关键字返回值的.在.net中必须指定其ParameterDirection.ReturnValue.并且如果你是用ExecuteDataReader()方法来执行存储过程的话,必须先关闭数据库连接对象,才能得到其值.
      

  4.   

    另外,你这么写sql语句容易被SQL注入式攻击
      

  5.   

    定义参数试试
    declare @value   int
    select   @value=count(*)   from   UserInfo   where   UserLogID=@logid   and   UserPwd=@pwd 
    select @value看看@value是0还是1
      

  6.   

    ALTER     procedure   CheckUser 

    @logid   varchar(50), 
    @pwd   varchar(50), 
    @value   varchar(50)   output 

    as 
    select   *   from   UserInfo   where   UserLogID=@logid   and   UserPwd=@pwd 
    set   @value=   @@rowcount 
    return   @value 如果用输出参数一般不用return了(我觉得返回值跟输出参数你没搞明白)
                            cmd.ExecuteNonQuery();// 这里应该先执行
    count   =   Convert.ToInt32(cmd.Parameters["@value"].Value);               
    //只用连接关闭后才能取值的
    count   =   Convert.ToInt32(cmd.Parameters["@value"].Value); 
      

  7.   

    嗯,我以前是直接按下面的方法写的
    ALTER           procedure       CheckUser   
    (   
    @logid       varchar(50),   
    @pwd       varchar(50),   
    @value       varchar(50)       output   
    )   
    as   
    select       *       from       UserInfo       where       UserLogID=@logid       and       UserPwd=@pwd   在程序中直接用int count=dr.cmd.executeReader();这样子执行,然后判断count的值
      

  8.   

    1\int   count=dr.cmd.executeReader();这样子执行,然后判断count2\set       @value=       @@rowcount   
    return       @value   如果用输出参数一般不用return了(我觉得返回值跟输出参数你没搞明白) 
    有什么区别?那个会更使用一些呢?
      

  9.   

    ALTER procedure CheckUser   
    (   
    @logid varchar(50),   
    @pwd varchar(50),   
    @value int output   
    )   
    as   
    select @value=count(*) from UserInfo where UserLogID=@logid UserPwd=@pwd  
    cmd.ExecuteNonQuery(); 
    count =cmd.Parameters["@value"].Value;   
      

  10.   

    返回值只能是整数int 型,而输出参数可以有int ,varchar等,简单的返回int 时用返回值就可以了,如果你要返回名字之类的肯定要用输出参数的!像你这个需求,2中方法都没必要用的,count(*)在前台用     int result=Convert.ToInt32(cmd.ExecuteScalar());就可以了
      

  11.   

    to cansum396 : 这样写是不会被防注入的string sql="select * from user where userid" + UserID  ...这样才有可能被注入ado.net有它自己的安全机制