存储过程如下:
create procedure check
    @name nvarchar(20)=null,        --用户名
    @password nvarchar(10)=null,    --密码
    @result nchar(1) output         
as
    if exists( select * form table where name=@name and password=@password )
        set @result='a'
    else
        set @result='b'
go                                  --调试时为@result指定了一个null值
页面代码如下:
string result;//定义一个字符串变量接收输出参数
comm.Parameters.Add("@result",SqlDbType.Nchar,1);
comm.Parameters["@result"].Direction=ParameterDirection.Output;
......
//读取数据后
result=comm.Parameters["@result"].Value;
不知什么地方出问题,请指教!

解决方案 »

  1.   

    result=comm.Parameters["@result"].Value.ToString();
      

  2.   

    comm.CommandType = CommandType.StoredProcedure //此句漏了沒,默認的是 CommandType.Text
    comm.CommandText = "check";
      

  3.   

    result=comm.Parameters["@result"].Value.ToString();
    comm.CommandType = CommandType.StoredProcedure //此句漏了沒,默認的是 
    谢谢提醒,以上两句都有呀,还是不行。感觉好像问题出在存储过程中?
    急!
      

  4.   

    找到了问题,但是不太明白为什么。
    SqlDataReader dr=comm.ExecuteReader();
    result=comm.Parameters["@result"].Value.ToString(); 
    这样是可以的。
    但是,如果
    SqlDataReader dr=comm.ExecuteReader();
    if(dr.Read())
    {
        result=comm.Parameters["@result"].Value.ToString(); 
        ......
    }
    则会跳过去,也就是这个存储过程好像不能用read()方法,真是奇怪。
    哪位高人指点一下!
      

  5.   

    如果你要用 read() 的话,存储过程应该这样create procedure check
        @name nvarchar(20)=null,        --用户名
        @password nvarchar(10)=null,    --密码
        @result nchar(1) output         
    as
        DECLARE @str  NVARCHAR(1);
        if exists( select * form table where name=@name and password=@password )
           BEGIN
             SET @result='a'
             SET @str ='a'
           END
        else
          BEGIN
             set @result='b' 
             SET @str ='b'
          END
        SELECT  @str ;
    GO原因是你必须在存储过程中返回一个结果集,才能用 Read() 读取
    不知这样解释你能明白否
      

  6.   

    还有,提醒你一下,刚刚我拷过去发现以下问题if exists( select * form table where name=@name and password=@password )
    此句 错把from 写成 form check 与 table 都是关键字,以上代码,是通不过编译的,换成其它或是加上双引号
      

  7.   

    谢谢,我两天没有上csdn,想不到cityhunter172(寒羽枫)已经替我找到了问题的更深层的原因。
    -----cityhunter172(寒羽枫)
    原因是你必须在存储过程中返回一个结果集,才能用 Read() 读取
    不知这样解释你能明白否
    -----
    不好意思,我还是不太明白。因为我一直觉得,用SqlDataReader dr=comm.ExecuteReader();这样本来就会返回一个结果集,不知道我的理解错在哪里?
    而且有时候,如果是需要一个真正的结果集,只用SqlDataReader dr=comm.ExecuteReader();,然后在控件中绑定,会提示出错。好像是说,没有读取到内容什么的。
      

  8.   

    返不返回结果集,由你执行的 SQL 决定
    如 
          "Select 23 " --返回结果集,可用 comm.ExecuteReader();读取结果
          "delete table1 " --仅返回受影响的行数,可用 comm.ExecuteNonQuery();得到该行数也就是说,comm.ExecuteReader();本身并不会会返回一个结果集
    它只是执行 SQL 后读取由数据库产生的结果集,以下没有一条记录的也是结果集     select a,b from table1 where 1>2 因为它查询得出两个字段 a 与 b ,限于 1 > 2 永远为 false 才没有一条记录存在
      

  9.   

    谢谢cityhunter172(寒羽枫)
    刚刚看到,你的讲解直击问题的根本,使人有大梦初醒的感慨!
    揭贴并为你喝彩!
      

  10.   

    输出参数要这样定义:
     '为存储过程添加访问参数,并指定为输出类型,用于获取存储过程的输出结果
            Dim Result As New SqlParameter("@result", SqlDbType.NChar,1)
            Result.Direction = ParameterDirection.Output
            com.Parameters.Add(Result)