SqlDataReader类

  可以用SqlDataReader类对象从SQL Server数据库中读取行;用OleDbDataReader类对象从支持OLE DB的数据库中读行,如Oracle与Access;用OdbcDataReader类对象从支持ODBC的数据库中读取行。

  DataReader对象允许你以向前的,只读的方式读取数据,有时候DataReader对象也称为消软管游标。DataReader对象采用了一 种简化的数据读取方式,但是提高了性能的同时也牺牲了很多特性。例如在DataSet中支持的排序,分页等功能。这些功能将在以后的章节进行详细的介绍。

  SqlDataReader的属性

属性 说明
Depth 其返回类型为int,取得表示当前行嵌入深度的值
FieldCount 其返回类型为int,取得当前行的列数
IsColsed 其返回类型为bool,取得一个布尔值,表示是否关闭数据读取
RecordsAffected 其返回类型为int, 取得执行SQL语句增加、修改或删除的行数。

  SqlDataReader的方法

方法 说明
Reader() 其返回类型为bool,将数据阅读器移到结果集的下一行并读取该行。这个方法返回的布尔值表示结果集中是否有多行
GetValue() 其返回类型为object, 返回指定列的值
GetValues() 其返回类型为int,将当前行中所有列的值复制到指定对象数组。这个方法返回的int是数组元素的个数
NextResult() 其返回类型为bool,将数据阅读器移到结果集的下一行。这个方法返回的布尔值表示结果集中是否有多行
Close() 关闭 SqlDataReader 对象
GetInt32(),GetChar(),
GateDataTime(),Get×××()
返回指定列的值,并且返回的类型为相应的数据类型。例如GetInt32()返回整型的数值。注意,如果你将返回值赋予一个类型不匹配的变量时,将会抛出一个InvalidCastException异常

   用ExecuteReader()方法执行查询

  下面是一个用ExecuteReader()方法执行SELECT语句的范例。这个方法用DataReader对象返回结果集,然后可以用此对象读取数据库返回的行。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   string sql = "SELECT top 5 CustomerID,CompanyName,ContactName,Address
09          FROM Customers";
10   SqlCommand cmd = new SqlCommand(sql, con);
11   con.Open();
12   SqlDataReader reader = cmd.ExecuteReader();
13   StringBuilder htmlStr = new StringBuilder("");
14   while (reader.Read())
15   {
16    htmlStr.Append("CustomerID:" + reader["CustomerID"] + "<br>");
17    htmlStr.Append("CompanyName:" + reader["CompanyName"] + "<br>");
18    htmlStr.Append("ContactName:" + reader.GetString(2) + "<br>");
19    htmlStr.Append("Address:" + reader.GetString(3) + "<br>");
20    htmlStr.Append("<hr>");
21   }
22   reader.Close();
23   con.Close();
24   HtmlContent.Text = htmlStr.ToString();
25  }
26 }

  程序代码说明:在上述语法范例的程序代码中,第5到12行代码生成所要的对象并执行SELECT语句,从 Customers表中读取前5条记录。cmd返回的结果集存放在reader对象中,然后你可以用Reader()方法读取reader对象的记录。这 个方法在有另一个可读的行时返回布尔真值,否则返回布尔假值。可以从reader对象中读取一个记录的各个列值,只要在方括号中传入列名即可。如第16和 17行所示,我们用reader[“CustomerID”]读取CustomerID列的各项内容。你也可以直接在方括号中传入数字值指定想要列的索 引。如第18和19行代码所显示,由于我们在用SELECT进行数据查询的时,ContactName和Address分别位于第3和第4列,而相应的索 引值则为2和3,所以我们可以用reader.GetString(2)和reader.GetString(3)读取ContactName和 Address列的数据。如第14行代码所示,我们可以在While循环中用Reader()方法一一读取每条记录。

  执行结果:

 每次程序执行命令时,都要将相应的命令通过网络传递到数据库中,并在数据库进行执行,然后将结果返回到程序中,从而产生大量的网络通信流。我们可以使用ExecuteReader()方法同时执行多条SELECT语句查询减少重复的数据传递。

  下面的实例是使用ExecuteReader()方法同时查询三个表中的数据,并将返回的三个结果集显示在页面上。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   SqlCommand cmd = con.CreateCommand();
09   cmd.CommandText = "SELECT TOP 3 ProductID,ProductName
10   FROM Products ORDER BY ProductID;" +
11    "SELECT TOP 3 CustomerID,CompanyName
12    FROM Customers ORDER BY CustomerID;" +
13     "SELECT TOP 3 OrderID,CustomerID
14     FROM Orders ORDER BY OrderID;";
15   con.Open();
16   SqlDataReader reader = cmd.ExecuteReader();
17   StringBuilder htmStr=new StringBuilder("");
18   int i = 0;
19   do
20   {
21    htmStr.Append("结果集");
22    htmStr.Append(i.ToString());
23    htmStr.Append("<br>");
24    while (reader.Read())
25    {
26     htmStr.Append("reader[0]=" + reader[0]);
27     htmStr.Append("<br>");
28     htmStr.Append("reader[1]=" + reader[1]);
29     htmStr.Append("<br><br>");
30    }
31    htmStr.Append("<hr>");
32    i++;
33   } while (reader.NextResult());
34   reader.Close();
35   con.Close();
36   HtmlContent.Text = htmStr.ToString();
37  }
38 }

  程序代码说明:在上述语法范例的程序代码中,第9行到第14中定义了3个查询语句,各语句之间用分号进行间隔。第 16行调用ExecuteReader()方法,并返回SqlDataReader对象,并且对三条不同的SELECT语句各返回一个结果集。要读取第一 个结果集的话,可以用SqlDataReader对象的Reader()方法。Reader()方法在没有其他的可读行时将返回一个false值。当一个 结果集的所有记录都读取完毕后,可以调用SqlDataReader对象的NextResult()方法,然后在读取下一个结果集,在没有其他的结果集 时,也返回一个false值。

  提示:外循环do…while测试结尾的reader. NextResult()的返回值。由于do…while循环末尾检测这个条件,这样就保证了do…while循环至少执行一次。之所以在末尾才调用 NextResult()方法,是因为这样可以首先把SqlDataReader对象移到下一个结果集,然后才返回表示是否还有下一个结果集的布尔结果。 如果使用while循环中,则有可能直接跳过第一个结果集,从而产生错误。

 用ExecuteScalar()方法执行SELECT语句

  用ExecuteScalar()方法执行SELECT语句,返回单个值,并且忽略其他的任何读取的结果。ExecuteScalar()方法返回的 结果是一个object对象。ExecuteScalar()主要是用来执行SELECT语句,或者执行包括聚合函数的SQL语句。

  下面我们将使用如下的程序读取Products表中的记录条数,并且在相应的查询语句中使用COUNT()聚合函数。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   SqlCommand cmd = con.CreateCommand();
09   cmd.CommandText = "SELECT COUNT(*) FROM Products";
10   con.Open();
11   int returnValue = (int)cmd.ExecuteScalar();
12   HtmlContent.Text = "Products表中共有" + returnValue.ToString()+"条记录";
13  }
14 }

  程序代码说明:在上述语法范例的程序代码中,第9行即为查询Products表中的记录条数的SQL语句。第11行代码用 ExecuteScalar()方法执行SELECT语句。注意,由于ExecuteScalar()方法的结果为object对象,因此我们要将其进行 强制类型转换,再赋予相应的变量。

  执行结果:

转载于:https://www.cnblogs.com/yu68ws/archive/2012/12/17/2821683.html

ASP.NET 2.0中执行数据库操作命令之二相关推荐

  1. ASP.NET 2.0 中的资源与本地化

    转自MSDN 下载本文的代码:BasicInstincts2006_08.exe (878KB) 本页内容 控制页面级别的区域性设置 使用配置文件跟踪语言首选项 ASP.NET 2.0 中的资源文件 ...

  2. 在ASP.NET 2.0中建立站点导航层次

    站点导航提供程序--ASP.NET 2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局.默认的站点导航提供程序是基于XML的,但是你 ...

  3. ASP.NET 2.0用户管理数据库的注册

    在ASP.NET 2.0中提供了许多新功能,这些功能都需要使用Provider提供对数据库的访问.通过Provider,不需要再编写ADO.NET去访问数据库,就可以进行用户.角色等的管理. 要使用. ...

  4. ASP.NET 2.0中如何连接到Mysql(转)

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 最近对mysql比较感兴 ...

  5. 第一次来,试发一帖!--ASP.NET 2.0 中的SqlCacheDependency特性

    ASP.NET中的Page Cache是个很有用的东东,只要简单的在页面上方加上一个OutputCache标签,就可以让页面在制定的Duration内直接把自动保存在缓存中的页面内容输出,而不需要让A ...

  6. ASP.NET 2.0 中改进的缓存功能

    摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能改进 ASP.NET 应用程序的性能和可扩展性.(本文包含一些指向英文站点的链 ...

  7. ASP.NET 2.0 中的新增服务、控件与功能概述(四)

    原文出自http://blog.sina.com.cn/s/blog_48b6cd65010004fc.html 个性化 另一个新增的服务是个性化,它提供了一种现成的解决方案,用于解决存储站点用户的个 ...

  8. 怎么在ASP.NET 2.0中使用Membership

    摘要: 本文介绍了怎么在ASP.NET 2.0中使用Membership新特性,并且介绍了怎么两种不同的Membership的Provider:ActiveDirectoryMembershipPro ...

  9. ASP.NET 2.0中使用自定义provider (2)

    ASP.NET 2.0中使用自定义provider (2) 在tech ed 2005上,有对asp.net 2.0的介绍,其中讲到asp.net 2.0提供了很多功能,让程序员做少很多东西,这引起了 ...

最新文章

  1. 支付宝 php rsa算法,:PHP支付宝接口RSA验证
  2. python 2.6.6安装MySQL-python模块
  3. php原生 文章浏览量,调用WordPress函数统计文章访问量及PHP原生计数器的实现
  4. MVC在filter中如何获取控制器名称和Action名称
  5. 关于页面有多个验证控件和多个按钮的问题
  6. 相声演员侯耀文突发疾病去世享年59岁 深切怀念
  7. Windows中利用计划任务实现自动备份文件
  8. 【iHMI43 应用演示】之 modbus 协议(从机)通信演示
  9. 【转】DICOM命令集和数据集解析!!
  10. 1.9 编程基础之顺序查找 01 查找特定的值
  11. 全新版个人博客小程序,无需开发服务端接口即可使用
  12. 2021年qs世界大学计算机科学排名,2015年QS世界大学计算机专业排名
  13. html常用的符号实体
  14. win11正式版如何安装安卓app windows11正式版安装安卓app的步骤方法
  15. Android:使用SharedPreferences进行数据存储
  16. spring cloud config-配置中心
  17. Eclipse中打包maven项目-war包方式
  18. 2 docker镜像
  19. 【redis:二】持久化
  20. 十月一“闭关修炼”,读完这些Java技术栈,愿金九银十过五斩六

热门文章

  1. OpenCV-Python实战(番外篇)——基于 Haar 级联的猫脸检测器
  2. 顺德职业技术学院计算机专业录取线,顺德职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  3. Java中的系统类–属性,System.out.println()
  4. 深入解析C/C++的优缺点以及就业方向
  5. Java面试题:面向对象的特征有哪些方面?
  6. 大厂,君子好逑?大厂面试题你能过吗
  7. linux安装及配置c++的opencv库
  8. java--迭代(三)foreach解析与字节码
  9. 苹果用户每天解锁iPhone手机80次
  10. LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal