存储过程:
CREATE PROCEDURE test
(
  @Total int output
)
AS  /* Statement1 */
  SELECT @Total = COUNT(*) FROM t  /* Statement2 */
  SELECT * FROM table  RETURN在vs.net里调试存储过程时,output窗口显示@Total有值,也返回了t表里面的所有记录。
但在程序里,执行完ExcuteReader()后,para["@Total"].Value始终没有值,而把Statement1去掉的话就得到正确值了。请问各位大哥这是什么问题啊?怎么解决呢?
Thx a lot!

解决方案 »

  1.   

    应该是"把Statement2去掉的话就得到正确的@Total值了".
      

  2.   

    你的目的是不是既返回para["@Total"].Value值又返回整个表的记录集呀?
      

  3.   

    就我这烂水平,就知道你的这句:SELECT * FROM table  中的"table"要与SQL关键字重合
    要改名。
    还顶一下!
      

  4.   

    那得查看 statement的用法先
      

  5.   

    把/* Statement1 */和/* Statement2 */换一个位置,然后先绑定DataGrid
    SqlConnection myConnection = new SqlConnection(con);
    SqlCommand myCommand = new SqlCommand ( "test", myConnection );
    myCommand.Parameters.Add ( new SqlParameter ("@Total ", 
    SqlDbType.Int ) ).Direction = ParameterDirection.Output;
    myConnection.Open();
    DataGrid1.DataSource = myCommand.ExecuteReader();
    DataGrid1.DataBind();
    myConnection.Clost();
    这样DataGrid就绑定了,
    然后得到output值
    int totalRecords = (Int) myCommand.Parameters["@Total"].Value;
    这样可以即绑定DataGrid又得到output值了
      

  6.   

    不是这样的,你即使去掉statement也不可能得到output参数,你可以查看所有msdn上和wrox书上的数据操作事例,他们在获得output参数的时候,都不约而同的使用在了更新,添加。删除等操作中,因为这些操作一般都会执行ExecuteNonQuery(),此时才能得到输出参数的值!如果你非要在查询情况下输出输出参数的话,执行ExcuteReader()是得不到数值的,必须在执行完ExcuteReader()之前或者之后执行ExcuteNonQuery()!楼主请尝试我的方法,应该能得到!
      

  7.   

    改正一下,尝试了一下 sunnystar365(一个人的天空) ( ) 的方法,的确可行,差点误导了楼主,罪过!
    不过要想像楼主那样不改变顺序,用我上面的方法就可以了!
      

  8.   

    非常感谢sunnystar365,问题已解决。
    原来问题就在于取这个output参数时,应该是在DataReader被绑定后取,而不能在ExcuteReader()执行后立即取。结贴前问多两个问题:1. 为什么两个statement要互换位置?我换不换也可以取到output值,是不是要在特定情况下才这样做?2. 问什么不能在ExcuteReader()执行后立即取output参数值?Many thx !
      

  9.   

    我经常用
    select @Total来代替output SqlDataReader dr = xxxx; while (dr.Read())
    tvSet.TVs.Add( PopulateTVFromIDataReader(dr) ); if (returnRecordCount) 
    {
    dr.NextResult(); dr.Read();
    tvSet.TotalRecords = (int) dr[0];
    } dr.Close();