博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用DataReader高效率分页
阅读量:7033 次
发布时间:2019-06-28

本文共 2787 字,大约阅读时间需要 9 分钟。

自从用Sql2005版本以后一直用ROW_NUMBER()分页,最近一个项目维护sqlserver是2000,没办法重写了分页。写完测试分析比ROW_NUMBER()明显快啊

分享一下两种方式的分页代码 

1.用DataReader分页

    /// <summary>

        
///
 PageList for DataReader
        
///
 
</summary>
        
///
 
<param name="connectionString"></param>
        
///
 
<param name="sql"></param>
        
///
 
<param name="pageSize"></param>
        
///
 
<param name="curPage"></param>
        
///
 
<param name="pageCount"></param>
        
///
 
<param name="count"></param>
        
///
 
<param name="cmdParms"></param>
        
///
 
<returns></returns>
        
public
 DataTable PageListReader(
string
 connectionString, 
string
 sql, 
int
 pageSize, 
int
 curPage, 
out
 
int
 pageCount, 
out
 
int
 count, 
params
 DbParameter[] cmdParms)
        {
            
int
 first 
=
 
0
;
            
int
 last 
=
 
0
;
            
int
 fieldCount 
=
 
0
;
            
using
 (SqlConnection conn 
=
 
new
 SqlConnection(connectionString))
            {
                SqlCommand cmd 
=
 conn.CreateCommand();
                PrepareCommand(cmd, conn, 
null
, CommandType.Text, sql, cmdParms);
                SqlDataReader reader 
=
 cmd.ExecuteReader(CommandBehavior.CloseConnection);
                DataTable dt 
=
 
new
 DataTable();
                fieldCount 
=
 reader.FieldCount;
                
for
 (
int
 i 
=
 
0
; i 
<
 fieldCount; i
++
)
                {
                    DataColumn col 
=
 
new
 DataColumn();
                    col.ColumnName 
=
 reader.GetName(i);
                    col.DataType 
=
 reader.GetFieldType(i);
                    dt.Columns.Add(col);
                }
                count 
=
 
0
;
                first 
=
 (curPage 
-
 
1
*
 pageSize
+
1
;
                last 
=
 curPage 
*
 pageSize;
                
while
 (reader.Read())
                {
                    count
++
;
                    
if
 (count 
>=
 first 
&&
 last 
>=
 count)
                    {
                        DataRow r 
=
 dt.NewRow();
                        
for
 (
int
 i 
=
 
0
; i 
<
 fieldCount; i
++
)
                        {
                            r[i] 
=
 reader[i];
                        }
                        dt.Rows.Add(r);
                    }
                }
                reader.Close();
                pageCount 
=
 Convert.ToInt32(Math.Ceiling((
double
)count 
/
 (
double
)pageSize));
                
return
 dt;
            }
        }

 

2.用ROW_NUMBER()分页

    /// <summary>

        
///
 分页获取数据(Sql Server 2005) for ROW_NUMBER()
        
///
 
</summary>
        
///
 
<param name="connectionString">
数据库链接
</param>
        
///
 
<param name="sql">
获取数据集的Sql
</param>
        
///
 
<param name="fldSort">
排序字段,可以多个
</param>
        
///
 
<param name="pageSize">
每页显示多少条
</param>
        
///
 
<param name="curPage">
当前页码
</param>
        
///
 
<param name="pageCount">
总页数
</param>
        
///
 
<param name="count">
总记录数
</param>
        
///
<param name="cmdParms">
DbParameter
</param>
        
///
 
<returns>
DataTable
</returns>
        
public
 DataTable PageList(
string
 connectionString, 
string
 sql, 
string
 fldSort, 
int
 pageSize, 
int
 curPage, 
out
 
int
 pageCount, 
out
 
int
 count, 
params
 DbParameter[] cmdParms)
        {
            StringBuilder strSql 
=
 
new
 StringBuilder();
            strSql.AppendFormat(
@"
SELECT count(0) from {0} as MyTableCount;
                                    select * from (
                                    SELECT ROW_NUMBER() OVER(order by {1}) RowNumber,* 
                                    from {0} mytable
                                    ) mytable2
                                    where RowNumber between {2} and {3}
"
                               , sql, fldSort, Convert.ToString((curPage 
-
 
1
*
 pageSize 
+
 
1
), Convert.ToString((curPage 
*
 pageSize)));
            DataSet ds 
=
 ExecuteQuery(connectionString, CommandType.Text, strSql.ToString(), cmdParms);
            count 
=
 Convert.ToInt32(ds.Tables[
0
].Rows[
0
][
0
]);
            pageCount 
=
 Convert.ToInt32(Math.Ceiling((
double
)count 
/
 (
double
)pageSize));
            
return
 ds.Tables[
1
];
        }

转载地址:http://spyal.baihongyu.com/

你可能感兴趣的文章
PHP ++true true++ 布尔值的先增后增问题
查看>>
七牛qshell工具 批量删除操作
查看>>
关于composer常用到的命令
查看>>
shell基础2
查看>>
Paddle Fluid v1.2 Release Note 深度学习框架重磅更新
查看>>
从今天起让我们忘记Java中的get/set方法吧!
查看>>
java框架学习日志-3
查看>>
Oracle学习日志-6(聚合查询)
查看>>
程序员笔记|循序渐进解读Oracle AWR性能分析报告
查看>>
UniDAC使用教程(一):连接到数据库
查看>>
PHP 连接 MySQL
查看>>
314安装与网络配置预习+笔记
查看>>
python项目实战:免费下载kugou任意付费音乐
查看>>
消息中间件-activeMQ
查看>>
SQL SERVER2008数据库常识
查看>>
mac outlook 自动回复
查看>>
横屏竖屏
查看>>
Zabbix监控MySQL
查看>>
OSChina 周三乱弹 ——祖传的程序员?????
查看>>
OSChina 周五乱弹 —— 埃塞俄比亚的远房大表姐
查看>>