一、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,则可以读取该条记录,否则无法读取。
在读取记录时,要根据表中的数据类型来读取表中相应的列。