第一章:访问数据库

本章目标

  1. 了解ADO.NET的功能与组成
  2. 会使用Connection对象连接到数据库
  3. 会使用Command对象查询单个值
  4. 全使用Command对象的常用方法
  5. 会使用using关键字

本章内容

ADO.NET概要

  1. 什么是ADO.NET?

    概念:

    ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库。

    img

  2. ADO.NET的两大组件:

    1. DataSet:数据集,独立于数据源的数据访问

    2. .NET Framework 数据提供程序 :用于连接到数据库、执行命令和检索结果

      img

  3. ADO.NET的结构图:

    1710404829592

连接对象Connection

  1. 为什么要使用连接对象Connection?

    应用程序和数据库是相互独立的程序(个体),但是需要通过应用程序来访问或操作数据库时,必须将它们之间产生联系。那么Connection对象就是它们连接的对象。

    1710405735578

  2. 不同命名空间下的Connection对象

    命名空间 对应的 Connection 对象
    System.Data.SqlClient SqlConnection
    System.Data.OleDb OleDbConnection
    System.Data.Odbc OdbcConnection
    System.Data.OracleClient OracleConnection

    在连接Sql Server数据库时,命名空间System.Data.SqlClient

  3. Connection连接对象的主要成员

    属性名称 说 明
    ConnectionString 连接字符串方法
    方法 说 明
    Open() 打开数据库连接
    Close() 关闭数据库连接
  4. 连接数据库的步骤

    1. 创建连接字符串:

      1
      2
      3
      4
      写法一:
      string connString="Data Source=服务器名;Initial Catalog=数据库名; User ID=用户名;Pwd=密码";
      写法二:
      string connString="server=服务器;database=数据库名;uid=用户名;pwd=密码;";
    2. 创建连接Connection 对象:

      1
      2
      3
      4
      5
      6
      using System.Data.SqlClient;//引入命名空间
      //创建连接对象一
      SqlConnection connection=new SqlConnection(connString);
      //创建连接对象二
      SqlConnection connection=new SqlConnection();
      connection.ConnectionString=connString;//指定连接字符串
    3. 打开连接对象:

      1
      connection.Open();
    4. 关闭连接对象:

      1
      connection.Close();//使用完成后必须关闭数据库连接
  5. 案例:

    1. 使用数据库,后续通过此数据库进行讲解

      1710407322027

    2. 示例代码:

      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
      using System;
      using System.Collections.Generic;
      using System.Data.SqlClient;//引入命名空间
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;

      namespace MySchoolBase
      {
      internal class Program
      {
      static void Main(string[] args)
      {
      //定义连接字符串
      string connString = "server=.;database=myschool;uid=sa;pwd=sa";
      //创建连接对象
      SqlConnection conn=new SqlConnection(connString);
      //打开数据库连接
      conn.Open();
      Console.WriteLine("打开数据库连接成功~");
      //关闭数据库连接
      conn.Close();
      Console.WriteLine("关闭数据库成功~");

      Console.ReadKey();
      }
      }
      }

命令对象Command

  1. Command对象作用:

    Command用于对数据库发出SQL命令,从而执行添加,修改,删除等操作。

    提交SQL命令并从数据源中返回结果。

    1710409417394

  2. Command的主要成员:

    属性名称 说明
    Connection Command对象使用的数据库连接
    CommandText 执行的SQL语句
    方法 说 明
    ExecuteNonQuery() 执行不返回行的语句,如UPDATE等
    ExecuteReader() 返回DataReader对象
    ExecuteScalar() 返回单个值,如执行带COUNT(*)的SQL语句
  3. 创建Command对象

    1
    2
    3
    4
    5
    SqlCommand cmd=new SqlCommand(sql语句, 连接对象);

    SqlCommand cmd=new SqlCommand();
    cmd.CommandText=sql语句;
    cmd.Connection = 连接对象;

ExecuteScalar()方法

返回单个值,如执行带COUNT(*)的SQL语句

1、执行步骤:

1、创建数据库连接,且打开连接

1
2
3
4
5
6
//定义连接字符串
string connString = "server=.;database=myschool;uid=sa;pwd=sa";
//创建连接对象
SqlConnection conn=new SqlConnection(connString);
//打开数据库连接
conn.Open();

2、创建执行的SQL语句,且返回单个数据

1
string sql="select count(1) from Admin"

3、创建执行对象Command

1
SqlCommand cmd=new SqlCommand(sql语句,连接对象);

4、调用ExecuteScalar()方法

注意:此方法返回Object对象,可根据sql语句返回数据进行类型转换

1
cmd.ExecuteScalar();

5、关闭数据库连接

1
conn.Close();

2、示例

输入账号和密码,实现登录功能

完成MySchoolBase系统的登录功能

1、验证管理员的用户名和密码是否存在

2、验证通过,显示登录成功信息

效果如下 图:

1710465013743

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static bool Login()
{
Console.WriteLine("请输入用户名:");
string userName = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();

//创建数据库连接对象
string conString = "server=.;database=MySchool;uid=sa;pwd=sa;";
SqlConnection conn = new SqlConnection(conString);
conn.Open();

//创建sql语句
string sql = string.Format("select count(1) from Admin where LoginId='{0}' and LoginPwd='{1}'",userName, password);

//创建command对象
SqlCommand cmd = new SqlCommand(sql, conn);
int count = (int)cmd.ExecuteScalar();

bool result = count > 0;
conn.Close();

return result;
}

注意事项:

sql 注入:

以上sql语句string sql = string.Format(“select count(1) from Admin where LoginId=’{0}’ and LoginPwd=’{1}’”,userName, password);

当你输入’ or 1=1 –,则可以成功登录

1710467756026

1、如何解决以上问题呢?

不能使用sql语句拼接方式,直接使用Command对象的Parameters属性,添加参数,具体实现方式如下

  1. 方式一,创建SqlParameter对象,且添加参数值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //创建sql语句
    string sql = "select count(1) from Admin where LoginId=@loginId and LoginPwd=@loginPwd";

    //创建参数对象
    SqlParameter sp1 = new SqlParameter("@loginId", userName);
    SqlParameter sp2 = new SqlParameter("@loginPwd",password);
    //创建command对象
    SqlCommand cmd = new SqlCommand(sql, conn);
    //添加参数
    cmd.Parameters.Add(sp1);
    cmd.Parameters.Add (sp2);
  2. 方式二:

    1
    2
    3
    SqlCommand cmd=new SqlCommand(sql, conn);
    cmd.Parameters.AddWithValue("@loginId", userName);
    cmd.Parameters.AddWithValue("@loginPwd", password);

ExecuteNonQuery()方法

返回受影响的行数,通常实现新增(insert)、修改(update)和删除(delete)操作的sql语句

1、执行步骤:

1、创建数据库连接,且打开连接

1
2
3
4
5
6
//定义连接字符串
string connString = "server=.;database=myschool;uid=sa;pwd=sa";
//创建连接对象
SqlConnection conn=new SqlConnection(connString);
//打开数据库连接
conn.Open();

2、创建执行的SQL语句(insert,update,delete),且返回单个数据

1
string sql="insert into Admin(LoginId,LoginPwd) values(@loginId,@loginPwd)";

3、创建执行对象Command,且添加参数

1
2
3
SqlCommand cmd=new SqlCommand(sql语句,连接对象);
cmd.Parameters.AddWithValue("@loginId", userName);
cmd.Parameters.AddWithValue("@loginPwd", password);

4、调用ExecuteScalar()方法

注意:此方法返回Object对象,可根据sql语句返回数据进行类型转换

1
cmd.ExecuteNonQuery();

5、关闭数据库连接

1
conn.Close();

2、示例

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
public static bool Add()
{
Console.WriteLine("请输入用户名:");
string userName = Console.ReadLine();
Console.WriteLine("请输入密码:");
string password = Console.ReadLine();

//创建数据库连接对象
string conString = "server=.;database=MySchool;uid=sa;pwd=sa;";
SqlConnection conn = new SqlConnection(conString);
conn.Open();

//创建sql语句
string sql = "insert into Admin(LoginId,LoginPwd) values(@loginId,@loginPwd)";

SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@loginId", userName);
cmd.Parameters.AddWithValue("@loginPwd", password);

int count = cmd.ExecuteNonQuery();//执行插入操作

bool result = count > 0;
conn.Close();

return result;
}

using关键字

  1. using关键字的作用

    1. 引入命名空间
    2. 释放资源
  2. 具体操作

    1. using指令:引入命名空间

      1
      using System.Data.SqlClient;
    2. using语句:释放资源

      是用来简化资源释放的,在一定的范围内有效,除了这个范围时,自动调用IDisposable释放掉,当然并不是所有的类都适用,只有实现了IDisposable接口的类才可以使用。

      1
      2
      3
      4
      5
      using (SqlConnection conn = new SqlConnection(conString))
      {
      conn.Open();
      ......
      }//此时代码不需要conn.Close();自动释放资源

本章作业

1、完成MySchoolBase系统的登录功能:

  • 验证管理员的用户名和密码是否存在

  • 验证通过,显示登录成功信息

    1710747558229

2、完成MySchoolBase系统的菜单显示功能

  • 管理员选择除操作键“8”以外的值,重新显示菜单

  • 管理员选择操作键“8”时,窗口关闭

  • 当管理员登录成功后显示系统菜单

    1710747751659

    3、实现学生数量查询功能

    ​ 当管理员选择操作键“1 ”时,显示Student表中的学生数量

    1710747841381

    4、完善新增年级记录的功能

    1713856697876

    5、当管理员输入操作键“5”时,输入要修改的学生学号和修改后的出生日的提示,根据学号更新Student表中的出生日出生日输入格式错误、更新成功以及异常发生给出相应提示信息确认数据库中的数据被成功更新

    1713856736666

    6、当管理员输入操作键“7”时,输入学号根据学号删除Student表中的学生信息确认数据库中的数据被成功删除

    1713856785574