public SqlDataReader ExecuteDataReaderByPage(string connect, string procName,ref int records,ref int pages, params object[] parameterValues)
    {
          SqlParameter[] commandParameters = GetParameters(connect, procName, parameterValues);
        SqlCommand cmd = PrepareCommand(connect, CommandType.StoredProcedure, procName, commandParameters);    
    try
        {
           
            SqlDataReader dr = cmd.ExecuteReader();
            records = Int32.Parse(cmd.Parameters[2].Value.ToString());
            pages = Int32.Parse (cmd.Parameters[3].Value.ToString ());
            cmd.Parameters.Clear();
            cmd.Dispose();
            return dr;
        }
        catch (Exception e)
        {
            //异常 写入日志
            EventLog.WriteEntry("ExecuteNoQueryError", e.Message, EventLogEntryType.Error);
        }
        return null;
    }这个方法执行时 数据是对的 
  但是2个返回值没取到值  我在数据库中用同样的参数 可以得到返回值  
   pages = Int32.Parse (cmd.Parameters[3].Value.ToString ());这里得不到值 是怎么回事 ???
  

解决方案 »

  1.   

    存储过程没有问题
      测试过    SqlParameter[] commandParameters = GetParameters(connect, procName, parameterValues); 
        查找存储过程参数 并赋值
            SqlCommand cmd = PrepareCommand(connect, CommandType.StoredProcedure, procName, commandParameters);    
        装配命令
      

  2.   

    怎么就取不到值呢
       
      我以前做的可以取到啊
       跟datareader对象有关系没啊
      

  3.   

    楼主 params object[] parameterValues 这个里面的值是怎么传的??
      

  4.   

    cmd.Parameters[2].Direction = ParameterDirection.Output;
      

  5.   

    1,有可能存储过程的方向没有设置,ParameterDirection.Output。
    2,有可能参数类型和长度,与数据库里不同!!
      

  6.   

    cmd.Parameters[2].Direction = ParameterDirection.Output;
    没有设置成为返回类型的参数吧.
      

  7.   

    alter proc GetWorksByPageI
    @pageI int ,--第几页 从0开始
    @pageS int ,---每页记录数
    @records int out ,--记录数
    @rows int out ,
    @uId INT
    as
    这样子啊  我在数据库中用同样的参数可以得到结果
    params object[] parameterValues   这个是查找存储过程的参数然后赋值的
     cmd的参数类型都对啊 是inputout  就是值没变 
      

  8.   

    那你就错在这里,你输出的参数应该设置成为.ParameterDirection.Output; 
      

  9.   

    System.Data.SqlClient.SqlConnection scon = new System.Data.SqlClient.SqlConnection("server=Netangel;uid=etopsUS;pwd=etops;database=etops");
    System.Data.SqlClient.SqlCommand scom = new System.Data.SqlClient.SqlCommand("",scon);scon.Open();
    scom.CommandText="p_CorpClassAdd";
    scom.CommandType = System.Data.CommandType.StoredProcedure;
    scom.Parameters.Add(
                    new SqlParameter("ReturnValue", SqlDbType.Int, 4,
                    ParameterDirection.ReturnValue, false, 0, 0,
                    string.Empty, DataRowVersion.Default, null)) //增加存储过程的返回值参数            scom.ExecuteNonQuery();
    Response.Write(scom.Parameters["ReturnValue"].Value.ToString());  //输出存储过程的返回值
    这个你对照看一下,就知道了. 
      

  10.   

    1         /// <summary>
     2         /// 校验用户
     3         /// </summary>
     4         /// <param name="user">用户信息</param>
     5         /// <returns></returns>
     6         public static int VerifyUser(clsUser user)
     7         {
     8             int iRet;
     9             string sql = String.Format("EXECUTE VerifyUser @myVerifyReader OUTPUT,'{0}','{1}'",user.username,user.password); //执行的T-SQL串
    10             SqlCommand scmd = new SqlCommand(sql, conn);
    11             scmd.Parameters.Add(new SqlParameter("@myVerifyReader",SqlDbType.Int));
    12             scmd.Parameters["@myVerifyReader"].Direction = ParameterDirection.Output;
    13             //
    14 
    15             DBOpen(conn);
    16             //在返回值上有问题
    17             scmd.ExecuteNonQuery();
    18             iRet = (int)scmd.Parameters["@myVerifyReader"].Value;
    19             DBClose(conn);
    20             return iRet;
    21         }
      

  11.   

     SqlParameter[] commandParameters = GetParameters(connect, procName, parameterValues);
            SqlCommand cmd = PrepareCommand(connect, CommandType.StoredProcedure, procName, commandParameters);
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
             try
            {            da.Fill(ds);
                records = Int32.Parse(cmd.Parameters[2].Value.ToString());
                pages = Int32.Parse (cmd.Parameters[3].Value.ToString ());
                cmd.Parameters.Clear();
                cmd.Dispose();
               
            }
            catch (Exception e)
            {
                //异常 写入日志
                EventLog.WriteEntry("ExecuteDataReaderByPageError", e.Message, EventLogEntryType.Error);
            }
            return ds ;我该成返回 dataset 就可以了
        这是怎么回事  
      
      

  12.   

    是 dataset 和datareader 的区别
       还是cmd 的执行方式不同的原因