国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

證明DataReader分頁的可行性

運維 數據庫運維
記得那是07年的一個下午,我正在網上瞎逛,突然看到一段代碼,也就是跟樓主上面的代碼類似的,通過DataReader來分頁的代碼。當時我嚇了一跳,這樣的代碼,是不是稍大些的系統就不能用了呢?

記得那是07年的一個下午,我正在網上瞎逛,突然看到一段代碼,也就是跟樓主上面的代碼類似的,通過DataReader來分頁的代碼。當時我嚇了一跳,這樣的代碼,是不是稍大些的系統就不能用了呢?因為按我當時的理解,while (dr.Read()),若我的系統有幾百萬條的數據,那這個while也要轉好久了,還要傳數據,應該快不了的。可是后來經過我的測試,其實性能是很好的,至少不是我們想像中的那么慢的。

在那時候,我用我們系統里面的一個200多W的統計表進行了測試,只是簡單的select * from table ,然后在程序里面 while 遍歷,最后在GridView上面綁定了一下,效果很好。我記憶深刻,那會白天,在公司里面,前面幾頁運行良好,后面的頁碼,當然也包括最后一頁,我都不敢去點,怕影響系統性能。等到了晚上回家,我半夜試了一下,居然跟前面幾頁差距不大,我那時候只是為了測試一下是否可行,也沒有使用記時器,但是應該也是在5秒以內就返回了。前面的話,應該也是3,4秒的樣子。太讓我意外了,同時也太驚喜了。

不過因為系統框架里面都是使用的存儲過程,也運行良好,也就一直沒有去改過。也就是說,這套分頁解決方案,在真正的大數據量下面,我也沒有實際在項目中應用過,不過小項目倒是常用。

對于一般的系統來說,這個通用的分頁解決方案就夠用了。對于大一點的,可以通過其它手段,如分表或其它什么的,也能滿足一般的應用。

想想發到首頁,應該出點代碼,就又花了些時間補充了一下。

下面是我的測試代碼:

頁面:簡單的。

  1.     <asp:GridView ID="GridView1" runat="server"> 
  2.     </asp:GridView> 
  3.      
  4. <lcs:Pager ID="Pager1" runat="server" onpagechanged="Pager1_PageChanged" AlwaysShow="true" 
  5.     CurrentPageButtonPosition="Center"> 
  6. </lcs:Pager>  

后臺代碼:也是簡單的。

  1. private void BindRpt()  
  2. {  
  3.    int totalCount;  
  4.    double beg = DateTime.Now.Ticks;  
  5.    if (isDatareader)  
  6.    {  
  7.       GridView1.DataSource = LCS.Data.DbHelper.GetPager(  
  8.          Pager1.PageSize, Pager1.CurrentPageIndex, "Statistic", "*", "StatisticID", false, out totalCount, null, null); ;  
  9.    }  
  10.    else  
  11.    {  
  12.       totalCount = LCS.Data.DbHelper.GetCount("Statistic", "");  
  13.       GridView1.DataSource = LCS.Data.DbHelper.GetPager(  
  14.          Pager1.PageSize, Pager1.CurrentPageIndex, "Statistic", "*", "StatisticID", false, null);  
  15.    }  
  16.    Response.Write("<hr/>" + (DateTime.Now.Ticks - beg)+ "<hr/>");  
  17.     
  18.    GridView1.DataBind();  
  19.    Pager1.RecordCount = totalCount;  
  20. }  

最后再附上我的DbHelper里面的方法實現:

先看使用datareader的

  1. public static DataTable GetPager(int pageSize, int pageIndex,  
  2.    string tblName, string fldName, string fldSort, bool isDesc,  
  3.    out int totalCount, string condition, params object[] parmsValues  
  4.    )  
  5. {  
  6.    //select * from talble where 11=1 order by fld desc  
  7.    //是標準的sql,不需要單獨區分  
  8.    string sql = "select " + fldName + " from " + tblName.ToString()  
  9.       + ((string.IsNullOrEmpty(condition)) ? string.Empty : (" where 11=1 " + condition))  
  10.       + " order by " + fldSort.ToString() + (isDesc ? " DESC" : " ASC");  
  11.    using (DbDataReader reader = ExecuteReader(sql, parmsValues))  
  12.    {  
  13.       DataTable dt = new DataTable();  
  14.       int fieldCount = reader.FieldCount;  
  15.       for (int i = 0; i < fieldCount; i++)  
  16.       {  
  17.          DataColumn col = new DataColumn();  
  18.          col.ColumnName = reader.GetName(i);  
  19.          col.DataType = reader.GetFieldType(i);  
  20.          dt.Columns.Add(col);  
  21.       }  
  22.       totalCount = 0;  
  23.       int first = (pageIndex - 1) * pageSize + 1;  
  24.       int last = pageIndex * pageSize;  
  25.       while (reader.Read())  
  26.       {  
  27.          totalCount++;  
  28.          if (totalCount >= first && last >= totalCount)  
  29.          {  
  30.             DataRow r = dt.NewRow();  
  31.             for (int i = 0; i < fieldCount; i++)  
  32.             {  
  33.                r[i] = reader[i];  
  34.             }  
  35.             dt.Rows.Add(r);  
  36.          }  
  37.       }  
  38.       return dt;  
  39.    }  

再看常規的:

  1. public static DbDataReader GetPager(int pageSize, int pageIndex,  
  2. string tblName, string fldName, string fldSort, bool isDesc, string condition)  
  3. {  
  4.    return ExecuteReader(Provider.GetPagerSql(pageSize, pageIndex, tblName, fldName, fldSort, isDesc, condition));  
  5. }   
  6.  
  7. //我內部使用了一個格式化sql字符串參數的過程,所以這里有個中轉。  
  8.  
  9. public static DbDataReader ExecuteReader(string format, params object[] parameterValues)  
  10. {  
  11.    if (format == null || format.Length == 0) throw new ArgumentNullException("commandText");  
  12.    if ((parameterValues != null) && (parameterValues.Length > 0))  
  13.    {  
  14.       //當存在參數時,格式化參數  
  15.       SQlParameterFormatter formatter = new SQlParameterFormatter();  
  16.       formatter.Provider = Provider;  
  17.       formatter.Format(format, parameterValues);  
  18.       return ExecuteReader(CommandType.Text, formatter.Sql, formatter.Parameters);  
  19.    }  
  20.    else//無參數時直接掉用  
  21.    {  
  22.       return ExecuteReader(CommandType.Text, format, (DbParameter[])null);  
  23.    }  
  24. }    

//最后再看一下生成分頁sql字符串的方法

  1. public string GetPagerSql( int pageSize, int pageIndex,  
  2. string tblName,string fldName,string fldSort, bool isDesc,string condition)  
  3. {  
  4.    string strSort = isDesc ? " DESC" : " ASC";  
  5.    if (pageIndex == 1)  
  6.    {  
  7.       return "select top " + pageSize.ToString() + " " + fldName + " from " + tblName.ToString()  
  8.       + ((string.IsNullOrEmpty(condition)) ? string.Empty : (" where " + condition))  
  9.       + " order by " + fldSort.ToString() + strSort;  
  10.    }  
  11.    else  
  12.    {  
  13.       System.Text.StringBuilder strSql = new System.Text.StringBuilder();  
  14.       strSql.AppendFormat("select top {0} {1} from {2} ", pageSize,fldName, tblName);  
  15.       strSql.AppendFormat(" where {1} not in (select top {0} {1} from {2} ", pageSize * (pageIndex - 1),  
  16.       (fldSort.Substring(fldSort.LastIndexOf(',') + 1, fldSort.Length - fldSort.LastIndexOf(',') - 1)), tblName);  
  17.       if (!string.IsNullOrEmpty(condition))  
  18.       {  
  19.          strSql.AppendFormat(" where {0} order by {1}{2}) and {0}", condition, fldSort, strSort);  
  20.       }  
  21.       else  
  22.       {  
  23.          strSql.AppendFormat(" order by {0}{1}) ", fldSort, strSort);  
  24.       }  
  25.       strSql.AppendFormat(" order by {0}{1}", fldSort, strSort);  
  26.       return strSql.ToString();  
  27.    }  

最后,給想直接看結果的一個連接:http://jyt.dai8.net:89/test_cb.aspx

可別把我的電腦給搞死啦。

經過我的測試,常規的還是比datareader的要來得快,若單是從數值上面看的話,差距還蠻大的,大的差10多倍,小的也要差3,4倍 ,不過對于實用性來說,也是夠用啦。因為很多時候,用戶是感覺不到的,特別是那些客戶端的,或是企業內部使用的,基本上沒有并發的項目。

原文鏈接:http://www.cnblogs.com/luchaoshuai/archive/2011/04/27/2029937.html

【編輯推薦】

  1. 詳解數據庫分頁操作
  2. sql server存儲過程分頁總結
  3. 雙TOP二分法生成分頁SQL類
  4. 淺談SQL Server2005的幾種分頁方法
  5. Access分頁方案
責任編輯:艾婧 來源: 博客園
相關推薦

2012-04-12 17:41:02

2009-09-21 16:40:42

Hibernate可行

2011-06-24 11:35:01

內鏈

2009-12-25 14:26:40

無線接入技術集成

2011-12-13 20:36:26

Android

2009-02-17 15:59:55

2013-08-27 11:15:20

2009-06-15 09:57:46

HibernateIBatis

2012-10-26 13:48:54

云計算運維云安全

2011-11-14 09:10:08

虛擬化

2012-04-09 09:39:59

虛擬化桌面虛擬化VDI終端

2020-09-16 09:19:49

數據中心

2022-03-11 08:31:50

API網關微服務

2011-08-17 13:07:19

無線局域網

2011-12-02 09:25:46

2019-10-21 17:17:48

Windows操作系統微軟

2011-07-05 14:12:06

關鍵任務虛擬化服務器

2011-07-05 10:37:03

虛擬化VMware

2023-08-20 12:34:53

2020-09-28 07:00:00

單元測試編程語言
點贊
收藏

51CTO技術棧公眾號

国产v综合v| 欧美影院一区二区三区| 欧美日韩和欧美的一区二区| 国产国语刺激对白av不卡| 亚洲资源在线看| 欧美一级特黄a| 日本不卡高清视频| 亚洲综合精品一区二区| youjizzjizz亚洲| 日韩av在线免费看| 三级理论午夜在线观看| 久久久久国产精品麻豆ai换脸| 欧美日韩一区在线观看视频| 欧美fxxxxxx另类| 国产精品男女猛烈高潮激情| 欧美性生活一级片| 久久影院资源网| 亚洲小说春色综合另类电影| 欧美福利视频在线观看| 成人国产精品久久| 精品视频资源站| 香港经典三级在线| 国产日韩欧美精品在线| 欧美狂野激情性xxxx在线观| 三级久久三级久久久| 精品不卡一区二区三区| 欧美hd在线| www.欧美免费| ****av在线网毛片| 欧美色老头old∨ideo| 中文字幕伊人| 国产欧美视频在线观看| 黄网站色视频免费观看| 美女在线视频一区| 国产九色91| 91精品国偷自产在线电影| 午夜精品三级视频福利| 欧美色片在线观看| 日韩精品中文字幕一区二区三区| 欧美日韩激情四射| 新片速递亚洲合集欧美合集| 日韩欧美在线123| 成人性生活av| 国产精品久久久爽爽爽麻豆色哟哟| 欧美国产一区二区在线| 日韩精品国产欧美| 成人免费看片'免费看| 91蝌蚪porny| 一个人看的免费视频色| 色婷婷综合中文久久一本| 亚洲麻豆精品| 亚洲免费视频观看| 超碰成人在线免费| 96国产粉嫩美女| 国产精品毛片在线看| www.69av| 韩国精品在线观看| 国产精品国产精品国产专区蜜臀ah| 超碰在线免费看| 精品一区二区三区不卡| 成人福利视频网| 久久93精品国产91久久综合| 久久亚洲精品一区| av毛片免费| 国产精品亚洲专一区二区三区| 国产精品国模大尺度私拍| 日韩一区自拍| 亚洲一区二区免费在线| 亚洲性人人天天夜夜摸| 能在线观看av网站| 欧美精品在线视频观看| 欧美激情日韩| 欧美一卡2卡3卡4卡无卡免费观看水多多| 国产精品日产欧美久久久久| 日本高清视频在线观看| 精品国产青草久久久久福利| 污污的网站在线看| 久久久91精品国产一区不卡| av成人免费看| 欧美一级高清免费| 亚洲国产日韩在线| 欧美一级黄色录像片| 国产精品灌醉下药二区| 手机福利在线| 亚洲精品一区二三区不卡| 国产精品色婷婷在线观看| 亚洲精品v天堂中文字幕| 91黄色在线| 日韩欧美亚洲一区二区| 电影在线观看一区| 久久精品视频免费播放| 免费不卡在线视频| 台湾佬中文娱乐网欧美电影| 99电影在线观看| 成+人+亚洲+综合天堂| 国产原创在线观看| 国产精品一区二区三区免费视频 | 欧美激情第三页| 精品视频国内| 欧美激情一区二区久久久| 精品国产精品国产偷麻豆| 日韩美女在线观看| 999视频精品| 欧美精品一区在线发布| 国产精品亚洲人在线观看| 深夜宅男网站免费进入| 亚洲影院在线看| 在线电影欧美成精品| 蓝色福利精品导航| 日本电影欧美片| 欧美日韩喷水| 亚洲猫色日本管| 国精产品一区一区三区mba下载| 国产最新精品视频| 国产999精品久久| 午夜精品成人av| 91精品国产亚洲| 国产精品久久久99| 国产人成在线视频| 欧美一区二区三区视频在线 | 亚洲国产日韩精品| 蜜桃视频在线观看视频| 欧美高清hd18日本| 影视一区二区三区| 午夜精品久久17c| 欧美日韩尤物久久| 精品一区久久| 国产一区二区电影| 免费av在线电影| 色婷婷**av毛片一区| 国产精品白丝av| 亚洲精品第一| 杨幂一区欧美专区| 亚洲女与黑人做爰| 婷婷成人激情| 亚洲欧美国产日韩天堂区| 国产精品一区二区av日韩在线| 国产高清一区视频| 91蜜桃网址入口| 成人午夜影视| 欧美精品在线观看91| 日韩av片子| 精品久久久三级| 国产在线精品不卡| 免费在线视频一级不卡| 日本精品一级二级| 青青草观看免费视频在线| 亚洲成人精品久久久| 日韩有吗在线观看| 亚洲春色综合另类校园电影| 中文字幕av在线一区二区三区| 国产在线网站| 日本欧美中文字幕| 国内精品视频一区二区三区八戒| 久久白虎精品| 久久电影网站中文字幕| www.在线观看av| 一区二区三区在线看| 欧美成人xxx| 奇米4444一区二区三区| 欧美中文日韩| 成人国产视频在线| 亚洲精品一区二区三区婷婷月| 欧美区日韩区| 午夜免费精品视频| 一区二区国产精品视频| 视频一区二区三区中文字幕| 动漫成人在线| 一本色道久久88精品综合| 久久亚洲综合| 视频在线这里都是精品| 91香蕉亚洲精品| 午夜久久电影网| 在线成人动漫av| 99视频资源网| 91精品国产高清自在线| 99精品在线免费| 国产精品日本一区二区三区在线| 日本三级中文字幕在线观看| 夜夜精品视频一区二区| 日韩久久一区二区三区| 国产不卡一区二区三区在线观看| 久久无码av三级| swag国产精品一区二区| 毛葺葺老太做受视频| 日韩一级视频免费观看在线| 狠狠综合久久av一区二区蜜桃| 亚洲高清乱码| 欧美男女性生活在线直播观看| 久久精品资源| 国产96在线 | 亚洲| 在线播放视频一区| 亚洲最新色图| av黄色在线观看| 国产日韩精品电影| 亚洲精品国产高清久久伦理二区| а√天堂资源国产精品| 日本乱人伦a精品| 欧美xxxx老人做受| 欧美一区二区三区免费大片|