通过DataReader获取多个结果集

简介:

我们知道,ado.net的DataReader提供一种从数据库读取行的只进流的方式。通常情况下,我们都是针对一个结果集进行处理。其实通过DataReader的NextResult方法,我们可以批处理T-SQL,也就是可以获取处理两个或者多个结果集。下面通过一个简单的示例,来简单说明一下这个功能。
1、数据表
我们还是沿用这一篇里的Person表。在Person表里,我们定义了自增长的Id,姓、名、身高和体重,它们对应的字段和实体里的属性命名是一样的。

2、实体类

复制代码

    
public   class  Person
    {
        
public   int  Id {  get set ; }
        
public   string  FirstName {  get set ; }
        
public   string  LastName {  get set ; }
        
public   double  Weight {  get set ; }
        
public   double  Height {  get set ; }

        
///   <summary>
        
///  总记录数
        
///   </summary>
         public   long  TotalCount {  get set ; }
    }
复制代码

需要说明的是,TotalCount属性是我们自己根据统计需要,添加的用来统计符合条件的人的总记录数,并不是Person表的一个实际字段。

3、数据实体转换

代码

上面的代码中,注释写的很清楚,通过NextResult方法后,我们再次获取结果集的列(示例中保持在hashtable里),利用第一次获得结果集的方法和原理,给实体赋值。

4、前台调用
很简单,通过一个带分号的sql语句,获得一个实体集合。

代码
     // 批量sql语句 以;隔开
             string  sql  =   " SELECT TOP 10 [Id] ,[FirstName],[LastName],[Weight],[Height] FROM Person (NOLOCK); SELECT COUNT(Id) AS TotalCount FROM Person (NOLOCK)  " ;
            IList
< Person >  listPersons  =  SqlHelper.Select < Person > ( typeof (Person), sql); // 操作两个结果集

 

有图有真相:



从图中我们可以清楚地看到,测试数据库里的总人数是1999918人。

最后,请教最近使用linq2sql一点困扰我的地方:很多人津津乐道的Skip...Take分页(本质上据说就是二次top),好像无法直接取得总记录数(TotalCount),但是正常项目中都会通过总记录数确定分页效果。除了直接通过linq查询取Count之外,不知道大家有没有其他更好的方法,比如窗口函数row number,或者就像本文所表达的那样,批处理一次查询就搞定的那种?






本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2010/07/10/1774904.html,如需转载请自行联系原作者

目录
相关文章
|
9月前
|
人工智能 机器人 API
阿里云百炼xWaytoAGI共学课 DAY2 - 更好用的文本知识库应用跟学,快速上手阿里云百炼
本课程是阿里云百炼平台的第二天课程内容,旨在帮助用户了解如何通过阿里云百炼构建和发布自己的AI应用。介绍了如何利用大模型和智能体应用来创建具备强大语言理解和生成能力的AI助手,并通过不同的渠道(如网站、钉钉、微信公众号等)发布这些应用。
1525 8
|
10月前
|
监控 NoSQL Java
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
若依(RuoYi)是一款基于Spring Boot和Vue.js的开源Java快速开发脚手架,支持OAuth2、JWT鉴权,集成多种安全框架和持久化框架。它提供了系统管理、监控管理、任务调度、代码生成等常用功能模块,适合中小型公司快速搭建Web应用。本文主要介绍若依框架的特点、版本发展、优缺点及项目部署步骤,帮助开发者快速上手并部署若依项目。
11862 3
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
|
存储 Shell 数据安全/隐私保护
ZooKeeper【基础知识 04】控制权限ACL(原生的 Shell 命令)
【4月更文挑战第11天】ZooKeeper【基础知识 04】控制权限ACL(原生的 Shell 命令)
337 7
|
12月前
|
数据采集 存储 NoSQL
提高爬虫性能的 5 个关键技巧:从并发到异步执行
本文介绍了提高网络爬虫性能的五个关键技巧:并发请求、异步执行、使用代理IP、限制请求频率与休眠时间、优化数据提取与存储。结合拼多多的实际案例,展示了如何通过这些技术优化爬虫效率,确保数据采集的高效性和稳定性。
792 0
|
SQL 存储 关系型数据库
MySQL插入时间戳字段的值
【5月更文挑战第1天】
507 5
|
缓存 Linux
百度搜索:蓝易云【CentOS-8 - AppStream 错误:为 repo ‘AppStream‘ 下载元数据失败解决教程。】
通过以上步骤,你应该能够解决 "为 repo 'AppStream' 下载元数据失败" 的错误,并成功更新 AppStream 仓库的元数据。
692 0
|
Java Spring 容器
Spring-注入参数详解-[集合类型属性]
Spring-注入参数详解-[集合类型属性]
171 0
|
算法 Java
《Java遗传算法编程》—— 1.7 搜索空间
在计算机科学中,如果处理优化问题时有许多候选解需要搜索,我们就称解的集合是“搜索空间”。搜索空间内每个特定的点就是给定问题的一个候选解。在这个搜索空间中有距离的概念,相比位置远离的解,位置彼此靠近的解更可能表现出相似的特征。
2366 0
|
机器学习/深度学习 人工智能 算法
阿里云启动天池医疗AI大赛 挑战早期肺癌诊断
3月29日,阿里云与英特尔、零氪科技联合宣布启动天池医疗AI大赛。
3658 0
|
Unix
cmake 学习笔记(四)
接前面的一二三,学习一下 CMakeCache.txt 相关的东西。 CMakeCache.txt 可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数)。
1094 0