Asp.net 通用 万级 数据分页

source:http://www.cnblogs.com/wmj/archive/2008/10/07/1305186.html

1.主题,Asp.net环境下,通用的数据分页(包括Oracle,SqlServer,DB2...)

     很久以前,就想做一个通用点的数据分页组件,但苦于一直没有充足的时间,所以迟迟没有实现(当然,主要是因为有一定的难度,要处理视图状态,回传事件,自绘等...),"十一"期间,陪女朋友去了躺"湘西",白天游山玩水,晚上无事,吃吃当地的夜宵,无聊之际,google了一把Oracle的数据分页,竟然没有一个完整的关于Asp.net + Oracle数据分页的例子,要不就是有版本问题,索性决定自己弄一个.

2.环境

     IDE;vs2008+asp.net2.0 or 3.0+Oracle9i

     Oracle测试数据;41万多条

     带宽;网通说是有2M的带宽,其实TNND只有100多KB

3.原理

     利用Oracle9i的RowNum获取我们想要的数据,如图3.1

 

public  IEnumerable GetPageSqlByOracle( string  sql,  int  startRowIndex,  int  maximumRows,  string  orderBy)
        
{
            

            
string sqlFormat = string.Format("select * from (select rownum rn, pageTable.* from {0} pageTable where rownum <={1}) where rn>{2}", sql, startRowIndex + maximumRows, startRowIndex);
            
            
return ydjwOracleConn.RetriveDataSet(sqlFormat).Tables[0].DefaultView;
        }

 

startRowIndex表示开始索引,maximumRows表示要获取的每页记录数目.

然后把分页后的数据绑定到ObjectDataSource组件,如下图

    

4.效果

 

4.1 支持多排序,比如时间,比如身份证明号码等

4.2 41万多条数据

4.3 单条件查询,第一次用时1.547秒

4.4 第二次,用时1.515秒

第三次差不多,就不贴了.

4.5 看看不带条件的查询,一次把41万条数据全部查询出来使用的时间

可以看到,不带条件查询41万条数据,第一次用时1.265秒.

4.6 可以看到不带条件查询41万条数据,第二次用时1.156秒

4.7 可用SqlServer,或者Db2等数据库代替,只需要修改 图3.1获取数据的方法,其他地方不用动.

 

5.需要注意的地方

5.1 记得数据量上万时,一定要加索引,否则要等得"花谢花开".

5.2 ObjectDataSource的所有参数名称,一定要和绑定的方法参数名称,顺序一致.

5.3 能用缓存的,尽量用缓存

5.4 SqlServer的分页算法,就不说了,替换一下图3.1的方法就行

5.5 因为数据库文件实在太大,不方便下载,有兴趣的朋友自己弄一张表就OK,加上webconfig中的数据库连接配置

6.下载

测试Demo下载

 

7.后话

     该说的都说了,希望对大家能有所帮助启发,还有就是此测试Demo还没有加缓存,有兴趣的朋友可以加上,欢迎大家讨论,批评,指导...

 

 

Tag标签: asp.net, oracle, 分页
posted on 2008-10-07 03:02 王孟军! 阅读(1814) 评论(13)   编辑 收藏 所属分类: asp.net数据库开发


评论

#1楼  2008-10-07 08:11 金色海洋(jyk)       
1、不要把别人的身份证号码弄出来,会有麻烦的。
2、分页需要的时间是多少呀?
   回复   引用   查看     

#2楼  2008-10-07 08:13 非空       
主啊 终于换头像了
   回复   引用   查看     

#3楼  2008-10-07 08:29 冰の酷龙       
@金色海洋(jyk)
我看到时也吓一跳。。这是哪里的啊。。

楼主不是长沙的吗?
   回复   引用   查看     

#4楼  2008-10-07 08:32 good man       
兄弟,好东西啊,
我们项目中也用到这个哟
分页这个要想达到效率,性能等多方面的东西
的确很难哟

   回复   引用   查看     

#5楼  2008-10-07 08:33 Q.Lee.lulu       
身份证号码网上一查就出来,地址也出来了,这个不怕吧 ?
   回复   引用   查看     

#6楼  2008-10-07 09:10 子逸       
您的数据是真实的吗? 别吓着相关的人
   回复   引用   查看     

#7楼  [ 楼主] 2008-10-07 09:12 王孟军!       
@子逸
已经处理了,GOD
   回复   引用   查看     

#8楼  2008-10-07 09:25 申健       
网络带宽的2M是2Mb,单位是比特;实际看到的下载速度是100KB,单位是字节。
两个单位不一样。
   回复   引用   查看     

#9楼  2008-10-07 10:07 Duron800 [未注册用户]
@申健
应该理论上是200多KB的。100多KB就太少了。
   回复   引用     

#10楼  2008-10-07 11:20 Doho       
个人觉得Linq to sql 最方便了,想从哪查起就从那查,要多少读多少!对于Oracle 可以采用Linq to Oracle 。
   回复   引用   查看     

#11楼  2008-10-07 11:51 boyrichie [未注册用户]
楼主电脑配置是多少啊

怎么这么快速
   回复   引用     

#12楼  2008-10-07 12:29 kes.king [未注册用户]
ORACLE的数据导出成dmp再压缩一下,41万而已,很小的。

04年用asp的时候就在用这种方式做分页了。
   回复   引用     

#13楼  2008-10-07 12:56 cobrayang [未注册用户]
下载不了,,,
   回复   引用     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网上找了一个 Asp数据操作组件(百万级分页) ,实用环境:Asp+DLL+MsSQL(这个网上很多地方都可以下载),并且其中结合SQL存储过程,说实话以前SQL存储过程接触的比较少,所以在调试该组件的时候遇到了一些问题,并试着改了一下(作者别生气(^..^)),高手们别笑话我。 原代码如下: 有分页列表数据: cls.tblName="Tablename" '表名 cls.fldName="Id" '排序关键字段 cls.PageIndex=Request("P")*1 '当前页码 cls.PageSize=20 '每页列数 cls.OrderType=1 '排序方式,0 、1 cls.strWhere=StrW '查询条件,不带Where cls.ListUrl="?Y="&Y&"&M="&M&"&D="&D&"&Sn="&Sn&"&P=" 分页URL Set Rs=cls.Result do while not rs.eof rs.movenext loop 分页数据 cls.page 在原文的使用说明中,在翻页代码中对表查询默认是全部字段也就是*,这样是不是会浪费资源,而无法查询需要的字段,于是我在DLL代码中新加入一个变量名为zdName,作为传递可控制查询条件的变量,同时在SQL存储过程中也加入相应的接受变量@zdName 字符型。 在这个小问题解决后,又在使用上发现cls.strWhere付给它的变量StrW 如果条件变量其中带有类似 例如 a='b'则执行SQL存储过程时候会提示错误,后来发现是DLL代码中: sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",'" & strWhere & "' " 这个地方是否写的不够严谨,在StrW中如果含有单引,那么将无法执行,所以我在DLL的VB代码改成 If InStr(strWhere, "'") 0 Then sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",""" & strWhere & """ " Else sql = "exec GetList " & tblName & "," & fldName & "," & PageSize & "," & PageIndex & "," & OrderType & ",'" & strWhere & "' " End If 试了试目前的问题确实解决了,这个组件我也是刚刚使用,希望对大家能有点帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值