要使用
 cmd.Parameters["@p_value"].Direction=ParameterDirection.ReturnValue;
则要修改你的存储过程
CREATE   procedure sp1  @leibie nchar(18),@p_value decimal output
as
declare @num intselect @num=count(*) from sjwjb
where 客户类型=@leibieselect @p_value=@num/90009
return @p_value ----------添加这个如果不修改存储过程

cmd.Parameters["@p_value"].Direction=ParameterDirection.ReturnValue;
改为
cmd.Parameters["@p_value"].Direction=ParameterDirection.Output;

解决方案 »

  1.   

    恩 
    还少了一点 
    如果修改了你的存储过程的
    你的程序中对储存过程的参数应该有三个才行
    @leibie,@p_value 是其中的两个 还要加一个@ret(随便起的名)作为返回值之用对应的程序修改如下:
    cmd.Parameters.Add(new SqlParameter("@leibie",SqlDbType.NChar,18));
    cmd.Parameters.Add(new SqlParameter("@p_value",SqlDbType.NChar,18));
    cmd.Parameters.Add(new SqlParameter("@ret",SqlDbType.NChar,18));

    cmd.Parameters["@leibie"].Value=str1;
    cmd.Parameters["@p_value"].Direction=ParameterDirection.Output;
    cmd.Parameters["@ret"].Direction=ParameterDirection.ReturnValue;
    这时得到p用下面两种方式均可
    string p=cmd.Parameters["@p_value"].Value.ToString();
    or
    string p=cmd.Parameters["@ret"].Value.ToString();
      

  2.   

    恐怕不是那么简单啊,我分别用cmd.Parameters["@p_value"].Direction=ParameterDirection.ReturnValue;
    cmd.Parameters["@p_value"].Direction=ParameterDirection.Output做了修改(存储过程也做了相应的修改),可是运行时由MessageBox.Show(Convert.ToString(i))得到的对话框却显示“非数字”(在此次提问之前时,我在存储过程中也曾用过“return @p_value”也是得到这个结果),这是怎么回事
      

  3.   

    MessageBox.Show(Convert.ToString(i)) ???哪里的另外
    按照你的存储过程
    CREATE   procedure sp1  @leibie nchar(18),@p_value decimal output
    .....@p_value你是做为decimal声明的
    首先要把
    cmd.Parameters.Add(new SqlParameter("@p_value",SqlDbType.NChar,18));
    改为
    cmd.Parameters.Add(new SqlParameter("@p_value",SqlDbType.Decimal));