前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ADO.NET 2.0中的SqlCommand.ExecutePageReader

ADO.NET 2.0中的SqlCommand.ExecutePageReader

作者头像
Java架构师必看
发布2021-03-22 10:54:19
3870
发布2021-03-22 10:54:19
举报
文章被收录于专栏:Java架构师必看

在.NET 2.0 PDC或Beta1中,可以看到SqlCommand对象新增了个ExecutePageReader方法,该方法实现了分页读取数据的功能。对于分页读取数据,在ADO.NET1.1中(当然2.0也适合)一般常用动态构造SQL语句实现:

代码语言:javascript
复制
    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进行数据分页:

代码语言:javascript
复制
    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上:

代码语言:javascript
复制
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很可惜。

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档