用DataReader高效率分页

王朝学院·作者佚名  2011-04-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

自从用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];

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航