1、第十三章第十三章ADO.NET访问数据库访问数据库软件开发的三层结构软件开发的三层结构连接式访问数据库连接式访问数据库非连接式访问数据库非连接式访问数据库表示层表示层(UI)业务逻辑层业务逻辑层(BLL)数据访问层数据访问层(DAL)DBASP.NET,HTML,CSS,JAVASCRIPTC#ADO.NETSQL SERVER,ORACLEADO.NET 是是.NET 应用程序用来与数据库通讯的模型,用于检索、访问应用程序用来与数据库通讯的模型,用于检索、访问和更新数据。和更新数据。.NET框架数据提供程序框架数据提供程序Data AdapterSelect CommandInsert Co
2、mmandUpdateCommandDeleteCommandDataReaderCommandConnectionDBDataSetDataTableCollectionDataTableDataRowCollectionDataColumnCollectionConstraintCollectionDataRelationCollection连接方式连接方式优点优点缺点缺点连接式连接式1.数据并发性问题更容易控制数据并发性问题更容易控制1.持续的网络连接有时可能导致持续的网络连接有时可能导致网络流量阻塞网络流量阻塞2.数据是当前的和更新的数据是当前的和更新的2.应用程序中的可扩展性和性能应
3、用程序中的可扩展性和性能问题问题非连接式非连接式1.允许多个应用程序同时与允许多个应用程序同时与数据源进行交互。数据源进行交互。2.提高可扩展性和应用程序的提高可扩展性和应用程序的性能性能1.由于没有与数据源建立连接,由于没有与数据源建立连接,数据不是总保持最新数据不是总保持最新2.当多个用户向数据源更新数据当多个用户向数据源更新数据时,可能会发生数据并发性问题。时,可能会发生数据并发性问题。思考:连接式和非连接式应用场合?思考:连接式和非连接式应用场合?1.string ConnStr=Data Source=HUANG-PCSQLEXPRESS;Initial Catalog=School
4、Info;User ID=sa;Password=123456“;2.SqlConnection conn=new SqlConnection();3.conn.ConnectionString=ConnStr;4.if(conn.State=ConnectionState.Closed)5.conn.Open();6.string sql=“select*from student”;7.SqlCommand cmd=new SqlCommand(sql,conn);8.SqlDataReader reader=cmd.ExecuteReader();9.while(reader.Read()
5、10.11.Console.WriteLine(“学号:学号:0,姓名:姓名:1”,reader0.ToString(),reader1.ToString();12.13.reader.Close();14.if(conn.State=ConnectionState.Open)15.conn.Close();思考:假设应用程序有思考:假设应用程序有100个页面,每个页面个页面,每个页面都需要访问数据库。会出现什么问题?都需要访问数据库。会出现什么问题?1.添加应用程序配置文件添加应用程序配置文件App.config2.文件中在文件中在节点中添加连接串节点中添加连接串 3.添加引用,同时页面代码
6、头部添加命名空间添加引用,同时页面代码头部添加命名空间添加引用添加引用System.Configuration添加命名空间添加命名空间Using System.Configuration4.获取连接串获取连接串string ConnStr=System.Configuration.ConfigurationManager .ConnectionStringsconnection.ToString();1.SqlConnection conn=new SqlConnection();2.conn.ConnectionString=ConnStr;3.if(conn.State=Connectio
7、nState.Closed)4.conn.Open();5.int DepID=Convert.ToInt32(Console.ReadLine();6.string DepName=Console.ReadLine();7.int Total=Convert.ToInt32(Console.ReadLine();8.string sql=insert into Department values(+DepID.ToString()+,+DepName+,+Total.ToString()+);9.SqlCommand cmd=new SqlCommand(sql,conn);10.int i
8、Rows=cmd.ExecuteNonQuery();11.if(iRows0)12.Console.WriteLine(success);13.else 14.Console.WriteLine(failed);15.if(conn.State=ConnectionState.Open)16.conn.Close();SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;if(conn.State=ConnectionState.Closed)conn.Open();Console.WriteLine(“请输
9、入要删除的学号请输入要删除的学号”);string StuID=Console.ReadLine();string sql=”delete from student where StuID=”+”+StuID+”;SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.ExecuteNonQuery();if(iRows0)Console.WriteLine(“success”);else Console.WriteLine(“failed”);if(conn.State=ConnectionState.Open)conn.Close();S
10、tring ConnStr=System.Configuration.ConfigurationManager.ConnectionStringsconnection.ToString();SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;if(conn.State=ConnectionState.Closed)conn.Open();Console.WriteLine(请输入要更新的系号请输入要更新的系号);int DepID=Convert.ToInt32(Console.ReadLine();Cons
11、ole.WriteLine(输入新系名输入新系名);string DepName=Console.ReadLine();string sql=update Department set DepName=+DepName+where DepID=+DepID.ToString();SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.ExecuteNonQuery();if(iRows0)Console.WriteLine(success);else Console.WriteLine(failed);if(conn.State=Connec
12、tionState.Open)conn.Close();输入学号,课程号,将输入学号,课程号,将SC表对应的成绩加表对应的成绩加5分。分。string ConnStr=System.Configuration.ConfigurationManager.ConnectionStringsconnection.ToString();SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;if(conn.State=ConnectionState.Closed)conn.Open();Console.WriteLine
13、(请输入学号请输入学号);string StuID=Console.ReadLine();Console.WriteLine(输入课程号输入课程号);int CourseID=Convert.ToInt32(Console.ReadLine();string sql=update SC set Score=Score+5 where StuID=+StuID+and CourseID=+CourseID.ToString();SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.ExecuteNonQuery();if(iRows 0)Co
14、nsole.WriteLine(success);else Console.WriteLine(failed);if(conn.State=ConnectionState.Open)conn.Close();1.创建创建DBHelper.cs文件,加入函数。文件,加入函数。public static void ExecuteNonQuery()string ConnStr=System.Configuration.ConfigurationManager.ConnectionStringsconnection.ToString();SqlConnection conn=new SqlConne
15、ction();conn.ConnectionString=ConnStr;if(conn.State=ConnectionState.Closed)conn.Open();SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.ExecuteNonQuery();if(iRows 0)Console.WriteLine(success);else Console.WriteLine(failed);if(conn.State=ConnectionState.Open)conn.Close();string sql2.根据更新语句,调用根据更
16、新语句,调用ExecuteNonQuery函数。函数。public static void Main()Console.WriteLine(请输入学号请输入学号);string StuID=Console.ReadLine();Console.WriteLine(输入课程号输入课程号);int CourseID=Convert.ToInt32(Console.ReadLine();string sql=update SC set Score=Score+5 where StuID=+StuID+and CourseID=+CourseID.ToString();DBHelper.Execute
17、NonQuery(sql);当连接打开后出错了,导致连接无法关闭,如何解决?当连接打开后出错了,导致连接无法关闭,如何解决?public static void ExecuteNonQuery(string sql)string ConnStr=System.Configuration.ConfigurationManager.ConnectionStringsconnection.ToString();SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;if(conn.State=ConnectionSta
18、te.Closed)conn.Open();SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.ExecuteNonQuery();if(iRows 0)Console.WriteLine(success);else Console.WriteLine(failed);if(conn.State=ConnectionState.Open)conn.Close();可以使用可以使用trycatchfinally结构解决结构解决SqlConnection conn=null;try string ConnStr=System.Configur
19、ation.ConfigurationManager.ConnectionStringsconnection.ToString();conn=new SqlConnection();conn.ConnectionString=ConnStr;if(conn.State=ConnectionState.Closed)conn.Open();SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.ExecuteNonQuery();if(iRows 0)Console.WriteLine(success);else Console.WriteLi
20、ne(failed);catch Console.WriteLine(error);finally if(conn.State=ConnectionState.Open)conn.Close();SqlCommand类中有三个函数:类中有三个函数:1.ExecuteReader2.ExecuteNonQuery3.ExecuteScalar示例:统计示例:统计SC表表A0001号同学的均分,显示出来。号同学的均分,显示出来。String ConnStr=System.Configuration.ConfigurationManager.ConnectionStringsconnection.T
21、oString();SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;if(conn.State=ConnectionState.Closed)conn.Open();string sql=select avg(Score)from SC where StuID=A00001;SqlCommand cmd=new SqlCommand(sql,conn);double avgScore=(double)cmd.ExecuteScalar();Console.WriteLine(avgScore);if(co
22、nn.State=ConnectionState.Open)conn.Close();.NET框架数据提供程序框架数据提供程序Data AdapterSelect CommandInsert CommandUpdateCommandDeleteCommandDataReaderCommandConnectionDBDataSetDataTableCollectionDataTableDataRowCollectionDataColumnCollectionConstraintCollectionDataRelationCollection1.创建连接;创建连接;2.创建创建SqlDataAda
23、pter对象;对象;3.创建创建DataSet对象;对象;4.通过通过SqlDataAdapter将数据库的数据读入将数据库的数据读入DataSet,并断开连接;,并断开连接;5.如读数据,则将如读数据,则将DataSet中内容绑定到控件;如修改数据,则在中内容绑定到控件;如修改数据,则在DataSet中进行修改;中进行修改;6.将修改的数据更新到数据库。将修改的数据更新到数据库。string conStr=System.Configuration.ConfigurationManager .ConnectionStringsconnection.ToString();SqlConnectio
24、n conn=new SqlConnection();conn.ConnectionString=conStr;SqlDataAdapter概念:概念:SqlDataAdapter是是 DataSet和和 SQL Server之间的桥接器,通过对数之间的桥接器,通过对数据源使用适当的据源使用适当的SQL语句填充语句填充(Fill)数据集(数据集(DataSet)和更新)和更新(Update)数据库。数据库。C#提供了提供了SqlDataAdapter类:类:public class SqlDataAdapter public string sql;public SqlConnection co
25、nn;public SqlDataAdapter (string sql,SqlConnection conn)public void Fill(DataSet ds,String TableName)public void Update(DataTable dt)string conStr=System.Configuration.ConfigurationManager .ConnectionStringsconnection.ToString();SqlConnection conn=new SqlConnection();conn.ConnectionString=conStr;str
26、ing sql=select*from student;SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);DataSet概念:概念:DataSet是一个内存数据库,可以包含一个或多个表(是一个内存数据库,可以包含一个或多个表(DataTable)。)。DataRow和和DataColumn就是表中的行和列。就是表中的行和列。实例化实例化DataSet对象:对象:DataSet ds=new DataSet();string conStr=System.Configuration.ConfigurationManager .Connectio
27、nStringsconnection.ToString();SqlConnection conn=new SqlConnection();conn.ConnectionString=conStr;string sql=select*from student;SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);DataSet ds=new DataSet();string conStr=System.Configuration.ConfigurationManager .ConnectionStringsconnection.ToString(
28、);SqlConnection conn=new SqlConnection();conn.ConnectionString=conStr;string sql=select*from student;SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);DataSet ds=new DataSet();adapter.Fill(ds,“student”);string conStr=System.Configuration.ConfigurationManager .ConnectionStringsconnection.ToString()
29、;SqlConnection conn=new SqlConnection();conn.ConnectionString=conStr;string sql=select*from student;SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);DataSet ds=new DataSet();adapter.Fill(ds,“student”);dataGridView1.DataSource=ds.Tables“student”;填充数据集:填充数据集:1.string conStr=System.Configuration.Con
30、figurationManager.ConnectionStringsconnection.ToString();2.SqlConnection conn=new SqlConnection();3.conn.ConnectionString=conStr;4.string sql=select*from student;5.SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);6.DataSet ds=new DataSet();7.adapter.Fill(ds,“student”);插入数据:插入数据:SqlCommandBuilder
31、cmdBuilder=new SqlCommandBuilder(adapter);DataRow row=ds.Tables“student”.NewRow();row“StuID=“A00010”;row“StuName=jack;row“StuAge”=21;row“StuSex”=“男男”;row“StuCity”=“北京市北京市”;row“StuScore”=100;row“DepID”=1;ds.Tables“student”.Rows.Add(row);adapter.Update(ds.Tables“student”);为程序添加为程序添加try-catch结构。提示执行成功还
32、是失败。结构。提示执行成功还是失败。删除数据:删除数据:/填充数据集填充数据集1.SqlCommandBuilder cmdBuilder=new SqlCommandBuilder(adapter);2.foreach(DataRow row1 in ds.Tables“student”.Rows)3.4.if(row1“StuID.ToString().Trim()=“A00010)5.6.row1.Delete();7.break;8.9.10.adapter.Update(ds.Tables“student”);为程序添加为程序添加try-catch结构。提示执行成功还是失败。结构。提
33、示执行成功还是失败。删除数据:删除数据:/填充数据集填充数据集1.SqlCommandBuilder cmdBuilder=new SqlCommandBuilder(adapter);2.foreach(DataRow row1 in ds.Tables“student”.Rows)3.4.if(row1“StuID.ToString().Trim()=“A00006)5.6.row1“StuName”=“new name”;7.break;8.9.10.adapter.Update(ds.Tables“student”);为程序添加为程序添加try-catch结构。提示执行成功还是失败。结
34、构。提示执行成功还是失败。访问数据库可分为访问数据库可分为5个步骤:个步骤:1.创建连接,连接到数据库;创建连接,连接到数据库;2.打开连接;打开连接;3.创建命令对象;创建命令对象;4.执行命令对象;执行命令对象;5.关闭连接。关闭连接。使用使用WINDOWS方式连接串:方式连接串:string ConnStr=Data Source=SQLSERVER01;Initial Catalog=HR;Integrated Security=true;使用使用SQL SERVER验证方式连接串:验证方式连接串:string ConnStr=Data Source=SQLSERVER01;Initi
35、al Catalog=HR;User ID=sa;Password=password;C#中提供了创建连接的类:中提供了创建连接的类:public class SqlConnection public string ConnectionString;public SqlConnection()public void Open()public void Close()思考:如何使用代码实现创思考:如何使用代码实现创建连接对象,及打开连接?建连接对象,及打开连接?SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr
36、;conn.Open();注:使用注:使用C#提供的连接数据库类,需引入命名空间提供的连接数据库类,需引入命名空间using System.Data.SqlClient;C#中提供了创建命令的类:中提供了创建命令的类:public class SqlCommand public SqlConnection Connection;public string CommandText;public SqlCommand(string CommandText,SqlConnection Connection)思考:如何使用代码实现创思考:如何使用代码实现创建命令对象?建命令对象?string sql=
37、“select*from student”;SqlCommand cmd=new SqlCommand(sql,conn);C#中提供了创建命令的类:中提供了创建命令的类:public class SqlCommand public SqlConnection Connection;public string CommandText;public SqlCommand(string CommandText,SqlConnection Connection)/执行查询语句执行查询语句public SqlDataReader ExecuteReader()/执行添加,删除,更新语句执行添加,删除,
38、更新语句public int ExecuteNonQuery()思考:如何使用代码执行命思考:如何使用代码执行命令?令?SqlDataReader reader=cmd.ExecuteReader();public class SqlDataReader/逐行获取缓存中的数据,成功为逐行获取缓存中的数据,成功为true,否则为,否则为false;public bool Read()思考:如何逐行获取数据显示在控制台?思考:如何逐行获取数据显示在控制台?while(reader.Read()Console.WriteLine(“学号:学号:0,姓名:姓名:1”,reader0.ToString(
39、),reader1.ToString();reader.Close();conn.Close();SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;conn.Open();string sql=“select*from student”;SqlCommand cmd=new SqlCommand(sql,conn);SqlDataReader reader=cmd.ExecuteReader();while(reader.Read()Console.WriteLine(“学号:学号:0,姓名:姓名:1”,r
40、eader0.ToString(),reader1.ToString();reader.Close();conn.Close();C#中提供了创建命令的类:中提供了创建命令的类:public class SqlCommand public SqlConnection Connection;public string CommandText;public SqlCommand(string CommandText,SqlConnection Connection)/执行查询语句执行查询语句public SqlDataReader ExecuteReader()/执行添加,删除,更新语句执行添加,
41、删除,更新语句public int ExecuteNonQuery()SqlConnection conn=new SqlConnection();conn.ConnectionString=ConnStr;conn.Open();Console.WriteLine(“请输入要删除的学号请输入要删除的学号”);string StuID=Console.ReadLine();string sql=”delete from student where StuID=”+”+StuID+”;SqlCommand cmd=new SqlCommand(sql,conn);int iRows=cmd.Ex
42、ecuteNonQuery();if(iRows0)Console.WriteLine(“success”);else Console.WriteLine(“failed”);conn.Close();使用使用C#完成添加,修改数据的程序。完成添加,修改数据的程序。1.string ConnStr=Data Source=HUANG-PCSQLEXPRESS;Initial Catalog=SchoolInfo;User ID=sa;Password=123456“;2.SqlConnection conn=new SqlConnection();3.conn.ConnectionString
43、=ConnStr;4.conn.Open();5.int DepID=Convert.ToInt32(Console.ReadLine();6.string DepName=Console.ReadLine();7.int Total=Convert.ToInt32(Console.ReadLine();8.string sql=insert into Department values(+DepID.ToString()+,+DepName+,+Total.ToString()+);9.SqlCommand cmd=new SqlCommand(sql,conn);10.int iRows=
44、cmd.ExecuteNonQuery();11.if(iRows0)12.Console.WriteLine(success);13.else 14.Console.WriteLine(failed);15.conn.Close();1.string ConnStr=Data Source=HUANG-PCSQLEXPRESS;Initial Catalog=SchoolInfo;User ID=sa;Password=123456“;2.SqlConnection conn=new SqlConnection();3.conn.ConnectionString=ConnStr;4.conn
45、.Open();5.Console.WriteLine(请输入要更新的系号请输入要更新的系号);6.int DepID=Convert.ToInt32(Console.ReadLine();7.Console.WriteLine(输入新系名输入新系名);8.string DepName=Console.ReadLine();9.string sql=update Department set DepName=+DepName+where DepID=+DepID.ToString();10.SqlCommand cmd=new SqlCommand(sql,conn);11.int iRows
46、=cmd.ExecuteNonQuery();12.if(iRows0)Console.WriteLine(success);13.else Console.WriteLine(failed);conn.Close();输入学生的学号、课程名和修改后的成绩,将输入学生的学号、课程名和修改后的成绩,将SC表相应的记录成绩修改。表相应的记录成绩修改。string conStr=System.Configuration.ConfigurationManager.ConnectionStringsconnection.ToString();SqlConnection conn=new SqlConne
47、ction();conn.ConnectionString=conStr;conn.Open();string stuID=Console.ReadLine();string courseName=Console.ReadLine();int score=Convert.ToInt32(Console.ReadLine();string sql=update SC set score=+score.ToString()+where StuID=+stuID+and CourseID=(select CourseID from Course where CourseName=+courseName+);SqlCommand cmd=new SqlCommand(sql,conn);int rows=cmd.ExecuteNonQuery();if(rows 0)Console.WriteLine(success);else Console.WriteLine(failed);conn.Close();