有如下定义的一个分页存储过程:
CREATE    PROCEDURE sp_page
  @tb         varchar(50), --表名
  @col        varchar(50), --按该列来进行分页
  @coltype    int,         --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
  @orderby    bit,         --排序,0-顺序,1-倒序
  @collist    varchar(800),--要查询出的字段列表,*表示全部字段
  @pagesize   int,         --每页记录数
  @page       int,         --指定页
  @condition  varchar(800),--查询条件
  @records      int OUTPUT   --总页数我是通过DataReader来执行此存储过程.
         其它参数定义.
         parameter["@records"].direciton=ParameterDireciton.Output; SqlDataReader dr1=cmd1.ExecuteReader ();
//cmd1.ExecuteNonQuery ();
DataGrid1.VirtualItemCount =int.parser(Parameter["@records"].value.tostring());并同时希望能将@records这个output变量取值赋于DataGrid1.VirtualItemCount,但在实际操作中发现
取不到这个值,只有用cmd1.executenonquery才可以.那我要怎么样才可以得到这个output返回值呢?

解决方案 »

  1.   

    你在执行了ExecuteNonQuery之后
    这样区值
    dim inttemp as integer=cmd1.Parameters("@records").Value你把上面的代码转换成C#就好了
      

  2.   

    to smoothwood(吾谁与归)
    但是我是要执行ExecuteReader,而不是executeNonquery那要如何取得值呢?之前已经知道executenonquery可以取得变量值,关键是executereader取不到值.
      

  3.   

    你可以这样在你的存储过程里头,加上select count(*) as records from yourtable where....
    然后用 像这个样子取值:dr1("records")
    就不用定义这个@records这个输出参数了
      

  4.   

    注:count(*)替换成你想计算的表达式
      

  5.   

    to :smoothwood(吾谁与归)
    你说的方法,仍然无法取得数据啊,
    因为dr1中只能有一个表的吧,如果用了你语句,则后面的查询出的记录集就无法在Dr1中显示出来了.想问一个问题,如果在存储过程中会返回多个表,则执行executereader后,dr1中是只有一个表还会有全部表.如果是全部表,则如何检索各个表呢?
      

  6.   

    是不是用datareader就不能得到存储过程的返回变量啊???给一个答复确定一下就OK啦.
      

  7.   

    看这个oracle做法能不能帮到你
    CREATE OR REPLACE PACKAGE CURSPKG AS 
      TYPE T_CURSOR IS REF CURSOR; 
      PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
                                  DEPTCURSOR OUT T_CURSOR); 
    END CURSPKG;CREATE OR REPLACE PACKAGE BODY CURSPKG AS 
      PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, 
                                  DEPTCURSOR OUT T_CURSOR) 
      IS 
      BEGIN 
        OPEN EMPCURSOR FOR SELECT * FROM DEMO.EMPLOYEE; 
        OPEN DEPTCURSOR FOR SELECT * FROM DEMO.DEPARTMENT; 
      END OPEN_TWO_CURSORS; 
    END CURSPKG;
    以下代码使用 OracleDataReader 的 Read 和 NextResult 方法返回先前命令的结果。REF CURSOR 参数按顺序返回。oraConn.Open();OracleCommand cursCmd = new OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn);
    cursCmd.CommandType = CommandType.StoredProcedure;
    cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;
    cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;OracleDataReader rdr = cursCmd.ExecuteReader();Console.WriteLine("\nEmp ID\tName");while (rdr.Read())
      Console.WriteLine("{0}\t{1}, {2}", rdr.GetOracleNumber(0), rdr.GetString(1), rdr.GetString(2));rdr.NextResult();Console.WriteLine("\nDept ID\tName");while (rdr.Read())
      Console.WriteLine("{0}\t{1}", rdr.GetOracleNumber(0), rdr.GetString(1));rdr.Close();
    oraConn.Close();
      

  8.   

    结贴,并且总结一下:
    使用DataReader是不能得到Output变量的,但使用DataAdapter可以,我已经用它实现了.