一、DataReader:读取查询结果

1.DataReader 类概述

DataReader 类在 System.Data.SqlClient 命名空间中,对应的类是 SqlDataReader。

主要用于读取表中的查询结果,并且是以只读方式读取的(即不能修改 DataReader 中存放的数据)。
    正是由于 DataReader 类的特殊的读取方式,其访问数据的速度比较快,占用的服务器资源比较少。

2.SqlDataReader 类中常用的属性和方法如下表所示。

属性或方法 说明
FieldCount 属性,获取当前行中的列数
HasRows 属性,获取 DataReader 中是否包含数据
IsClosed 属性,获取 DataReader 的状态是否为已经被关闭
Read 方法,让 DataReader 对象前进到下一条记录
Close 方法,关闭 DataReader 对象
Get XXX (int i) 方法,获取指定列的值,其中XXX代表的是数据类型。例如获取当前行第1列 double 类型的值,获取方法为GetDouble(o)

    3.使用 DataReader 类读取查询结果

在使用 DataReader 类读取查询结果时需要注意。

当查询结果仅为一条时,可以使用 if 语句查询 DataReader 对象中的数据。

如果返回值是多条数据,需要通过 while 语句遍历 DataReader 对象中的数据。
    在使用 DataReader 类读取查询结果时需要通过以下步骤完成:

1) 执行 SqlCommand 对象中的 ExecuteReader 方法

SqlDataReader dr=SqlCommand 类实例 .ExecuteReader();

 2) 遍历 SqlDataReader 中的结果

SqlDataReader 类中提供的 Read 方法用于判断其是否有值,并指向 SqlDataReader 结果中的下一条记录。

dr.Read()

如果返回值为 True,则可以读取该条记录,否则无法读取。
    在读取记录时,要根据表中的数据类型来读取表中相应的列。

 3) 关闭 SqlDataReader

4.例:

下面通过实例来演示 SqlDataReader 类的使用。

根据用户姓名查询用户的编号和密码,并将编号和密码显示在标签控件 (Label) 上。
    根据姓名查询用户信息的界面如下图所示。

总之是2个Label控件、1个TextBox控件、1个Button控件。

在该界面中默认情况下显示“没有符合条件的结果”,如果根据文本框中输入的用户名能查询到指定用户的信息,则将默认文字替换成用户编号和密码。

实现该功能的代码如下。

双击“查询”按钮,生成双击事件。

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.SqlClient;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApp14{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            //编写数据库连接串            string connStr = "Data Source=.;Initial Catalog=text;User ID=sa;Password=123";            //创建 SqlConnection的实例            SqlConnection conn = null;            //定义SqlDataReader类的对象            SqlDataReader dr = null;            try            {                conn = new SqlConnection(connStr);                //打开数据库连接                conn.Open();                string sql = "select id,password from userinfo where name='{0}'";                //填充SQL语句                sql = string.Format(sql, textBox1.Text);                //创建SqlCommand对象                SqlCommand cmd = new SqlCommand(sql, conn);                //执行Sql语句                dr = cmd.ExecuteReader();                //判断SQL语句是否执行成功                if (dr.Read())                {                    //读取指定用户名对应的用户编号和密码                    string msg = "用户编号:" + dr[0] + " 密码:" + dr[1];                    //将msg的值显示在标签上                    label2.Text = msg;                }            }            catch (Exception ex)            {                MessageBox.Show("查询失败!" + ex.Message);            }            finally            {                if (dr != null)                {                    //判断dr不为空,关闭SqlDataReader对象                    dr.Close();                }                if (conn != null)                {                    //关闭数据库连接                    conn.Close();                }            }        }    }}

分析:

首先需要追加包:using System.Data.SqlClient;

然后生成“查询”按钮的单击事件。

在里面先编写连接数据库的字符串。

再创建了 SqlConnection的实例后,又定义SqlDataReader类的对象。

而SqlDataReader类:主要用于读取表中的查询结果,并且是以只读方式读取的。也就是不能修改。

通过new SqlConnection(connStr);连接数据库后,再编写SQl的语句字符串。

再通过new SqlCommand进行数据库和数据库语句的连接。

然后通过cmd.ExecuteReader();给它变个类型。

也就能通过Read 方法进行判断其是否有值存在。

如果返回值为 True,则可以读取该条记录,否则无法读取。

最后在关闭 SqlDataReader。

(也就是上面的那三个步骤。)

运行结果:

需要注意的是,实现上述功能的要求是用户表中的用户名是唯一的,以避免出现查询错误。

二、总结回顾

(由于这个数据库严重吃力,所以再重新回顾总结一下。)

首先是关于数据库的下载配置,其实也都是下载软件,并开通sa账户,并且在数据库中创建数据库名称,并在数据库中的表名,在设置字段,好用于存储数据。

都配置好后,就是在VS里的操作了。

1.首先是连接数据库,通过创建SqlConnection的实例。

SqlConnection 连接对象名 = new SqlConnection( 数据库连接串 );

不过在这之前,需要提前编辑“连接数据库”的SQl语句的字符串。

第1种方式,以用户名密码的方式。

server = 服务器名称 / 数据库的实例名 ; uid = 登录名 ; pwd = 密码 ; database = 数据库名称

第2种方式,以用户名密码的方式。

Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; User ID = 用户名 ; Password = 密码

使用 Windows 身份验证的方式登录数据库,以将数据库连接更改如下:

Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; Integrate Security = True

2.打开数据库连接

连接对象名.Open();

3.关闭数据库连接

连接对象名.Close();

除了使用异常处理的方式释放资源外,还可以使用 using 的方式释放资源。

具体的语句如下。

using(SqlConnection 连接对象名 = new SQLConnection( 数据库连接串 ))
{
    //打开数据库连接
    //对数据库先关操作的语句
}

using 关键字的用法主要有两个,一个是引用命名空间,一个是创建非托管资源对象。

例:

string connStr = "Data source=.;Initial Catalog=test;User ID=sa;Password=pwdpwd";using(SqlConnection conn=new SqlConnection(connStr))    {        //打开数据库连接        conn.Open();        MessageBox.Show("数据库连接成功!");    }

连接数据库后,就是对数据库进行操作。

1.首先是跟SQl语句的连接。

需要SqlCommand 类的实例,并且有两种可能:

一种是命令类型为 Text 的

SqlCommand SqlCommand 类的实例名 = new SqlCommand( SQL 语句 , 数据库连接类的实例 );

一种是命令类型为 StoredProcedure 的。

SqlCommand SqlCommand 类的实例名 = new SqlCommand( 存储过程名称 , 数据库连接类的实例 );

而存储过程,需要使用 SqlCommand 类实例的 Parameters 属性来设置。

SqlCommand 类实例 .Parameters.Add( 参数名 , 参数值 );

2.执行对数据表的操作

具体的代码如下。

SqlDataReader dr = SqlCommand 类的实例 .ExecuteReader();

此外,如果在执行查询语句后并不需要返回所有的查询结果,而仅需要返回一个值,例如查询表中的记录行数,这时可以使用 ExecuteScalar 方法。具体的代码如下。

int returnvalue = SqlCommand 类的实例 .ExecuteScalar();

然后就是现在的DataReader:读取查询结果

在使用 DataReader 类读取查询结果时需要通过以下步骤完成:

1) 执行 SqlCommand 对象中的 ExecuteReader 方法

具体代码如下。

SqlDataReader dr=SqlCommand 类实例 .ExecuteReader();

//先连接SqlCommand cmd = new SqlCommand(sql, conn);//执行Sql语句SqlDataReader dr = cmd.ExecuteReader();

2) 遍历 SqlDataReader 中的结果

SqlDataReader 类中提供的 Read 方法用于判断其是否有值,并指向 SqlDataReader 结果中的下一条记录。

dr.Read()

如果返回值为 True,则可以读取该条记录,否则无法读取。
    在读取记录时,要根据表中的数据类型来读取表中相应的列。

3) 关闭 SqlDataReader

xpath返回结果是否有值_【自学C#】|| 笔记 41 DataReader:读取查询结果相关推荐

  1. python微信公众号翻译功能_自学Python笔记:给微信公众号搭建“成绩查询”功能...

    原标题:自学Python笔记:给微信公众号搭建"成绩查询"功能 期末考试 临近年末,全国各地都在上演一场大戏<期末考试>,考完试无论什么样的结果总想尽快看到自己一个学期 ...

  2. python中词云pic_path是什么_自学Python笔记:打造我的第一个词云

    原标题:自学Python笔记:打造我的第一个词云 两会词云 "词云"是对文本中出现频率较高的"关键词"予以视觉上的突出,形成"关键词云层"或 ...

  3. xpath获取标签的属性值_论xpath与css定位方式

    例1:<input id="kw" name="wd" class="s_ipt" value="" maxlen ...

  4. xpath获取标签的属性值_[Selenium]12.加餐: 如何手写xpath

    场景 使用Selenium进行自动化测试,一大难题就是元素定位.虽然Selenium支持使用ID.name.Class.链接文字等多种方式进行元素识别,但对于复杂的网页,采用富客户端框架的前台界面,部 ...

  5. mysql返回第n个值_【单选题】以下MySQL聚合函数,返回n个数值平均值的是( )。 A. MAX B. SUM C...

    突水征兆中辨别"挂汗"现象真伪的方法是剥去煤岩层表面,观察新面是否存在潮气,若煤岩潮湿则是透 石灰岩容易被水溶解形成溶洞.() 探放水设计中应首先标出积水线.探水线和警戒线三条线. ...

  6. adb shell读取返回值_如何在ADB shell中读取耳机状态和读取ACCDET寄存器

    如何在ADB shell中读取耳机状态和读取ACCDET寄存器 录入:edatop.com    点击: [Description] 如何在ADB shell中读取耳机状态和读取ACCDET寄存器 [ ...

  7. 少年自学python笔记_自学python 笔记

    print() 输入 input() 输出 python能够处理的数据类型: 整数.浮点数.字符串("\"转义符,\n 换行).布尔值/布尔代数(True.False(and[或] ...

  8. 少年自学python笔记_自学python笔记(一)

    前言 以前的几篇系列文章一定一定会慢慢整理好的,现在返回头看写的真是乱成豆腐脑,也难为各位看官了.技术专栏好长时间没有更新,技术水平也一直停滞不前.这一次闭关一定一定要有所突破,不吃饭不睡觉也要搞出些 ...

  9. python中成绩分析函数_自学Python笔记:用Python做成绩分析(1)

    有朋友会问,刚学了一周,什么是面向对象都还不清楚就可以写程序?还有Python不是写"爬虫"吗? Python是面向对象的语言,函数.模块.数字.字符串都是对象,并且完全支持继承. ...

  10. es6 数组找最大值_自学Java笔记_day04_第四章 数组

    4.1 数组的相关概念和名词(了解) 1.数组(array): ​ 一组具有相同数据类型的数据的按照一定顺序排列的集合. ​ 把有限的几个相同类型的变量使用一个名称来进行统一管理. 2.数组名: ​ ...

最新文章

  1. mysql 最小日期函数_MySQL 日期加减函数汇总
  2. C#使用CDO发送邮件
  3. 《小岛经济学--鱼、美元和经济的故事》Digest
  4. KVM — 内存虚拟化
  5. 白话Elasticsearch16-深度探秘搜索技术之使用原生cross-fiedls技术解决搜索弊端
  6. php空间限制磁盘限额,ORA-01536:超出表空间XXXX的空间限额
  7. 信息安全工程师笔记-综合知识冲刺(四)
  8. 君威u0073故障码解决_格力多联机同时报三个故障“U2”“L0”“d9”怎么修?
  9. 华为手机harmonyos系统,华为王成录:手机销量仍在增长 未来会是HarmonyOS系统的中心...
  10. python的knn算法list_【风马一族_Python】 实施kNN算法
  11. 如何把hadoop源码关联到eclipse工程中
  12. android7.0 Jack编译器报错解决
  13. python中列表中的字典的排序问题
  14. GoldenDict音标乱码
  15. 工程、通信中的3dB带宽含义
  16. Android逆向第二天
  17. 【java注解--使用注解封装自动拼接sql 】
  18. Excel不用分列函数将单元格中顿号隔开的数求和
  19. linux pam 使用例子,PAM认证模块使用实例
  20. Github 学习 (整理自http://stormzhang.com/github/2016/06/04/learn-github-from-zero4/ 张哥学Git)

热门文章

  1. BZOJ2134 单选错位
  2. 获取元素的位置信息的方法
  3. shell编程四剑客之 find
  4. 全国计算机b类一级考试试题题库,全国计算机等级考试模拟题:一级B试题(一)...
  5. python3.9性能_谁说Python性能差的
  6. linux jsp mysql_Linux JSP连接MySQL数据库
  7. 服务器内存 知乎_巨炮快评! 篇六:16核32线程384GB内存!双路Intel至强数据服务器拆解...
  8. android 悬浮按钮出现隐藏,Android悬浮窗按钮实现点击并显示/隐藏多功能列表
  9. linux raid5 nas,free nas 创建软raid5 来做iscsi服务 1
  10. 动态规划实战11 leetcode-64. Longest String Chain