ADO.NET 2.0中的SqlCommand.ExecutePageReader
2004-11-02 17:18
447 查看
http://blog.joycode.com/liuhuimiao/
在.NET 2.0 PDC或Beta1中,可以看到SqlCommand对象新增了个ExecutePageReader方法,该方法实现了分页读取数据的功能。对于分页读取数据,在ADO.NET1.1中(当然2.0也适合)一般常用动态构造SQL语句实现:
SqlDataReader GetPage(int pageNumber, int pageSize)
{
//pageNumber: 从 0 开始计数的页码
//pageSize: 每页的记录数
String command = String.Format("SELECT * FROM (SELECT TOP {0} * FROM " +
"Products ORDER BY ProductID) AS t1 WHERE ProductID NOT IN " +
"(SELECT TOP {1} ProductID FROM Products ORDER BY ProductID) ",
pageSize * (pageNumber + 1), pageSize * pageNumber);
SqlConnection conn = new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand(command, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
有时为更好实现分页性能效果,也可以采用存储过程建立临时表的方式进行数据分页,但原理基本都差不多。在ADO.NET 2.0 PDC/Beta1中,用SqlCommand.ExecutePageReader进行数据分页:
SqlDataReader GetPageReader(int pageNumber, int pageSize)
{
int startIndex = (pageNumber - 1) * pageSize;
String command = "SELECT * FROM Products";
SqlConnection conn = new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand(command, conn);
conn.Open();
SqlDataReader dr = cmd.ExecutePageReader(CommandBehavior.CloseConnection, startIndex, pageSize);
return dr;
}
最后绑定第2页的5行数据(ProductID从6到10)到GridView1上:
GridView1.DataSource = GetPage(1, 5);
GridView1.DataBind();
从上可以看到,用了ExecutePageReader确实简单了很多。但是,很“不幸”告诉大家,ExecutePageReader在未来版本中将不会出现,也就是说被cut掉了。至于cut的真正原因,还真不知道。不过,我试图用Reflector去看其内部,发现这样一个调用顺序:ExecutePageReader()—》SqlResultSet.CompleteOpenForPageReader()—》SqlResultSet.FetchInternal()—》执行存储过程sp_cursorfetch,也就是实际ExecutePageReader使用了SQLServer的服务器游标进行数据分页读取,但这跟它被cut是否有关?这么好用的一个功能被cut是不是有其他考虑?或许ADO.NET开发小组在鱼和熊掌取舍之间已经做了抉择,只是我还是觉得ExecutePageReader(据说SqlResultSet也被cut,然后连同ExecutePageReader被cut)被cut很可惜。
在.NET 2.0 PDC或Beta1中,可以看到SqlCommand对象新增了个ExecutePageReader方法,该方法实现了分页读取数据的功能。对于分页读取数据,在ADO.NET1.1中(当然2.0也适合)一般常用动态构造SQL语句实现:
SqlDataReader GetPage(int pageNumber, int pageSize)
{
//pageNumber: 从 0 开始计数的页码
//pageSize: 每页的记录数
String command = String.Format("SELECT * FROM (SELECT TOP {0} * FROM " +
"Products ORDER BY ProductID) AS t1 WHERE ProductID NOT IN " +
"(SELECT TOP {1} ProductID FROM Products ORDER BY ProductID) ",
pageSize * (pageNumber + 1), pageSize * pageNumber);
SqlConnection conn = new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand(command, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
有时为更好实现分页性能效果,也可以采用存储过程建立临时表的方式进行数据分页,但原理基本都差不多。在ADO.NET 2.0 PDC/Beta1中,用SqlCommand.ExecutePageReader进行数据分页:
SqlDataReader GetPageReader(int pageNumber, int pageSize)
{
int startIndex = (pageNumber - 1) * pageSize;
String command = "SELECT * FROM Products";
SqlConnection conn = new SqlConnection("server=.;database=Northwind;Trusted_Connection=yes");
SqlCommand cmd = new SqlCommand(command, conn);
conn.Open();
SqlDataReader dr = cmd.ExecutePageReader(CommandBehavior.CloseConnection, startIndex, pageSize);
return dr;
}
最后绑定第2页的5行数据(ProductID从6到10)到GridView1上:
GridView1.DataSource = GetPage(1, 5);
GridView1.DataBind();
从上可以看到,用了ExecutePageReader确实简单了很多。但是,很“不幸”告诉大家,ExecutePageReader在未来版本中将不会出现,也就是说被cut掉了。至于cut的真正原因,还真不知道。不过,我试图用Reflector去看其内部,发现这样一个调用顺序:ExecutePageReader()—》SqlResultSet.CompleteOpenForPageReader()—》SqlResultSet.FetchInternal()—》执行存储过程sp_cursorfetch,也就是实际ExecutePageReader使用了SQLServer的服务器游标进行数据分页读取,但这跟它被cut是否有关?这么好用的一个功能被cut是不是有其他考虑?或许ADO.NET开发小组在鱼和熊掌取舍之间已经做了抉择,只是我还是觉得ExecutePageReader(据说SqlResultSet也被cut,然后连同ExecutePageReader被cut)被cut很可惜。
相关文章推荐
- ADO.NET 2.0中的SqlCommand.ExecutePageReader
- ADO.NET - 1.基础(SqlCommand\ExecuteScalar\ExecuteReader\sqlDataAdapter)
- ADO.NET 主要的三个对象(SqlConnection/SqlCommand/SqlDataReader)
- ADO.NET中利用DataAdapter进行数据操作(SqlCommandBuilder,AcceptChanges)
- ADO.NET 開發高手線上教學課程第六集 - 如何使用資料讀取器 (SqlDataReader)
- Work with XML Data Type in SQL Server 2005 from ADO.NET 2.0
- 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )
- 黑马程序员_学习日记47_615数据库开发及ADO.Net(连接字符串、SqlDataReader对象、连接池)
- ADO.NET_第八篇_OracleCommand_执行多个SQL语句01
- ADO.NET ASP.NET 将 SQLDatareader 转换成 List
- 黑马程序员之ADO.NET学习笔记:SqlDataReader(数据流读取器)
- ADO.NET——Command(执行SQL) & DataReader(读取数据库)
- SqlBulkCopy in ADO.NET 2.0
- ADO.NET_第八篇_OracleCommand_执行多个SQL语句02
- ADO.NET——Command(执行SQL) & DataReader(读取数据库)
- ADO.NET出错原因:Dynamic SQL generation for the UpdateCommand is not Supported ……
- ADO.NET学习之防止SQL注入,存储过程,SqlDataReader
- ADO.NET中SQL Command的执行
- ADO.NET基础01(ADO.NET组成,数据库的方式,SqlCommand,SqlDataReader)
- ADO.NET数据库操作------SqlDataReader和SqlDataAdapter 区别