第二章:查询和操作数据

本章目标

  1. 会使用DataReader对象检索数据
  2. 会使用Command对象操作数据

讲解内容

为什么要使用DataReader对象

当需要从数据库将数据读取到应用程序时,则需要使用DataReader对象实现。

DataReader对象概述

DataReader 类在 System.Data.SqlClient 命名空间中,对应的类是 SqlDataReader,主要用于读取表中的查询结果,并且是以只读方式读取的(即不能修改 DataReader 中存放的数据)。

正是由于 DataReader 类的特殊的读取方式,其访问数据的速度比较快,占用的服务器资源比较少。

DataReader对象的特点

​ 1、从数据源中检索只读、只进的数据流

​ 2、每次读取一行数据

DataReader 的主要成员

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

DataReader 使用步骤

1713844150202

  1. 创建 Command 对象

    1
    2
    3
    string sql = "SELECT [LoginId] ,[LoginPwd]  FROM [Admin] ";
    //1、创建Command对象
    SqlCommand cmd=new SqlCommand(sql, conn);
  2. 调用 ExecuteReader() 创建 DataReader 对象

    1
    2
    //2、调用command的ExecuteReader方法,返回DataReader对象
    SqlDataReader sdr = cmd.ExecuteReader();
  3. 使用 DataReader 的 Read() 方法逐行读取数据

    如果要获取多条数据,可以多次调用Read方法,可使用循环。

    1
    2
    3
    4
    5
    6
    //3、使用 DataReader 的 Read() 方法逐行读取数据
    sdr.Read();

    while(sdr.Read()){//可循环读取数据

    }
  4. 读取某列的数据,(type)dataReader[ ]

    1. 可以通过SQL查询 语句的索引获取数据,sdr[0]

    2. 可以通过SQL查询语句列名来获取数据,sdr[“列名”]

      获取的数据是Object对象,可将数据转换成对应的数据

    1
    2
    3
    4
    5
    6
    7
    8
     //4、读取数据
    /* string loginId=sdr[0].ToString();
    string loginPwd = sdr[1].ToString();*/

    string loginId = sdr["LoginId"].ToString();
    string loginPwd = sdr["LoginPwd"].ToString();
    Console.WriteLine("账号\t密码");
    Console.WriteLine(loginId+"\t"+loginPwd);
  5. 关闭 DataReader 对象

    1
    2
    sdr.Close();//关闭
    conn.Close();//关闭连接
  6. 完整案例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //创建数据库连接对象
    string conString = "server=.;database=MySchool;uid=sa;pwd=sa;";

    using (SqlConnection conn = new SqlConnection(conString))
    {
    conn.Open();

    string sql = " SELECT StudentNo,StudentName,Sex FROM Student";
    //1、创建Command对象
    SqlCommand cmd = new SqlCommand(sql, conn);
    //2、调用command的ExecuteReader方法,返回DataReader对象
    SqlDataReader sdr = cmd.ExecuteReader();
    //3、使用 DataReader 的 Read() 方法逐行读取数据
    Console.WriteLine("学号\t姓名\t性别");
    while (sdr.Read())
    {
    Console.WriteLine("{0}\t{1}\t{2}", sdr["StudentNo"], sdr["StudentName"], sdr["Sex"]);
    }
    //5、关闭
    sdr.Close();
    }

关闭DataReader对象

1
cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);//执行查询

【完整案例代码:】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//创建数据库连接对象
string conString = "server=.;database=MySchool;uid=sa;pwd=sa;";

SqlConnection conn=new SqlConnection(conString);
conn.Open();
string sql = " SELECT StudentNo,StudentName,Sex FROM Student";
//1、创建Command对象
SqlCommand cmd = new SqlCommand(sql, conn);
//2、调用command的ExecuteReader方法,返回DataReader对象
SqlDataReader sdr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
//3、使用 DataReader 的 Read() 方法逐行读取数据
Console.WriteLine("学号\t姓名\t性别");
while (sdr.Read())
{
Console.WriteLine("{0}\t{1}\t{2}", sdr["StudentNo"], sdr["StudentName"], sdr["Sex"]);
}
//5、关闭
sdr.Close();

Console.WriteLine(conn.State);//查看连接状态为Closed

本章作业

1、管理员输入操作键“3” 时,根据输入的学号查询 相应的学生姓名并输出

1713856591419

2、当管理员输入操作键“4”时,根据姓名模糊查询除密码外的全部学生信息并显示,年级根据实际编号显示年级名称

1713856628432