我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: ASP.NET调用oracle实现快速分页 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

klo



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
家族: YD一族
发贴: 473
威望: 0
浮云: 1105
在线等级:
注册时间: 2007-01-10
最后登陆: 2008-06-30

5come5帮你背单词 [ underlying /Λndə'laiiŋ/ a. 潜在的,在下面的 ]


ASP.NET调用oracle实现快速分页


《使用 ADO.NET 访问 Oracle 9i 存储过程》见下面的介绍(如果对这个不怎么懂的,还是先看看下面文章)http://www.microsoft.com/china/MSDN/library/data/dataAccess/DMSDNorsps.mspx  

   包定义:  

   create or replace package MaterialManage is

   TYPE T_CURSOR IS REF CURSOR;

   Procedure Per_QuickPage

   (

   TbName in varchar2, --表名

   FieldStr in varchar2, --字段集

   RowFilter in varchar2, --过滤条件

   SortStr in varchar2, --排序集

   RownumFieldStr in varchar2, --分页条件

   TotalCount out number, --总记录数

   Cur_ReturnCur out T_CURSOR --返回的游标

   );

   end MaterialManage;

  
   包主体:
  

   create or replace package body MaterialManage is

   Procedure Per_QuickPage

   (

   TbName in varchar2, --表 名

   FieldStr in varchar2, --字段集

   RowFilter in varchar2, --过滤条件

   SortStr in varchar2, --排序集

   MinRowNum in number, --分页小值

   MaxRowNum in number, --分页大值

   TotalCount out number, --总记录数

   Cur_ReturnCur out T_CURSOR

   )

   is

   v_SourceTb1 varchar2(3000); --动态表名1

   v_SourceTb2 varchar2(3000); --动态表名2

   v_SourceTb3 varchar2(3000); --动态表名3

   v_SourceTb4 varchar2(3000); --动态表名4

   v_TotalCount varchar2(50); --总记录数

   v_sql varchar2(3000); --动态sql

   begin

   v_SourceTb1 := '(select '   FieldStr   ' from '   TbName   ') SourceTb1';

   v_SourceTb2 := '(select * from '   v_SourceTb1   ' where '   RowFilter   ' '   SortStr   ') SourceTb2';

   v_SourceTb3 := '(select rownum as Rowindex,SourceTb2.* from '   v_SourceTb2   ' where rownum='  MinRowNum;

   open Cur_ReturnCur for v_sql;

   end Per_QuickPage;

   END MaterialManage;  

   由于oracle有个rownum特性,所以分页的时候就是利用rownum来实现。如果大家还有什么更好的办法记得告诉我一声,多谢了,因为我测试了上面的分页方法效率并不是很高。  

   存储过程返回了两个参数:TotalCount :当前条件下的总记录数 Cur_ReturnCur :游标类型,就是所要读取的记录的集合
 
   下面是ASP.NET中调用的代码:  

   ///

   /// 调用存储过程实现快速分页

   ///

   /// 表名称

   /// 字段名称

   /// 过滤条件

   /// 排序字段
   /// 分页小值
   /// 分页大值
   /// 总记录(需要返回)
   /// DataTable
   public DataTable QuickPage(string TbName,string FieldStr,string RowFilter,string SortStr,int MinRowNum,int MaxRowNum,ref int RecordCount)
   {
   OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["OracleConnstr"].ToString());
   OracleCommand cmd = new OracleCommand();
   cmd.Connection = conn;
   cmd.CommandText = "MaterialManage.Per_QuickPage";
   cmd.CommandType = CommandType.StoredProcedure;
  
   cmd.Parameters.Add("TbName",OracleType.VarChar,50); //表 名
   cmd.Parameters["TbName"].Direction = ParameterDirection.Input;
   cmd.Parameters["TbName"].Value = TbName;
  
   cmd.Parameters.Add("FieldStr",OracleType.VarChar,3000); //字段集
   cmd.Parameters["FieldStr"].Direction = ParameterDirection.Input;
   cmd.Parameters["FieldStr"].Value = FieldStr;
  
   cmd.Parameters.Add("RowFilter",OracleType.VarChar,3000); //过滤条件
   cmd.Parameters["RowFilter"].Direction = ParameterDirection.Input;
   cmd.Parameters["RowFilter"].Value = RowFilter;
  
   cmd.Parameters.Add("SortStr",OracleType.VarChar,3000); //排序字段
   cmd.Parameters["SortStr"].Direction = ParameterDirection.Input;
   cmd.Parameters["SortStr"].Value = SortStr;
  
   cmd.Parameters.Add("MinRowNum",OracleType.Number); //分页小值
   cmd.Parameters["MinRowNum"].Direction = ParameterDirection.Input;
   cmd.Parameters["MinRowNum"].Value = MinRowNum;
  
   cmd.Parameters.Add("MaxRowNum",OracleType.Number); //分页大值
   cmd.Parameters["MaxRowNum"].Direction = ParameterDirection.Input;
   cmd.Parameters["MaxRowNum"].Value = MaxRowNum;
  
   cmd.Parameters.Add("TotalCount",OracleType.Number); //页总记录数
   cmd.Parameters["TotalCount"].Direction = ParameterDirection.Output;
   cmd.Parameters["TotalCount"].Value = 0;  
   cmd.Parameters.Add("Cur_ReturnCur",OracleType.Cursor); //返回的游标
   cmd.Parameters["Cur_ReturnCur"].Direction = ParameterDirection.Output;
  
   DataSet Ds = new DataSet();
   OracleDataAdapter adapter= new OracleDataAdapter(cmd);
   adapter.Fill(Ds);
   conn.Close();
  
   //总记录数
   RecordCount = int.Parse(cmd.Parameters["TotalCount"].Value.ToString());
   return Ds.Tables[0];
   }
顶端 Posted: 2008-05-19 13:07 | [楼 主]
shoryuar



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1201
威望: 0
浮云: 1209
在线等级:
注册时间: 2005-01-17
最后登陆: 2011-02-10

5come5帮你背单词 [ hemisphere /'hemisfiə/ n. 半球,半个地球 ]


貌似分页不用那么复杂吧
顶端 Posted: 2009-03-17 23:46 | [1 楼]
我爱咪咪



性别: 保密 状态: 该用户目前不在线
头衔: 人见人爱万人迷
等级: 荣誉会员
发贴: 872
威望: 1
浮云: 380
在线等级:
注册时间: 2006-10-29
最后登陆: 2013-10-07

5come5帮你背单词 [ british /'briti/ a. 英国(人)的;n. 英国人 ]


要整个高效的分页才行,如果一次读取的数据量有百万条,服务器还不卡死
顶端 Posted: 2009-03-29 15:36 | [2 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.012202(s) query 5, Time now is:05-02 12:17, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号