查看: 1194|回复: 0

[.NET源码] ADO.NET

发表于 2018-4-23 08:00:04

目录

  • 一、ADO.NET概要
  • 二、ADO.NET的组成
  • 三、Connection连接对象
    • 3.1、连接字符串
      • 3.1.1、SQL Server连接字符串
      • 3.1.2、Access连接字符串
      • 3.1.3、MySQL连接字符串
      • 3.1.4、DB2连接字符串
      • 3.1.5、Oracle连接字符串
    • 3.2、连接到数据库
    • 3.3、示例
      • 3.3.1、创建数据库与表
      • 3.3.2、创建窗体项目MyCar
      • 3.3.3、连接到数据
  • 四、Command对象
    • 4.1、ExecuteNonQuery
      • 4.1.1、拼接字符串
      • 4.1.2、参数
      • 4.1.3、删除
    • 4.2、ExecuteScalar ()
  • 五、ExecuteReader获得数据
    • 5.1、使用ExecuteReader实现数据查询
    • 5.2、实体类
    • 5.3、DataGridView展示数据
    • 5.4、删除功能
    • 5.5、编辑功能
  • 六、综合示例
    • 6.1、创建数据库与表
      • 6.1.1、创建HR数据库
      • 6.1.2、创建Emp员工表
    • 6.2、创建项目与实体类
      • 6.2.1、创建项目
      • 6.2.2、创建实体类
      • 6.2.3、封装数据访问
    • 6.3、实现展示功能
    • 6.4、实现新增功能
    • 6.5、实现删除功能
    • 6.6、实现编辑功能
    • 6.7、实现搜索功能
    • 6.8、所有代码与扩展
  • 七、作业
    • 7.1、大作业
    • 7.2、第1次小作业
    • 7.3、第2次小作业
  • 八、视频与资料下载
一、ADO.NET概要

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

二、ADO.NET的组成

复制代码
  1. ①System.Data → DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint,DataColumnMapping,DataTableMapping
  2. ②System.Data.Coummon → 各种数据访问类的基类和接口
  3. ③System.Data.SqlClient → 对Sql Server进行操作的数据访问类
  4. 主要有: a) SqlConnection → 数据库连接器
  5. b) SqlCommand → 数据库命名对象
  6. c) SqlCommandBuilder → 生存SQL命令
  7. d) SqlDataReader → 数据读取器
  8. e) SqlDataAdapter → 数据适配器,填充DataSet
  9. f) SqlParameter → 为存储过程定义参数
  10. g) SqlTransaction → 数据库事物
复制代码
复制代码 三、Connection连接对象

Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接。所有Connection对象的基类都是DbConnection类。

3.1、连接字符串

基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)

3.1.1、SQL Server连接字符串

标准安全连接:

Data Source=.;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;

可信连接:

Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;或者

Server=myServerAddress;Database=myDatabase;Trusted_Connection=True;

3.1.2、Access连接字符串

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myDatabase.mdb;User Id=admin;Password=;

3.1.3、MySQL连接字符串

Server=myServerAddress;Database=myDatabase;Uid=myUsername;Pwd=myPassword;

3.1.4、DB2连接字符串

Server=myAddress:myPortNumber;Database=myDatabase;UID=myUsername;PWD=myPassword;

3.1.5、Oracle连接字符串

Data Source=TORCL;User Id=myUsername;Password=myPassword;

在VS中获得连接字符串并连接到数据库:

工具->连接到数据库

选择SQLServer

继续

如上图,填写好相关信息

在高级中可以查看连接字符串的所有信息

在VS中可以实现数据库管理:

3.2、连接到数据库

Connection对象有两个重要属性:

(1)ConnectionString:表示用于打开 SQL Server 数据库的字符串;
(2)State:表示 Connection 的状态,有Closed和Open两种状态。

Connection对象有两个重要方法:

(1)Open()方法:指示打开数据库;

(2)Close()方法:指示关闭数据库。

复制代码
  1. //创建连接对象1
  2. using (SqlConnection conn1 = new SqlConnection("连接字符串"))
  3. {
  4. conn1.Open();
  5. }
复制代码
复制代码 3.3、示例 3.3.1、创建数据库与表 复制代码
  1. /**创建数据库*/
  2. create database MyCar;
  3. go
  4. use MyCar;
  5. /**创建表*/
  6. create table Car
  7. (
  8. Id int primary key identity(1,1), --编号
  9. Title nvarchar(128) not null, --车名
  10. Speed int default(0), --车速
  11. Info ntext --详细
  12. )
  13. /**添加数据*/
  14. insert into Car(Title,Speed,Info)
  15. select 'BYD',130,'比亚迪' union
  16. select 'BMW',160,'宝马' union
  17. select 'Benz',160,'奔驰'
  18. /**查询*/
  19. SELECT [Id]
  20. ,[Title]
  21. ,[Speed]
  22. ,[Info]
  23. FROM [MyCar].[dbo].[Car]
  24. GO
复制代码
复制代码 3.3.2、创建窗体项目MyCar

3.3.3、连接到数据

创建连接对象,打开数据

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. namespace MyCar
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. private void btnConnection_Click(object sender, EventArgs e)
  19. {
  20. //创建连接对象,指定连接字符串参数
  21. SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MyCar;User Id=sa;Password=sa;");
  22. //打开数据
  23. conn.Open();
  24. MessageBox.Show("打开成功,状态"+conn.State);
  25. conn.Close();
  26. MessageBox.Show("关闭数据库成功");
  27. }
  28. }
  29. }
复制代码
复制代码

执行结果:

四、Command对象

Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command主要有三个方法:

4.1、ExecuteNonQuery

ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。用于完成insert,delete,update操作。

复制代码
  1. //新增
  2. private void btnAdd_Click(object sender, EventArgs e)
  3. {
  4. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  5. using (SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  6. {
  7. //打开连接
  8. conn.Open();
  9. //将执行的sql
  10. String sql = "INSERT INTO Car([Title] ,[Speed] ,[Info]) VALUES('奇瑞' ,190,'国产轿车')";
  11. //创建命令对象,指定要执行sql语句与连接对象conn
  12. SqlCommand cmd = new SqlCommand(sql,conn);
  13. //执行,返回影响行数
  14. int rows=cmd.ExecuteNonQuery();
  15. if (rows > 0) MessageBox.Show("新增成功!");
  16. }
  17. //using 相当如下代码,确保连接对象一定会关闭
  18. //SqlConnection conn=null;
  19. //try
  20. //{
  21. // conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar");
  22. //}
  23. //finally
  24. //{
  25. // conn.Close();
  26. //}
  27. }
复制代码
复制代码

执行结果:

4.1.1、拼接字符串 复制代码
  1. private void btnAdd_Click(object sender, EventArgs e)
  2. {
  3. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  4. using (SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  5. {
  6. //打开连接
  7. conn.Open();
  8. //将执行的sql
  9. String sql =String.Format("INSERT INTO Car([Title] ,[Speed] ,[Info]) VALUES('{0}' ,小贝,'{2}')"
  10. ,txtTitle.Text,txtSpeed.Text,txtInfo.Text);
  11. //创建命令对象,指定要执行sql语句与连接对象conn
  12. SqlCommand cmd = new SqlCommand(sql,conn);
  13. //执行,返回影响行数
  14. int rows=cmd.ExecuteNonQuery();
  15. if (rows > 0) MessageBox.Show("新增成功!");
  16. }
  17. }
复制代码
复制代码

执行:

4.1.2、参数

如果直接拼接字符串会存在安全隐患,使用参数可以解决问题。

复制代码
  1. private void btnAdd_Click(object sender, EventArgs e)
  2. {
  3. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  4. using (SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  5. {
  6. //打开连接
  7. conn.Open();
  8. //将执行的sql
  9. String sql = "INSERT INTO Car([Title] ,[Speed] ,[Info]) VALUES(@Ttile,@Speed,@Info)";
  10. //创建命令对象,指定要执行sql语句与连接对象conn
  11. SqlCommand cmd = new SqlCommand(sql,conn);
  12. //指定参数
  13. cmd.Parameters.Add(new SqlParameter("@Ttile", txtTitle.Text));
  14. cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));
  15. cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));
  16. //执行,返回影响行数
  17. int rows=cmd.ExecuteNonQuery();
  18. if (rows > 0) MessageBox.Show("新增成功!");
  19. }
  20. }
复制代码
复制代码

执行结果:

4.1.3、删除

这里的示例是insert,如果想执行delete与update代码是一样的,只是变化了SQL。

示例:

复制代码
  1. /// <summary>
  2. /// 删除
  3. /// </summary>
  4. private void btnDelete_Click(object sender, EventArgs e)
  5. {
  6. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  7. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  8. {
  9. //打开连接
  10. conn.Open();
  11. //将执行的sql
  12. String sql = "delete from Car where Title=@Title";
  13. //创建命令对象,指定要执行sql语句与连接对象conn
  14. SqlCommand cmd = new SqlCommand(sql, conn);
  15. //指定参数
  16. cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));
  17. //执行,返回影响行数
  18. int rows = cmd.ExecuteNonQuery();
  19. MessageBox.Show("删除成功"+rows+"行!");
  20. }
  21. }
复制代码
复制代码

执行结果:

4.2、ExecuteScalar ()

ExecuteScalar ()从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列。

executeScalar主要用于查询单行单列的值,如聚合函数(count,max,min,agv,sum)。

示例:

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. namespace MyCar
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. GetCount();
  18. }
  19. private void btnConnection_Click(object sender, EventArgs e)
  20. {
  21. //创建连接对象,指定连接字符串参数
  22. SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MyCar;User Id=sa;Password=sa;");
  23. //打开数据
  24. conn.Open();
  25. MessageBox.Show("打开成功,状态" + conn.State);
  26. conn.Close();
  27. MessageBox.Show("关闭数据库成功");
  28. }
  29. //新增
  30. private void btnAdd_Click(object sender, EventArgs e)
  31. {
  32. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  33. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  34. {
  35. //打开连接
  36. conn.Open();
  37. //将执行的sql
  38. String sql = "INSERT INTO Car(Title ,Speed ,Info) VALUES(@Ttile,@Speed,@Info)";
  39. //创建命令对象,指定要执行sql语句与连接对象conn
  40. SqlCommand cmd = new SqlCommand(sql, conn);
  41. //指定参数
  42. cmd.Parameters.Add(new SqlParameter("@Ttile", txtTitle.Text));
  43. cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));
  44. cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));
  45. //执行,返回影响行数
  46. int rows = cmd.ExecuteNonQuery();
  47. if (rows > 0) { MessageBox.Show("新增成功!"); GetCount(); }
  48. }
  49. }
  50. /// <summary>
  51. /// 删除
  52. /// </summary>
  53. private void btnDelete_Click(object sender, EventArgs e)
  54. {
  55. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  56. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  57. {
  58. //打开连接
  59. conn.Open();
  60. //将执行的sql
  61. String sql = "delete from Car where Title=@Title";
  62. //创建命令对象,指定要执行sql语句与连接对象conn
  63. SqlCommand cmd = new SqlCommand(sql, conn);
  64. //指定参数
  65. cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));
  66. //执行,返回影响行数
  67. int rows = cmd.ExecuteNonQuery();
  68. MessageBox.Show("删除成功" + rows + "行!");
  69. }
  70. }
  71. /// <summary>
  72. /// 查询单行单列的值
  73. /// </summary>
  74. private void btnScalar_Click(object sender, EventArgs e)
  75. {
  76. GetCount();
  77. }
  78. private void GetCount()
  79. {
  80. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  81. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  82. {
  83. //打开连接
  84. conn.Open();
  85. //将执行的sql
  86. String sql = "select COUNT(*) from Car";
  87. //创建命令对象,指定要执行sql语句与连接对象conn
  88. SqlCommand cmd = new SqlCommand(sql, conn);
  89. //执行查询返回单行单列的值,Object类型
  90. Object result = cmd.ExecuteScalar();
  91. //显示结果到标签
  92. lblCount.Text = result.ToString();
  93. }
  94. }
  95. }
  96. }
复制代码
复制代码

运行结果:

可能返回NULL值,需要对结果进行判断,如下:

复制代码
  1. object my = cmd.ExecuteScalar();
  2. if (object.Equals(my,null)) //可以使用Equals进行Null值的判断,易读性强
  3. Console.WriteLine("Not Data");
  4. else
  5. Console.WriteLine("Yes");
复制代码
复制代码 五、ExecuteReader获得数据

ExecuteReader用于实现只进只读的高效数据查询。

ExecuteReader:返回一个SqlDataReader对象,可以通过这个对象来检查查询结果,它提供了只进只读的执行方式,即从结果中读取一行之后,移动到另一行,则前一行就无法再用。有一点要注意的是执行之后,要等到手动去调用Read()方法之后,DataReader对象才会移动到结果集的第一行,同时此方法也返回一个Bool值,表明下一行是否可用,返回True则可用,返回False则到达结果集末尾。

使用DataReader可以提高执行效率,有两种方式可以提高代码的性能:

一种是基于序号的查找

一个是使用适当的Get方法来查找。因为查询出来的结果一般都不会改变,除非再次改动查询语句,因此可以通过定位列的位置来查找记录。用这种方法有一个问题,就是可能知道一列的名称而不知道其所在的位置,这个问题的解决方案是通过调用DataReader 对象的GetOrdinal()方法,此方法接收一个列名并返回此列名所在的列号。

5.1、使用ExecuteReader实现数据查询

示例代码:

复制代码
  1. //查询
  2. private void btnQuery_Click(object sender, EventArgs e)
  3. {
  4. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  5. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  6. {
  7. //打开连接
  8. conn.Open();
  9. //将执行的sql
  10. String sql = "select Id,Title,Speed,Info from Car";
  11. //创建命令对象,指定要执行sql语句与连接对象conn
  12. SqlCommand cmd = new SqlCommand(sql, conn);
  13. //执行查询返回结果集
  14. SqlDataReader sdr = cmd.ExecuteReader();
  15. //下移游标,读取一行,如果没有数据了则返回false
  16. while (sdr.Read())
  17. {
  18. Console.WriteLine("编号:" + sdr["Id"] + ",车名:" + sdr["Title"] + ",速度:" + sdr["Speed"]);
  19. }
  20. }
  21. }
复制代码
复制代码

运行结果:

5.2、实体类

实体类用于封装及映射数据。

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace MyCar
  6. {
  7. /// <summary>
  8. /// 汽车实体类
  9. /// </summary>
  10. public class Car
  11. {
  12. /// <summary>
  13. /// 编号
  14. /// </summary>
  15. public int Id { get; set; }
  16. /// <summary>
  17. /// 车名
  18. /// </summary>
  19. public String Title { get; set; }
  20. /// <summary>
  21. /// 速度
  22. /// </summary>
  23. public int Speed { get; set; }
  24. /// <summary>
  25. /// 详细
  26. /// </summary>
  27. public String Info { get; set; }
  28. }
  29. }
复制代码
复制代码 5.3、DataGridView展示数据

示例代码:

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. namespace MyCar
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. GetCount();
  18. BindData();
  19. List<User> users = new List<User>();
  20. User tom = new User();
  21. tom.Name = "Tom";
  22. tom.Age = "18";
  23. users.Add(tom);
  24. User rose = new User();
  25. rose.Name = "Rose";
  26. rose.Age = "88";
  27. users.Add(rose);
  28. dataGridView1.DataSource = users;
  29. }
  30. private void btnConnection_Click(object sender, EventArgs e)
  31. {
  32. //创建连接对象,指定连接字符串参数
  33. SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=MyCar;User Id=sa;Password=sa;");
  34. //打开数据
  35. conn.Open();
  36. MessageBox.Show("打开成功,状态" + conn.State);
  37. conn.Close();
  38. MessageBox.Show("关闭数据库成功");
  39. }
  40. //新增
  41. private void btnAdd_Click(object sender, EventArgs e)
  42. {
  43. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  44. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  45. {
  46. //打开连接
  47. conn.Open();
  48. //将执行的sql
  49. String sql = "INSERT INTO Car(Title ,Speed ,Info) VALUES(@Ttile,@Speed,@Info)";
  50. //创建命令对象,指定要执行sql语句与连接对象conn
  51. SqlCommand cmd = new SqlCommand(sql, conn);
  52. //指定参数
  53. cmd.Parameters.Add(new SqlParameter("@Ttile", txtTitle.Text));
  54. cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text));
  55. cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text));
  56. //执行,返回影响行数
  57. int rows = cmd.ExecuteNonQuery();
  58. if (rows > 0) { MessageBox.Show("新增成功!"); GetCount(); BindData(); }
  59. }
  60. }
  61. /// <summary>
  62. /// 删除
  63. /// </summary>
  64. private void btnDelete_Click(object sender, EventArgs e)
  65. {
  66. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  67. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  68. {
  69. //打开连接
  70. conn.Open();
  71. //将执行的sql
  72. String sql = "delete from Car where Title=@Title";
  73. //创建命令对象,指定要执行sql语句与连接对象conn
  74. SqlCommand cmd = new SqlCommand(sql, conn);
  75. //指定参数
  76. cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text));
  77. //执行,返回影响行数
  78. int rows = cmd.ExecuteNonQuery();
  79. MessageBox.Show("删除成功" + rows + "行!");
  80. }
  81. }
  82. /// <summary>
  83. /// 查询单行单列的值
  84. /// </summary>
  85. private void btnScalar_Click(object sender, EventArgs e)
  86. {
  87. GetCount();
  88. }
  89. private void GetCount()
  90. {
  91. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  92. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  93. {
  94. //打开连接
  95. conn.Open();
  96. //将执行的sql
  97. String sql = "select COUNT(*) from Car";
  98. //创建命令对象,指定要执行sql语句与连接对象conn
  99. SqlCommand cmd = new SqlCommand(sql, conn);
  100. //执行查询返回单行单列的值,Object类型
  101. Object result = cmd.ExecuteScalar();
  102. //显示结果到标签
  103. lblCount.Text = result.ToString();
  104. }
  105. }
  106. //查询
  107. private void btnQuery_Click(object sender, EventArgs e)
  108. {
  109. BindData();
  110. }
  111. private void BindData()
  112. {
  113. //定义一个集合,用于存放汽车对象
  114. List<Car> cars = new List<Car>();
  115. //创建连接对象,并使用using释放(关闭),连接用完后会被自动关闭
  116. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  117. {
  118. //打开连接
  119. conn.Open();
  120. //将执行的sql
  121. String sql = "select Id,Title,Speed,Info from Car";
  122. //创建命令对象,指定要执行sql语句与连接对象conn
  123. SqlCommand cmd = new SqlCommand(sql, conn);
  124. //执行查询返回结果集
  125. SqlDataReader sdr = cmd.ExecuteReader();
  126. //下移游标,读取一行,如果没有数据了则返回false
  127. while (sdr.Read())
  128. {
  129. //每一行记录表示一辆车,则实例化一个汽车对象
  130. Car car = new Car();
  131. car.Id = Convert.ToInt32(sdr["Id"]); //取得数据库中当前行的Id转换成int类型给对象的Id属性赋值
  132. car.Title = sdr["Title"] + "";
  133. car.Speed = Convert.ToInt32(sdr["Speed"]);
  134. car.Info = sdr["Info"] + "";
  135. cars.Add(car); //将汽车对象添加到集合中
  136. }
  137. //绑定数据到控件
  138. dgvCar.DataSource = cars;
  139. sdr.Close(); //关闭
  140. }
  141. }
  142. }
  143. }
复制代码
复制代码

运行结果:

5.4、删除功能

示例代码:

复制代码
  1. /// <summary>
  2. /// 删除
  3. /// </summary>
  4. private void btnDelete_Click(object sender, EventArgs e)
  5. {
  6. //SelectedRows选中的行,[0]行,[0]列,Value值
  7. int id = Convert.ToInt32(dgvCar.SelectedRows[0].Cells[0].Value);
  8. //创建连接对象
  9. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  10. {
  11. conn.Open(); //打开连接
  12. string sql = "delete from Car where Id=@Id";
  13. SqlCommand cmd = new SqlCommand(sql, conn); //sql命令对象
  14. cmd.Parameters.Add(new SqlParameter("@Id",id)); //指定参数
  15. int rows = cmd.ExecuteNonQuery(); //执行并返回影响行数
  16. MessageBox.Show("删除成功"+rows+"行!");
  17. BindCar(); //重新绑定
  18. }
  19. }
复制代码
复制代码

运行结果:

5.5、编辑功能

示例代码:

FormCar.cs编辑按钮

复制代码
  1. /// <summary>
  2. /// 编辑
  3. /// </summary>
  4. private void btnEdit_Click(object sender, EventArgs e)
  5. {
  6. //获得当前选择行的索引
  7. int index = dgvCar.SelectedRows[0].Index;
  8. //从集合中获得索引对应的汽车对象
  9. Car car = cars[index];
  10. FormEdit edit = new FormEdit();
  11. edit.car = car;
  12. edit.ShowDialog(); //打开模式窗口
  13. BindCar(); //重新绑定
  14. }
复制代码
复制代码

FormEidt.cs代码:

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Data.SqlClient;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. namespace MyCar
  11. {
  12. public partial class FormEdit : Form
  13. {
  14. /// <summary>
  15. /// 要编辑的汽车对象
  16. /// </summary>
  17. public Car car { get; set; }
  18. public FormEdit()
  19. {
  20. InitializeComponent();
  21. }
  22. private void FormEdit_Load(object sender, EventArgs e)
  23. {
  24. lblId.Text = car.Id+"";
  25. txtTitle.Text = car.Title;
  26. txtSpeed.Text = car.Speed+"";
  27. txtInfo.Text = car.Info;
  28. }
  29. //保存
  30. private void btnSave_Click(object sender, EventArgs e)
  31. {
  32. //创建连接对象
  33. using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=MyCar"))
  34. {
  35. conn.Open(); //打开连接
  36. string sql = "update Car set Title=@Title,Speed=@Speed,Info=@Info where Id=@Id";
  37. SqlCommand cmd = new SqlCommand(sql, conn); //sql命令对象
  38. cmd.Parameters.Add(new SqlParameter("@Id", car.Id)); //指定参数
  39. cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text)); //指定参数
  40. cmd.Parameters.Add(new SqlParameter("@Speed", txtSpeed.Text)); //指定参数
  41. cmd.Parameters.Add(new SqlParameter("@Info", txtInfo.Text)); //指定参数
  42. int rows = cmd.ExecuteNonQuery(); //执行并返回影响行数
  43. MessageBox.Show("修改成功" + rows + "行!");
  44. }
  45. }
  46. }
  47. }
复制代码
复制代码

运行结果:

六、综合示例

完成一个人事管理系统(HR)中的员工(Emp)管理模块,要求实现如下功能:

6.1、创建数据库与表 6.1.1、创建HR数据库
  1. --创建数据库
  2. create database HR;
复制代码

结果:

6.1.2、创建Emp员工表

Emp员工表(编号Id、姓名Name、电话Phone、身高Height、备注Memo)

复制代码
  1. --创建数据库
  2. create database HR;
  3. use HR;
  4. --Emp员工表(编号Id、姓名Name、电话Phone、身高Height、备注Memo)
  5. --创建表
  6. create table Emp
  7. (
  8. Id int primary key identity(100000,1), --编号
  9. Name nvarchar(32) not null, --姓名
  10. Phone varchar(32), --电话
  11. Height int, -- 身高
  12. Memo ntext --备注
  13. )
  14. --添加数据
  15. insert into Emp(Name,Phone,Height,Memo) values('李天明','13723887780',158,'单身');
  16. --查询
  17. select Id,Name,Phone,Height,Memo from Emp;
  18. --删除
  19. delete from Emp where Id=100000
  20. --修改
  21. update Emp set Name='李地明',Phone='13723887789',Height=149 where Id=100001
复制代码
复制代码

结果:

6.2、创建项目与实体类 6.2.1、创建项目

这里同样创建一个WinForms窗体项目

6.2.2、创建实体类 复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace HR.Models
  6. {
  7. /// <summary>
  8. /// 员工
  9. /// </summary>
  10. public class Emp
  11. {
  12. /// <summary>
  13. /// 编号
  14. /// </summary>
  15. public int Id { get; set; }
  16. /// <summary>
  17. /// 姓名
  18. /// </summary>
  19. public String Name { get; set; }
  20. /// <summary>
  21. /// 电话
  22. /// </summary>
  23. public String Phone { get; set; }
  24. /// <summary>
  25. /// 身高
  26. /// </summary>
  27. public int Height { get; set; }
  28. /// <summary>
  29. /// 备注
  30. /// </summary>
  31. public String Memo { get; set; }
  32. }
  33. }
复制代码
复制代码 6.2.3、封装数据访问

为了避免重复的数据访问代码,这里我们封装了一个数据库访问工具类:SqlHelper

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.SqlClient;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. namespace HR.Utils
  8. {
  9. /// <summary>
  10. /// 用于访问SQLServer数据库的工具类
  11. /// </summary>
  12. public class SqlHelper
  13. {
  14. /// <summary>
  15. /// 连接字符串 write once,only once!
  16. /// </summary>
  17. public static String connString = "server=.;uid=sa;pwd=sa;database=HR";
  18. /// <summary>
  19. /// 完成增,删,改
  20. /// </summary>
  21. /// <param name="sql">将要执行的sql</param>
  22. /// <param name="ps">可变参数,指定sql中的参数</param>
  23. /// <returns>影响行数</returns>
  24. public static int Execute(String sql, params SqlParameter[] ps)
  25. {
  26. using (SqlConnection conn = new SqlConnection(connString))
  27. {
  28. //打开连接
  29. conn.Open();
  30. //创建命令对象,指定sql与连接对象conn
  31. SqlCommand cmd = new SqlCommand(sql, conn);
  32. //指定参数
  33. if (ps != null) cmd.Parameters.AddRange(ps);
  34. //执行sql命令,返回影响行数
  35. return cmd.ExecuteNonQuery();
  36. }
  37. }
  38. /// <summary>
  39. /// 执行查询,返回SqlDataReader,一定要关闭
  40. /// </summary>
  41. /// <param name="sql">将要执行的sql</param>
  42. /// <param name="ps">可变参数,指定sql中的参数</param>
  43. /// <returns>SqlDataReader结果集</returns>
  44. public static SqlDataReader Reader(String sql, params SqlParameter[] ps)
  45. {
  46. //定义一个连接对象,指定连接字符串using,sa sa MyCar .
  47. SqlConnection conn = new SqlConnection(connString);
  48. //打开数据库
  49. conn.Open();
  50. //定义命令对象,指定要执行的sql与conn连接参数
  51. SqlCommand cmd = new SqlCommand(sql, conn);
  52. //指定参数
  53. if (ps != null) cmd.Parameters.AddRange(ps);
  54. //执行SQL查询,返回结果集给sdr,关闭reader时也关闭连接
  55. return cmd.ExecuteReader(CommandBehavior.CloseConnection);
  56. }
  57. }
  58. }
复制代码
复制代码

调用办法:

增删改:

  1. int rows = SqlHelper.Execute("delete from Emp where Id=@id",new SqlParameter("id",100002));
  2. MessageBox.Show(rows+"");
复制代码

查询:

复制代码
  1. SqlDataReader sdr = SqlHelper.Reader("select * from Emp where Id=@id",new SqlParameter("id",100003));
  2. if (sdr.Read())
  3. {
  4. MessageBox.Show(sdr["Name"]+"");
  5. }
  6. sdr.Close();
复制代码
复制代码 6.3、实现展示功能

示例代码:

复制代码
  1. #region 绑定员工信息到网格
  2. public void BindData()
  3. {
  4. emps = new List<Emp>();
  5. //执行查询获得结果集
  6. SqlDataReader sdr = SqlHelper.Reader("select Id,Name,Phone,Height,Memo from Emp where Name like @Name",new SqlParameter("@Name",'%'+txtName.Text+"%"));
  7. while (sdr.Read())
  8. {
  9. Emp emp = new Emp();
  10. emp.Id = Convert.ToInt32(sdr["Id"]);
  11. emp.Name = sdr["Name"] + "";
  12. emp.Phone = sdr["Phone"] + "";
  13. emp.Height = Convert.ToInt32(sdr["Height"]);
  14. emp.Memo = sdr["Memo"] + "";
  15. emps.Add(emp);
  16. }
  17. sdr.Close();
  18. dgvEmp.DataSource = emps;
  19. }
  20. #endregion
复制代码
复制代码

运行结果:

6.4、实现新增功能

示例代码:

按钮事件:

  1. FormAdd add = new FormAdd();
  2. add.ShowDialog();
  3. BindData();
复制代码

新增窗口:

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using HR.Utils;
  10. using System.Data.SqlClient;
  11. namespace HR
  12. {
  13. public partial class FormAdd : Form
  14. {
  15. public FormAdd()
  16. {
  17. InitializeComponent();
  18. }
  19. private void btnSave_Click(object sender, EventArgs e)
  20. {
  21. string sql = "insert into Emp(Name,Phone,Height,Memo) values(@Name,@Phone,@Height,@Memo);";
  22. int rows = SqlHelper.Execute(sql,
  23. new SqlParameter("@Name", txtName.Text),
  24. new SqlParameter("@Phone", txtPhone.Text),
  25. new SqlParameter("@Height", txtHeight.Text),
  26. new SqlParameter("@Memo", txtMemo.Text));
  27. MessageBox.Show("新增成功"+rows+"行!");
  28. }
  29. }
  30. }
复制代码
复制代码

运行结果:

6.5、实现删除功能

示例代码:

复制代码
  1. #region 删除
  2. private void btnDelete_Click(object sender, EventArgs e)
  3. {
  4. int id =Convert.ToInt32(dgvEmp.SelectedRows[0].Cells[0].Value);
  5. int rows = SqlHelper.Execute("delete from Emp where Id=@Id",new SqlParameter("@Id",id));
  6. MessageBox.Show("删除成功"+rows+"行");
  7. BindData();
  8. }
  9. #endregion
复制代码
复制代码

运行结果:

6.6、实现编辑功能

示例代码:

按钮事件:

复制代码
  1. //取得索引
  2. int index=dgvEmp.SelectedRows[0].Index;
  3. FormEdit edit = new FormEdit();
  4. edit.emp = emps[index];
  5. edit.ShowDialog();
  6. BindData();
复制代码
复制代码

窗体代码:

复制代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.SqlClient;
  10. using HR.Utils;
  11. using HR.Models;
  12. namespace HR
  13. {
  14. public partial class FormEdit : Form
  15. {
  16. public FormEdit()
  17. {
  18. InitializeComponent();
  19. }
  20. public Emp emp { get; set; }
  21. private void btnSave_Click(object sender, EventArgs e)
  22. {
  23. string sql = "update Emp set Name=@Name,Phone=@Phone,Height=@Height,Memo=@Memo Where Id=@Id";
  24. int rows = SqlHelper.Execute(sql,
  25. new SqlParameter("@Name", txtName.Text),
  26. new SqlParameter("@Phone", txtPhone.Text),
  27. new SqlParameter("@Height", txtHeight.Text),
  28. new SqlParameter("@Memo", txtMemo.Text),
  29. new SqlParameter("@Id", emp.Id));
  30. MessageBox.Show("修改成功" + rows + "行!");
  31. }
  32. private void FormEdit_Load(object sender, EventArgs e)
  33. {
  34. txtHeight.Text = emp.Height + "";
  35. txtMemo.Text = emp.Memo;
  36. txtName.Text = emp.Name;
  37. txtPhone.Text = emp.Phone;
  38. }
  39. }
  40. }
复制代码
复制代码

运行结果:

6.7、实现搜索功能

示例代码:

按钮:

复制代码
  1. #region 查询
  2. private void btnQuery_Click(object sender, EventArgs e)
  3. {
  4. BindData();
  5. }
  6. #endregion
复制代码
复制代码

BindData()方法

复制代码
  1. #region 绑定员工信息到网格
  2. public void BindData()
  3. {
  4. emps = new List<Emp>();
  5. //执行查询获得结果集
  6. SqlDataReader sdr = SqlHelper.Reader("select Id,Name,Phone,Height,Memo from Emp where Name like @Name",new SqlParameter("@Name",'%'+txtName.Text+"%"));
  7. while (sdr.Read())
  8. {
  9. Emp emp = new Emp();
  10. emp.Id = Convert.ToInt32(sdr["Id"]);
  11. emp.Name = sdr["Name"] + "";
  12. emp.Phone = sdr["Phone"] + "";
  13. emp.Height = Convert.ToInt32(sdr["Height"]);
  14. emp.Memo = sdr["Memo"] + "";
  15. emps.Add(emp);
  16. }
  17. sdr.Close();
  18. dgvEmp.DataSource = emps;
  19. }
  20. #endregion
复制代码
复制代码

运行结果:

6.8、所有代码与扩展

FormMain.cs

View Code

FormEmp.cs

View Code

FormAdd.cs

View Code

FormEdit.cs

View Code

扩展:多删除(一次选择多行删除)、多条件组合搜索、分页。

七、作业 7.1、大作业

实现一个产品管理系统(GoMall),完成对产品(Product)的维护。

1)、创建一个数据库GoMall

2)、定义一个表产口Product(编号Id,名称Name,价格Price,详细Details),添加5个测试数据

3)、创建一个Winform项目,名称为GoMall

4)、完成展示功能

5)、完成新增功能

6)、完成删除功能

7)、完成修改功能

8)、扩展功能,添加一个类型表,在产品中添加类型外键;实现按名称搜索功能。

7.2、第1次小作业

1、使用ADO.NET实现增加,删除操作,要求3个字段以上,同时用拼接字符串与带参数的两种办法。

2、使用ExecuteScalar实现单行单列值的查询。

7.3、第2次小作业

1、使用ADO.NET实现“展示”功能。

2、使用ADO.NET实现“删除”功能。

3、使用ADO.NET实现“编辑”功能。

八、视频与资料下载

示例:https://coding.net/u/zhangguo5/p/ADO.NET/git

视频:地址https://www.bilibili.com/video/av15651626/

转载自:https://www.cnblogs.com/best/p/7714500.html#undefined。



回复

使用道具 举报