第3章:数据访问层


本章任务

  1. 实现查询学生信息功能
  2. 实现添加学生成绩功能
  3. 实现修改学生信息功能

本章目标

  1. 掌握使用 using 释放对象

  2. 会使用 SqlParameter 给SQL传递参数

  3. 会使用 ADO.NET 调用存储过程

本章内容

使用using

使用Connection,如何保证连接关闭

使用using 释放Connection对象

using的用法

  • 用法一:导入命名空间
  • 用法二:释放对象占用的资源
    • 如Connection、DataReader 、 FileStream……

使用using 释放SqlConnection

使用using 释放SqlDataReader

using 的本质

使用 SqlParameter

拼接SQL的方法

方式1:

方式2:

SQL注入

拼接SQL语句的弊端

  • 弊端一:不美观,而且容易出现错误
  • 弊端二:安全性差,容易被SQL注入攻击

提示:

参数化查询是能有效避免上述弊端的执行SQL 语句的方式

使用 @ 构造参数化SQL 命令

SqlParameter 对象

和“@”修饰的参数一一对应,用来替换该参数.

SqlParameter 的属性:

属性 说明
DbType 对应数据库的数据类型
Direction 参数是只可输入、只可输出、双向或存储过程返回值参数
IsNullable 参数是否接受空值
ParameterName 参数的名称
Size 参数对应数据的最大大小
SqlDbType SQL Server 数据库的数据类型
Value 参数的值

使用SqlCommand 执行参数化SQL 的步骤

  1. 构造数据库连接对象
  2. 构造参数化SQL 语句
  3. 构造 SqlParameter 对象
  4. 创建SqlCommand 对象, 使用SqlParameter 对象填充数据
  5. 打开数据库连接,执行SqlCommand 命令
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
29
30
31
32
33
34
35
36
37
38
/// <summary>
/// 执行Sql语句将学生信息添加到学生表
/// </summary>
/// <param name="student">Student实体</param>
/// <returns>受影响行数</returns>
public int AddStudent(Student student)
{
using (SqlConnection conn = new SqlConnection(connString))
{

//创建Sql语句
StringBuilder sb = new StringBuilder();
sb.AppendLine("INSERT [Student]");
sb.AppendLine("VALUES");
sb.AppendLine(" (@StudentNo,@LoginPwd,@StudentName,@Sex,@GradeId,@Phone,@Address,@BornDate,@Email,@IdentityCard)");

SqlParameter[] para = new SqlParameter[] {
new SqlParameter("@StudentNo", student .StudentNo .ToString ()) ,
new SqlParameter("@LoginPwd", student .LoginPwd .ToString ()) ,
new SqlParameter("@StudentName", student .StudentName .ToString ()) ,
new SqlParameter("@Sex", student.Gender .ToString ()) ,
new SqlParameter("@GradeId", student .GradeId .ToString ()) ,
new SqlParameter("@Phone", student .Phone .ToString ()) ,
new SqlParameter("@Address", student .Address .ToString ()) ,
new SqlParameter("@BornDate", student .BornDate .ToString ()) ,
new SqlParameter("@Email", student .Email .ToString ()) ,
new SqlParameter("@IdentityCard", student .IdentityCard .ToString ()) };

SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
cmd.Parameters.AddRange(para);
conn.Open();
int iRet = Convert.ToInt32(cmd.ExecuteScalar());

return iRet;

}
}

在.NET中调用存储过程

数据访问方法的安全性

本章总结

  • using语句用于释放系统资源
  • 执行参数化SQL 语句的步骤
  • ADO.NET调用存储过程

课后作业

1.加载年级和科目

  • 添加“查看成绩信息”窗体,在该窗体中,加载年级和科目下拉列表
  • 使用using 释放资源

2.查询学生信息

  • 实现学生信息按“年级”和“姓名”查询功能,支持按“姓名”模糊查询
  • 使用using 释放连接资源

3.添加学生成绩

  • 单击“添加学生成绩”菜单,弹出查询学生窗体
  • 右键单击学生记录,弹出快捷菜单
  • 单击快捷菜单,弹出添加学生成绩窗体

4.调用存储过程修改学生信息

  • 单击列表中的学生在窗体下方显示学生信息
  • 单击“修改”可更新学生信息,同时列表刷新