在基于链接的数据库访问模式下,查询类操作通常是执行select命令,产生的查询结果可以通过SqlDataReader类依次读取。
SqlDataReader类是ADO.NET提供的用于读取SQL Server数据库记录的只读向前数据记录读取器。
开始时,SqlDataReader指向第一条记录之前,不能直接,通过SqlDataReader,Read()方法可以读取下一条记录,重复指令,直到全部记录读取完成
为了方便获取数据记录中的某个字段的值,SqlDataReader类还提供GetXXX()一系列的方法,将指定字段的数据按照特定数据类型读取,如int、string、DataTime等等

通常我们使用Command类的ExecuteRader方法来创建DataReader对象:
SqlCommand cmd = new SqlCommand(commandText,ConnectionObject) 
SqlDataReader dr = cmd.ExecuteReader(); 
DataReader类最常见的用法就是检索Sql查询或者存储过程返回的记录。

**********************************************************************************************************************************************************************************

SqlDataReader类常用成员

一、属性

1、Depth:表示当前行的嵌套属性(我不常用)

2、FieldCount:表示当前行中的列数

3、HasRows:表示当前行SqlDataReader是否包含一行或多行(常用,用于登录检测用户是否存在)

4、IsClose:表示SqlDataReader实例是否已经关闭了

5、VisibleFieldCount:表示当前SqlDataReader中未隐藏的字段的数目。

二、方法

Read():使得当前SqlDataReader前进道下一条记录,即向前读取。(常用)

我们经常这样做: While(dr.Reader()) //遍历所有记录

{ //do something with the current record }

注意,如果每一条记录的操作可能花费比较长的时间,那么意味着阅读器将长时间打开,那么数据库连接也将维持长时间的打开状态。

此时使用非连接的DataSet或许更好一些。

NextResult() :使得数据读取器前进道下一个结果,注意,不是一行记录

IsDBNull():确定指定列中是否包含不存在或缺少的值。

Close():关闭当前SqlDataReader实例。

【GetXXXXX()的用法】索引从0开始→//转载yanjun_xiaoli博客:

访问字段的值 有2种方法。

第一种是Item属性,此属性返回字段索引或者字段名字对应的字段的值。

第二种是Get方法,此方法返回有字段索引指定的字段的值。看例子。

(1) Item属性 每个DataReader类都定义一个Item属性。比如现在我们有一个DataReader实例dr,对应的sql语句是select Fid,Fname from friend,则我们可以使用下面的方法取得返回的值:

object ID = dr[“Fid”]; object Name = dr[“Fname”]; 
或者: object ID = dr[0]; object Name = dr[1]; 注意索引总是从0开始的
但是,使用object来定义ID和Name,Item属性返回的值是object型,我们需要强制类型转换。例如:
int ID = (int)dr[“Fid”]; string Name = (string)dr[“Fname”]; 【!】确保类型转换的有效性是开发者的责任,否则将会得到异常。 
【方法】
SqlDataReader myReader=myCmd.ExecuteReader();
myReader.Read();
Label1.Text=myReader["字段1"];
Label1.Text=myReader["字段2"];
******
(2)Get方法 每个DataReader都定义了一组Get方法。同上面的例子一样我们用如下方式访问Fid和Fname的值: 
int ID = dr.GetInt32(0); 
string Name = dr.GetString(1); 
值得注意的是:
a、这些方法把数据从数据源类型转化为.net数据类型,但是他们不执行其他的数据转换,比如他们不会把16位整数转换为32位的。
b、Get方法不能使用字段名来访问字段,也就是说上面的没有: int ID = dr.GetInt32(“Fid”); //错误 string Name = dr.GetString(“Fname”); 
但是,当字段很多的时候,或者过了一段时间以后再来看这些代码,会觉得很难以理解!一个可行的解决办法是
【方法1】
const: const int FidIndex = 0;
const int NameIndex = 1; 
int ID = dr.GetInt32(FidIndex); 
string Name = dr.GetString(NameIndex); 
这个办法并不怎么好,另外一个好一些的办法:
【方法2】
int NameIndex = dr.GetOrdinal(“Fname”); //取得Fname对应的索引值
string Name = dr.GetString(NameIndex); 
这样似乎有点麻烦,但是当须要遍历阅读器种大量的结果集的时候,这个方法很有效,因为索引只需执行一次。
int FidIndex = dr.GetOrdinal(“Fid”); 
int NameIndex = dr.GetOrdinal(“Fname”); 
while(dr.Read()) 
{
int ID = dr.GetInt32(FidIndex);
string Name = dr.GetInt32(NameIndex); 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

【实例取值】
string strSql = "Data Source=VQJREZV7DVSK2QA;Initial Catalog=gridviewAPP;User ID=sa;Password=admin@123456";
            SqlConnection connew = new SqlConnection(strSql);
            SqlCommand cmd = connew.CreateCommand();
            connew.Open();
            cmd.CommandText = "select userName,sex,address from userInfo";
            SqlDataReader dr = cmd.ExecuteReader();
            System.Console.WriteLine("查询的结果如下:");
            while (dr.Read())
            {
                //string username,string sex,string address
                Label1.Text= dr.GetString(0);
                Label2.Text= dr.GetString(1);
                Label3.Text= dr.GetString(2);
            }
            connew.Close();

******************************************************************************************************************

无奈而华丽丽的分割线【DataReader的创建方法】

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 【1】遍历DataReader结果集

//SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

//SqlDataReader dr = cmd.ExecuteReader();           
            //while (dr.Read())
            //{
            //    Response.Write(dr.GetInt32(0).ToString() + ", " + dr.GetString(1) + "<br>");
            //}
            //dr.Close();

【2】使用列名索引器

SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                Response.Write(dr["ProductId"].ToString() + ", " + dr["Name"].ToString() + "<br>");
            }
            dr.Close();
            myConnection.Close();

【3】使用序数索引器 

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())
             {
                    Response.Write(dr[0].ToString() + ", " + dr[1].ToString()+ "<br>");
             }
【4】操作多个数据集

//SqlDataReader dr = cmd.ExecuteReader();
            dr.NextResult();     //使数据读取器前进到下一个结果集
            do
            {
                while (dr.Read())
                {
                    Response.Write(dr.GetInt32(0).ToString() + ", " + dr.GetString(1) + "<br>");
                }
            }
            while(dr.NextResult());
            dr.Close();

******************************************************************************************************************

无奈而华丽丽的分割线【DataReader注意事项】

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

使用DataReader的一些注意事项:

(1)使用带参数的Command前,必须关闭DataReader;

(2)完成读数据之后一定要关闭DataReader;

(3)不能在层之间远程访问DataReader,它只为已经连接好的数据访问而设计;

(4)一个单一连接每次只能打开一个DataReader;

(5)在默认情况下,DataReader每次执行Read()时候都要将整行加载到内存中

(6)注意,当访问数据时候,使用类型访问器,如GetString等等,这使得你不用将GetValue返回的Object强制转换成特定类型》【切记】

类型访问器有:GetChar(int i);GetDataTime(int i);GetInt16(int i);GetString(int i)之类的。

dr.GetDataTypeName(int i) //获取源数据类型的名称
            dr.GetFieldType((int i) //获取对象的数据类型的Type
            dr.GetName(int i) //获取指定列的名称
            dr.GetOrdinal(int i) //在给定列名称的情况下获取列序号

SqlDataReader的用法(重点:访问字段的值)相关推荐

  1. DataReader类访问字段的值

    DataReader类访问字段的值 有2种方法.第一种是Item属性,此属性返回字段索引或者字段名字对应的字段的值.第二种是Get方法,此方法返回有字段索引指定的字段的值.有点难以理解,不是吗?不要紧 ...

  2. sqlite字段是否存在_学习廖雪峰的JAVA教程---反射(访问字段)

    对任意的一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息. 我们先看看如何通过Class实例获取字段信息.Class类提供了以下几个方法来获取字段: Field getFie ...

  3. EtherType :以太网类型字段及值

    Ethernet II即DIX 2.0:Xerox与DEC.Intel在1982年制定的以太网标准帧格式.Cisco名称为:ARPA Ethernet II类型以太网帧的最小长度为64字节(6+6+2 ...

  4. solr 查询字段唯一值_《Solr实战》之一

    本文记录笔者在阅读<Solr实战>的读书笔记,将笔者认为重要的内容摘录出来. Solr擅长处理的数据类型 以文本为中心 读主导 文档被读取的次数远大于被创建和更新的次数 面向文档 灵活的模 ...

  5. oracle查询时根据查询的时间字段改变状态字段的值

    最近在开发的过程中遇到如下一个场景:oracle数据库商品表里面有商品的下线时间字段shelf_time  和状态字段 goods_statu,有个定时任务定时扫描商品表,如果当前商品状态为1(上线状 ...

  6. elasticsearch获取一个字段的值_Elasticsearch,你觉得自己懂了多少,看看这篇文章吧...

    Elasticsearch分析与检索功能实操 虽然通过文档_id可以获取到文档,但_id字段一般都是一个无意义的值,在实际应用中更多地是使用文档其它有意义字段做检索.Elasticsearch提供一个 ...

  7. PHP二维数组用某个字段的值当做键名

    最近在学习使用array_column函数,发现一个比较实用的用法.很多时候,我们在获取的二维数组都是索引数组,在某些时刻使用时并不方便,最好是能够以某个字段的值作为键名,这样就能更好的使用了.绝大多 ...

  8. sql 查询文本字段中值的长度最长的记录

    一.函数 1.SQL Server LEN() 函数返回文本字段中值的长度. SELECT LEN(column_name) FROM table_name; 2.MySQL LENGTH() 函数返 ...

  9. 【ES6新特性】一行代码解决:搜索对象数组,匹配具体字段属性值的返回值和索引的问题

    arr.find(v => v.key == "需要搜索的值") //返回搜索匹配字段属性值的对象arr.findIndex(v => v.key == "需 ...

  10. awk: (FILENAME=- FNR=1) 致命错误: 试图访问字段 -2

    执行:awk '{print $(NF-2)}' aa.log 出现错误:awk: (FILENAME=aa.log FNR=1) 致命错误: 试图访问字段 -2 可能和aa.log中数据有关系: 改 ...

最新文章

  1. html css js实现快递单打印_html+css+js实现计算器
  2. Win10-OpenCV双目相机开发
  3. aitken插值方法的c++代码_无人驾驶路径规划技术-三次样条插值曲线及Python代码实现...
  4. CentOS 7.1云服务器 配置FTP服务器vsftpd
  5. 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
  6. 【8】万魂杀服务器开发方面之新版GM工具
  7. java制作安卓客户端,java做服务器,android干客户端,实现数据传输
  8. java date sethours,如何替换不推荐使用的方法Date.setHours(int)?
  9. JIRA中设置[描述]字段的默认值
  10. python项目报告怎么写_python项目
  11. FILD FLD FSTP
  12. Jzoj5460【NOIP2017提高A组冲刺11.7】士兵训练
  13. 安卓+七牛云的第三方图片存储实践
  14. mysql报错1517_错误日志 userenv ID1524 1517
  15. iphone/ios兼容问题
  16. 2019牛客多校训练营第一场 H题 HOR 题解
  17. zynq7000 资源介绍
  18. java 工作两年的简历_工作经验只有两年的Java开发,简历中需要写学校经历吗?...
  19. 原生JDK网络编程之NIO篇
  20. 尚学堂Java学习日记Day1

热门文章

  1. STM32 CubeMX 串口通信
  2. 【干货】ArcGIS自动生成拓扑并导出拓扑错误
  3. WinRAR压缩加密
  4. 前端调试,模拟数据利器之Mock Server使用教程来啦~
  5. PS 自定义画笔工具
  6. db2导入发生错误显示不是绝对路径_素材播放有声音导入PR后素材没声音如何解决?...
  7. leach算法的实现过程_LEACH分簇算法实现和能量控制算法实现
  8. BPSK调制gardner算法的MATLAB实现
  9. 红外通信模块——详细资料(含遥控器按键对应的码值)
  10. 100多套毕业论文答辩PPT模板百度网盘链接