最近频繁用到了DataReader这个对象,其实对于DataReader,之前也用到过,说实话我个人觉得很不好懂。相比之下觉得DataSet对象好用的多,但是有时取出的数据不需要很多的时候,DataReader还是很有用的。

在此就对DataReader进行一下解释,这也是个人对DataReader的理解,难免会有错误,大家互相学习下。有理解上的错误也希望大家能过指正出来,帮助我更好的理解,谢谢。

首先DataReader相比于DataSet,DataReader是一个抽象类,所以不能用

DataReader DR = new DataReader(),来构造函数创建对象,如果要创建一个DataReader对象,必须通过command对象的ExecuteReader方法。

其次,DataReader对象访问数据的方式,只能顺序读取数据,而且不能写入数据(这点DataSet占据绝对的优势),所谓的顺序读取数据是将数据表中的行从头至尾一次读出。DataReader被创建时,纪录指针在表的最前端,可以使用Read方法每次从表中读取一条纪录。

总的来说DataSet存的是二维数组,而DataReader存的是一维数组。而且DataSet采用的是非连接的传输模式访问数据源,一旦用户所请求的数据读入DataSet,与数据库的连接就关闭,而DataReader则要时刻保持与数据库连接状态。

就我来说,重要的和常用的属性和方法:

FieldCount属性 获取DataReader对象所包含的纪录行数

Close() 关闭DataReader对象

其实有各种GetBoolean(col),GetChar(col),GetString(col),GetDateTime(col),GetInt32()等等获取序号为col的列的值,而这些基本上可以被GetValue(col)方法所取代。

GetValue(col) 获取序号为col的列的值

GetValues(values) 获取所有字段的值,并将字段值存放到values数组中

GetValues(values)方法原来我不会用,特别是对于这个values数组是哪里来的,以及如果自定义该定义为什么类型呢,后来百度就知道了,用这个方法之前,Object[] values = new Object[sqlrd.FieldCount];这个是定义values数组的方法前提。

Read() 读取下一条纪录,返回布尔型,返回true,则表示有下一条纪录。一般这个方法与while()循环一起用。是DataReader对象最重要的一个方法。

其他的无关痛痒的方法:(我觉得这个在提取数据的时候,不知道具体的数据类型,用来查看数据的数据类型的作用居多,或者用来查找问题调试吧。反正我一般用不到这些个方法)

GetDataTypeName(col) 获取序号为col的列的来源数据类型名

GetFieldType(col) 获取序号为col的列的数据类型,一般显示会是System.**

GetName(col) 获取序号为col的列的字段名

GetOrdinal(name) 获取字段名为name的列的序号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
protected void Page_Load(object sender, EventArgs e)
        {
            string price = Request.QueryString["价格"];
            string con = ConfigurationManager.ConnectionStrings["con"].ToString();
            SqlConnection sqlcon = new SqlConnection(con);
            string sql = "select * from Cloths where 价格 = '" + price + "'";
            //string sql = "select * from Cloths";
            sqlcon.Open();
            SqlCommand sqlcom = new SqlCommand(sql, sqlcon);
            SqlDataReader sqlrd;
            sqlrd = sqlcom.ExecuteReader();
            Response.Write("获取DataReader对象包含的记录行数,注意这里DataReader的结构跟数据库的结构是不一样的,它把数据库的一行转换成了一列:" + sqlrd.FieldCount);
            Response.Write("<br>");
            Response.Write("获取序号为0的列的来源数据类型名:" + sqlrd.GetDataTypeName(0));
            Response.Write("<br>");
            Response.Write("获取序号为0的列的数据类型:" + sqlrd.GetFieldType(0));
            Response.Write("<br>");
            Response.Write("获取序列号为0的列的字段名:"+sqlrd.GetName(0));
            Response.Write("<br>");
            Response.Write("获取字段名为品牌的列的序号:"+sqlrd.GetOrdinal("品牌"));
            Response.Write("<br>");
            while (sqlrd.Read())
            {
                Response.Write("<br>");
                Response.Write(sqlrd["id"] + "," + sqlrd["品牌"] + "," + sqlrd["价格"] + "," + sqlrd["数量"]);
                Response.Write("<br>");
                Response.Write("<br>");
                Response.Write("下面的显示要注意,为什么序列号为0的是品牌而不是id,虽然GridViewCommon页面第一列是id,不过这里是要充分尊重数据库的结构,可以看出数据库中第一列是品牌!");
                Response.Write("<br>");
                Response.Write("这里通过GetString函数取出序号为0的列的数据,这里要根据数据的不同类型选用不同的Get函数,可能是GetChar(),GetInt32()等等:"+sqlrd.GetString(0));//这里可以看出GetValue函数可以不需要事先知道每一列的数据类型就可以取出数据,所以尽量用GetValue函数
                Response.Write("<br>");
                Response.Write("这里通过GetValue函数取出序号为0的列的数据,不需要管数据时什么类型,这里注意跟上面的比较:" + sqlrd.GetValue(0));
                Response.Write("<br>");
                Response.Write("<br>");
                Response.Write("这里是运用GetValue()的方法提取显示数据的:");
                for (int i = 0; i < sqlrd.FieldCount;i++ )//这里通过循环取出数据,其实就是循环使用GetValue()方法
                {
                    Response.Write(sqlrd.GetValue(i));//这个是一步一步取数据,用的是GetValue()方法,相比于GetValues,GetValues是一步到位,只要循环数组就好
                    Response.Write("<br>");
                }
                Response.Write("<br>");
                Response.Write("这里是运用GetVales()方法提取显示数据的:");
                Response.Write("<br>");
                Object[] values = new Object[sqlrd.FieldCount];//这一步是很重要的,你要先给定义一个数组
                sqlrd.GetValues(values);//注意这边是用的是GetValues(values)方法
                Response.Write(values[0]+","+values[1]+","+values[2]+","+values[3]+","+values[4]);
                Response.Write("<br>");
                for (int i = 0; i < sqlrd.FieldCount;i++ )//这里是循环的values数组,而不是GetValues(values)方法
                {
                    Response.Write("<br>");
                    Response.Write(values[i]);
                    Response.Write("<br>");
                }
 
            }
            sqlrd.Close();
            Response.Write("<br>");
            Response.Write(sqlrd.RecordsAffected);//获取执行SQL语句所更改,插入或删除的行数
            sqlcon.Close();
        }

这是对应的Cloths数据库的设计和内容:

这个是效果图:

可能有同学对于代码中的string price = Request.QueryString["价格"]有疑惑,其实这个我叫做超链接传值或者页面间传值吧,这个应该不妨碍大家的阅读和理解,它对应的传值过来的页面我就不传上来了,因为联系不大,就一个传值罢了。

详谈ASP.NET的DataReader对象的更多相关文章

  1. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  2. C#与数据库访问技术总结(十三)之DataReader对象

    DataReader对象与数据获取 DataReader对象以“基于连接”的方式来访问数据库. 也就是说,在访问数据库.执行SQL操作时,DataReader要求一直连在数据库上. 这将会给数据库的连 ...

  3. ASP.NET中application对象

    ASP.NET中application对象的使用. Application对象的应用  1.使用Application对象保存信息  (1).使用Application对象保存信息  Applicat ...

  4. 初识 Asp.Net内置对象之Response对象

    Response对象 Respose对象用于将数据从服务器发送回浏览器.它允许将数据作为请求的结果发送到浏览器,并提供有光响应的信息,可以用来在页面中输入数据,在页面中跳转,还可以传递各个页面的参数, ...

  5. ASP.NET Ajax核心对象

    本章学习目标 主要掌握AJAX的基本概念和实现机制,学习并创建XMLHttpRequest对象,使用XMLHttpRequestObject对象获取服务器端的数据 主要内容如下,请点击ASP.NET ...

  6. ADO.NET笔记——使用Connection连接数据库,使用Command对象的ExecuteReader()方法创建DataReader对象返回多行数据

    使用Connection连接数据库,使用DataReader访问数据库,并返回多行数据. 相关步骤: 需要引入两个命名空间 using System.Data; using System.Data.S ...

  7. ASP.NET 内置对象涉略

    一.ASP.NET中内置的常用对象的介绍 本文列举了ASP.NET 的八个内置对象,其中前五个是比较常用的. 1.Response Response 对象用于从服务器向用户发送输出的结果. Write ...

  8. ASP.NET中application对象的用法(面试题)

    ASP.NET中application对象的用法 本文导读:Application对象是HttpApplicationState类的一个实例,Application状态是整个应用程序全局的.Appli ...

  9. Asp.Net WebApi核心对象解析(二)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

随机推荐

  1. 通用shellcode

    所有 win_32 程序都会加载 ntdll.dll 和 kernel32.dll 这两个最基础的动态链接库.如果想要 在 win_32 平台下定位 kernel32.dll 中的 API 地址,可以 ...

  2. 第十六次ScrumMeeting博客

    第十六次ScrumMeeting博客 本次会议于12月5日(二)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容和链接): ...

  3. Vim操作指南

    vim具有6种基本模式和5种派生模式. 基本模式 普通模式 插入模式 可视模式 选择模式 命令行模式 Ex模式 派生模式 操作符等待模式 插入普通模式 插入可视模式 插入选择模式 替换模式 1.移动光 ...

  4. 作业 20181204-5 Final阶段贡献分配规则及实施

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2479] 小组介绍 组长:付佳 组员:张俊余 李文涛 孙赛佳 田良 于洋 ...

  5. Scrum Meeting day 1

    第一次会议,在这一次的会议中,明确了任务目标,并将任务进行合理分配,并且规划了整个任务的初步计划. No_00:分工情况 姓名 分工   崔强      PM 杜正远 主力工程师 王嘉豪 主力工程师 ...

  6. Linux第七周学习总结——可执行程序的装载

    Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  7. ElasticSearch 2 (14) - 深入搜索系列之全文搜索

    ElasticSearch 2 (14) - 深入搜索系列之全文搜索 摘要 在看过结构化搜索之后,我们看看怎样在全文字段中查找相关度最高的文档. 全文搜索两个最重要的方面是: 相关(relevance ...

  8. A+B Format 思路及解题过程结果

    A+B Format 思路及解题过程结果 github链接 题目 解题思路 这个题目的难点在于每三位用逗号隔开,以及带不带负号的问题.第一个问题,我的解决办法是先通过取整来取数,再通过取余来去数.第二 ...

  9. CentOS下 NFS的简单使用以及windows 关在linux的NFS存储方法

    1. 全部安装的情况下NFS已经安装到服务器上面了,如果没有安装的话 需要使用如下命令进行安装 yum -y install nfs-utils rpcbind 2. 创建需要使用的NFS目录 mkd ...

  10. SpringBoot 1.快速搭建一个 SpringBoot Maven工程

    一.新建一个Maven工程 (1)选择创建简单MAVNE工程 (2)输入你自己的MAVEN工程的Group Id(必填).Artifact Id(必填).Version(必填).Packaging(必 ...