详谈ASP.NET的DataReader对象

最近频繁用到了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["价格"]有疑惑,其实这个我叫做超链接传值或者页面间传值吧,这个应该不妨碍大家的阅读和理解,它对应的传值过来的页面我就不传上来了,因为联系不大,就一个传值罢了。

时间: 2024-10-03 04:24:34

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

asp.net内置对象session和cookie

1.各个机器的session对象不同,不同浏览器之间不通用(换个浏览器,是个新的session). 2.session状态对象起始于网页打开,终止于网页关闭,生命周期有限. 3.关闭浏览器/超时的情况下,session对象即被销毁,不要放太多/太大的对象在session. 4.Web应用程序在传统意义上无状态,需要使用内置对象进行客户端状态的保存. 5.session对象和Application对象存储在服务端,cookie对象存储在客户端. 6.session对象适用于安全性相比之下较高的场合

ASP.NET中Server对象

1.asp.net中常见对象: Request:服务器读取浏览器请求中的信息. Response:将服务器中的信息发送给浏览器. Server:获取请求服务器的相关信息. Application:应用程序级对象,多用户之间可以共享数据. Session:会话,用户通过网址访问服务器时会话启动. 下面的图可以简单理解为:我们发布的服务器为Server对象,在服务器上运行的web程序为Application对象,每个客户端对web程序的一个访问就是一个Session 2.Global.aspx 初始

asp.net内置对象Server

1.Server是Context的一个属性,是HttpServerUtility类的一个对象. 2.Server.HtmlDecode(),Server.HtmlEncode(),Server.UrlEncode(),Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用.有的时候很难拿到Server对象,使用HttpUtility. 3.Server.Transfer(path)内部重定向请求,Server.Transfer("hellow.aspx"

DataReader对象(数据读取)

DataReader对象提供了一个只进只读的数据读取器,用于从查询结果中读取数据,它每次仅能读取一行数据. [常用属性]: FieldCount:获取当前行的列数: HasRows:表明查询结果中是否还存在未被读取的数据. [常用方法]: Close:关闭SqlDataReader对象: GetName:获取指定列的名称; Read:使SqlDataReader前进到下一条记录. [使用DataReader对象对数据库进行查询操作步骤]: 1.创建Connection对象: 2.打开数据库连接:

学习ASP.NET MVC(四)——我的第一个ASP.NET MVC 实体对象

今天我将根据数据库中的表结构添加一些类.这些类将成为这个ASP.NET MVC应用程序中"模型"的一部分.       我们使用Entity Framework(实体框架)来定义和使用这些模型类,并且访问数据库.实体框架 (EF) 是一种对象关系映射机制,支持 .NET 开发人员使用特定对象来处理关系数据.它消除了开发人员通常需要编写大部分数据访问代码的工作,所以也称为代码优先开发模式.使用实体框架 ,可以将自定义数据类与数据模型一起使用,而无需对数据类本身进行任何修改. 这意味着可以

asp.net 内置对象Request和Response

Request 1.Request.AppRelativeCurrentExecutionFilePath,获取当前执行请求相对于应用根目录的虚拟路径,以~开头,比如"~Handler.ashx". 2.Request.PhysicalApplicationPath,获取当前应用的物理路径,比如D:\我的文档\VisualStudio 2012\WebSites\WebSite\ 3.Request.PhysicalPath,获取当前请求的物理路径.比如D:\我的文档\VisualSt

ASP.NET 常用五大对象总结- (新手见解)

Response 对象用于从服务器向用户发送输出的结果. Request 对象用于从用户那里取得信息. Application 在一起协同工作以完成某项任务的一组 ASP 文件称为一个应用程序.而 ASP 中的 Application 对象的作用是把这些文件捆绑在一起. Session 对象用于存储关于某个用户会话(session)的信息,或者修改相关的设置.存储在 session 对象中的变量掌握着单一用户的信息,同时这些信息对于页面中的所有页面都是可用的. Server 对象的作用是访问有关

asp.net内置对象

转:http://www.cnblogs.com/MyBeN/archive/2011/03/23/1992591.html (1)简述ASP.NET内置对象. 答:ASP.NET提供了内置对象有Page.Request.Response.Application.Session.Server.Mail和Cookies.这些对象使用户更容易收集通过浏览器请求发送的信息.响应浏览器以及存储用户信息,以实现其他特定的状态管理和页面信息的传递. (2)简述Response对象. 答:Response对象

C#之读取数据:DataReader对象

上一篇涉及到Command对象的ExecuteReader()方法返回一个DataReader对象,那么我们就来详细的介绍这个DataReade对象. 下面的例子使用的数据表依然与上篇的相同为CustomerManagement数据库中的manager数据表: DataReader对象概述 DataReader对象提供了顺序的,只读的方式读取Command对象获得的数据结果集.正是因为DataReader是以顺序的方式连续地读取数据,所以DataReader会以独占的方式打开数据库连接. 由于D