1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,9,章,ADO.NET,与数据库操作,从编程角度看数据库访问机制,ADO.NET,主要的类,利用可视化对象直接建立数据访问,使用,OleDb,数据库访问,访问,SQL Server,数据库,DataSet,数据绑定及编辑,DataGridView,控件,访问,SQL Server,数据库的视图,DataSet,数据绑定及编辑,1.,从编程角度看数据库访问机制,使用现代的开发工具,程序员对数据库的访问一般都是,间接的,。即通过一个中间件(数据库访问,接口,)访问数据库。,这样做的好处是程序员不必知道数据库的种
2、类及细节,只需熟悉数据库访问接口和,SQL,语言,就能以,一致,的方式访问各种数据库。,访问模式,数据库,SQL SERVERACCESSORACLEMYSQL,文本文件,数据访问接口,ADOADO.NET,JDBC,数据库连接对象,SQL,命令对象,查询结果集对象,数据绑定及显示控件,ADO.NET,结构,使用统一的,SQL,数据访问模型实现对各种使用,SQL,语句的数据库的数据访问支持。,ADO.NET,对象模型,2.NET,关于数据库主要的类,.NET,有关数据库访问的中间件叫,ADO.NET,它是,ADO,的改进,ADO.NET,有关数据库访问的类分为两组:,一组是,通用的,数据库访问
3、类,可以访问所有主流的数据库,但一般用于,Access,等。,另一组是针对具体数据库专门,优化,了访问性能的类,专用于,SQL Server,或,Oracle,数据库,是我们主要使用的方式。,.Net,中,SQL Server,数据库的分类,.Net,提供了,3,种,与,SQL Server,数据库的连接形式。分别为:,SQL Server,:与,SQL Server,服务器上的数据库连接,这是主流的、也是我们采用的。,SQL Server Compact 3.5,:更简单的,SQL Server,数据库版本,是基于文件的数据库。,SQL Server,数据库文件,:用于和,SQL Serve
4、r Express,数据库文件建立连接。本书均用,SQL Server Express,(需要安装),,我们不使用该方式,本章与书中差异较大!,通用的数据库访问类,名称空间:,Syetem.Data.,OleDb,OleDb,Connection,:,数据库连接/关闭,OleDb,Command,:,发送,SQL,命令或调用存储过程、,视图等,OleDb,DataAdapter,:,存储数据结果集并填充,DataSet,OleDb,DataReader,:,存储只能向前读的数据结果集,,速度快(保持连接),名称空间:,Syetem.Data,DataSet,:,是,内存中,的“关系数据库”,数
5、据由,OleDbDataAdapter,填充,也可以自己添加删除。,在断开数据库连接的情况下,,DataSet,仍然存在,SQLServer,专用访问类,名称空间:,Syetem.Data.,SqlClient,Sql,Connection,:,数据库连接/关闭,Sql,Command,:,发送,SQL,命令或调用存储过程、视图,Sql,DataAdapter,:,存储数据结果集并填充,DataSet,Sql,DataReader,:,存储只能向前读的数据结果集,速度快,名称空间:,Syetem.Data,DataSet,:,实际上是通用的,与前面相同,通用的数据库访问实例对象间的关系,各种数
6、据库,AOD.NET,OleDbConnection,OleDbCommand,OleDbDataAdapter,OleDbDataReader,DataSet,连接,SQL,命令,查询,结果集,结果集,填充,数据绑定及显示控件,绑定,结果集,绑定,用,UML,可表示为顺序图,SQL Server,数据库访问实例对象间的关系,SQL Server,AOD.NET,SqlConnection,SqlCommand,SqlDataAdapter,SqlDataReader,DataSet,连接,SQL,命令,查询,结果集,结果集,填充,数据绑定及显示控件,绑定,结果集,绑定,用,UML,可表示为顺
7、序图,3.,利用可视化对象直接建立数据访问,数据访问可视化工具,操作演示,新建一个,Windows,应用程序,在菜单“视图”中打开“,服务器资源管理器,”,确保本机的,SQL SERVER,服务已开启,数据库可访问。,连接数据库,右键点击“数据连接”,选择“,添加连接,”,或“,创建新,SQL SERVER,数据库,”,可以在此选择数据库服务器、验证方式、数据库等。,可点击“测试连接”,可点击“,更改,”选择数据库访问模式,前图中点击“更改”按钮,完成后的情况,连接成功,则会出现选择的数据库及其中的数据表等。,可以在此进行添加、修改等对数据库的各种操作,新建数据库,如果不是使用现有数据库,也可
8、以新建立自己的数据库,右键单击“数据连接”,选择“创建新的,SQL Server,数据库”命令,弹出新建窗口,点“确定”后就建立了一个空数据库,在“服务器资源管理器”的“数据连接”项下出现该数据库,右键单击“表”,选择“添加新表”命令,然后进行表中列的添加,包括列名、数据类型等,单击“保存”按钮,保存名为,Class1,的表,在“表”列表中,出现,Class1,表。右键单击,Class1,,选择“显示表数据”(也许是“检索数据”)命令,然后可以进行记录的添加,信息添加完后,在窗口,边缘,空白部分,右键选择“执行,SQL”,,即可将数据添加到表中,为项目添加数据源,建立好连接后,可为项目添加数据
9、源,数据源为项目获取数据的来源。,作用是将数据和数据显示控件绑定到一起,便于显示或编辑数据。,在“,数据,”菜单中选择“添加新数据源”,按向导步骤进行,选择希望显示的表、字段等。,可以添加多个数据源,添加数据源之后的情况,显示数据并运行,在数据源窗口,将需在界面中显示的数据及其使用的控件,拖放到窗体界面中即可,4.,使用,OleDb,数据库访问,使用“半自动”的方式,主要过程:,选择数据源:选为“,Microsoft Access,数据库文件”,则采用,OleDb,方式。,建立,连接,:,OleDbConnection,(,可以,用对象浏览器看,看,OleDbConnection,类,的属性和
10、方法),获得,数据,:,OleDbDataAdapter,返回查询,结果,:,DataSet,绑定,到数据控件:,DataGrid,建立与现有数据库的连接,右键单击“数据连接”,选择“添加连接”命令,弹出窗口,选择数据库类型。,点“继续”,出现添加连接窗口,“浏览”按钮找到数据库文件,“高级”按钮可以打开具体连接属性的窗口,一般不用。,“测试连接”可以先看看连接上没有,“确定”,完成添加连接,此时“服务器资源管理器”中出现了我们连接的数据库及其相关内容,我们可以通过此连接,开发访问该数据库的程序,使用,OleDbDataAdapter,访问数据库,如果希望自己来通过 应用程序操作数据库,需要先
11、在工具箱中添加,OleDbDataAdapter,等相关组件,如果是使用,SQL Server,数据库,应该用,SqlDataAdapter,添加,OleDbDataAdapter,打开“工具箱”,右键单击“数据”,选择“选择项”,出现“选择工具箱”窗口,添加,OleDbDataReader,组件,可同时选择需要添加的其它组件,向,Form,中加入,OleDbDataAdapter,增加组件后的工具箱如右图,将,OleDbDataAdapter,拖到窗口中,结果显示在下面,自动出现配置向导,点“下一步”后,由于数据库不在当前项目中,会询问是否复制到项目中。,出现命令类型窗口,继续下一步,出现“
12、生成,SQL,语句”窗口,点“查询生成器”,“高级选项”按钮可以选择使用哪些语句类型,先选择具体的表,点“添加”,也可以选择多个表,选好后点“关闭”,选择要显示的字段,会自动生成查询语句,点“执行查询”可以看到结果,如果点“高级选项”会弹出选择窗口,可以根据需要的数据库操作进行选择,完成,SQL,语句配置后继续下一步会出现结果窗口,也可直接点“完成”。,完成后会自动添加,oleDbConnection,组件,下一步需要将当前数据适配器关联到,Dataset,对象,右键单击“,oleDbDataAdapter1”,,选择“生成数据集”,出现配置窗口,此处有两个选择:,“现有”为已经配置好的,“新
13、建”是建立一个新的,DataSet,确定后会自动加入一个,DataSet,到了这一步,已经可以将对数据库的查询结果关联到,DataSet,了,我们知道,,DataSet,是内存中的一个虚拟数据库,严格说是一个数据集,后面的工作是要将记录在具体的数据绑定控件中显示出来,最常用的数据显示控件是,DataGridView,其实象文本框、标签、选择框之类的都可以绑定到,DataSet,绑定到,DataGridView,向窗体中添加一个,DataGridView,控件,会出现设置窗口,如果没有出现窗口,可在,DataSource,属性进行设置,先选择数据源,展开数据源,选一个即可,这里选的是“项目数据源
14、选择后会增加一个“公司,BindingSource,”,项,如果选“,Form1,列表实例”则无,需要再设置列,文本框的绑定,文本框只能显示,DataSet,中当前记录的某一字段(列)的值,通过选择属性,(,DataBindings,),中的,Text,,选择其中的某一列进行绑定,这里选了“公司名称,”,填充数据集,最后一步工作,就是让数据适配器填充数据集对象,dataSet,为当前窗体的,Load,事件添加如下代码:,this.oleDbDataAdapter1.,Fill,(this.dataSet,11,0,0,“,公司,);,Fill(),方法用于填充数据集对象,参数,1,:要填充
15、的数据集;,参数,2,:从表中第几个记录开始,,0,为第一个;,参数,3,:返回多少条记录,,0,表示全部;,参数,4,:数据来源的表的名称。,运行结果,看看一些关键语句,需要引用,using,System.,Data,;,我们添加了代码:,oleDbDataAdapter1.Fill(dataSet1,0,0,公司,);,另外系统自动写了很多代码,5.访问,SQL Server,数据库,使用,SQL Server,数据库时,应使用针对,SQL Server,数据库优化了的一组组件,这里我们全部通过自己写代码的方式,完成下列工作:,(,例题,UseSql,),建立,连接,:,Sql,Conne
16、ction,获得,数据,:,Sql,DataAdapter,返回查询,结果,:,DataSet,绑定,到数据控件:,DataGridView,访问,SQL,数据库,要使用优化的,SQL SERVER,对象访问数据库,需要引入以下名字空间:,using System.Data;,using System.Data.SqlClient;,SqlConnection,对象,ADO.NET,使用,SqlConnection,对象与,SQL Server,进行连接。,连接字符串的常用形式有两种:,(,1,)使用,Windows,集成安全身份验证,例如:,string,connStr,=Integrate
17、d Security=SSPI;Database=,MyDatabase.mdf,;Server=,localhost,;,(,2,)使用用户名、密码形式,例如:,string,connStr,=,Data Source=SDXG;Initial Catalog=park;User ID=sa;Password=saas;,通过代码创建,SqlConnection,对象,SqlConnection,conn,=new,SqlConnection(connString,);,或者:,SqlConnection,conn,=new,SqlConnection,();,conn.Connection
18、String,=,connString,;,打开连接,:,conn.Open();,注意,,使用完后要及时关闭连接:,conn.Close();,SqlDataAdapter,对象,SqlDataAdapter,通过,无连接,的方式完成数据库和本地,DataSet,之间的交互。,通过查询语句和,SqlConnection,对象,生成,SqlDataAdapter,实例访问数据库并获得数据。,例如:,string strsql=select*from users;,da=new SqlDataAdapter(strsql,conn);,SqlDataAdapter,对象还可以通过,SelectC
19、ommand,、,InsertCommand,、,UpdateCommand,和,DeleteCommand,属性为后台数据库提供对应的操作命令,并传递需要的参数。,DataSet,对象,使用,DataSet,对象可以完成各种数据操作,创建,DataSet,后,使用,SqlDataAdapter,对象把数据导入到,DataSet,中。,通过,Fill,方法将数据填充到,DataSet,中的某个表中。,例如:,da.Fill,(ds,“,newUser,”);,这里的表名,可以随便起,数据绑定,数据绑定是指在程序运行时,窗体上的控件自动将其属性和数据源关联在一起。,Windows,窗体提供了两种
20、类型的数据绑定:简单数据绑定和复杂数据绑定。,简单数据绑定,:将控件的某个属性绑定到单个值,一般将这些控件绑定到数据库中某个记录的一个字段。,复杂数据绑定,:将一个控件绑定到多个值,例如,DataGridView,控件、,ListBox,控件等。,实现数据绑定的方式,有,3,种实现方法:,在设计界面下通过鼠标拖放实现常用属性的数据绑定;,在设计界面下设置控件的,DataBindings,属性,然后利用可视化界面实现各种属性的数据绑定;,直接编写代码实现数据绑定。,直接编写代码实现数据绑定,不论采用哪种方式,从本质上来讲,都是利用,BindingSource,组件实现数据绑定的。,用法,:,(1
21、),将,BindingSource,组件绑定到实际数据源,(2),将控件绑定的数据源设置为,BindingSource,例如:,BindingSource bs=new BindingSource();bs.DataSource=ds.TablesnewUser;,dataGridView1.DataSource=bs;,6.,DataSet,数据绑定及编辑,DataSet,类是,ADO.NET,中功能非常强大的一个类,DataSet,可以脱离数据库而存在,,DataSet,中的数据即可以是来自数据库(由,DataAdapter,填充),也可以来自别的数据源,甚至可以是自己创建数据源,Data
22、Set,工作原理,实际上,DataSet,可以看作是一个内存中的关系型数据库,一个关系型数据库包括表、列、行、约束等,,DataSet,的体系结构正是如此,DataSet,类相当于一个“容器”,内含表的,集合,,表又内含列、行、约束的,集合,这些类的关系不是继承关系,而是组成关系,这些类之间的关系,下表只列出了一部分类和集合,DataSet,类,数据集,Tables,集合,DataTable,类,数据表,Columns,集合,Column,类,数据表的列,Rows,集合,Row,类,数据表的行,Constraints,集合,Constraint,定义数据约束,数据更新,DataAdapter,
23、可以根据结果集的数据结构,自动创建出与之匹配的,dataSet,、,dataTable,、,c,olumn,、,row,、,constraint,对象,并把数据填到这些对象中,DataSet,实例中包含的数据发生更改后,此时调用,DataAdapter.Update,方法,,DataAdapter,将分析已作出的更改并执行相应的命令(,INSERT、UPDATE,或,DELETE,),,并以此命令来更新数据库中的数据,主要的代码,/更新数据库,sqlDataAdapter1.Update(dataSet1.TablesAuthors);,/,确认数据集的变化,dataSet1.TablesAu
24、thors.,AcceptChanges,();,为例题,UseSql,添加一个按钮,并补充更新按钮,当用户在,DataGridView,中修改记录信息后,将改的更新到数据库。,7.,DataGridView,控件,当我们需要在界面中显示多条记录时,,DataGridView,是最常使用的一个控件。,DataGridView,是一个非常复杂的控件,使用好并不容易。,数据的填充:,可以直接绑定数据源从,DataSet,中获取,可以通过编写代码手工填充数据,DataGridView,的属性,实际上我们开发的软件一般不允许用户在,DataGridView,中随便乱操作。,通常,DataGridVie
25、w,只是用来显示数据,DataGridView,有一些,AllowUserTo,的属性,决定允许用户做哪些操作,禁止编辑,DataGridView,不给用户提供,Updata,功能,也可通过属性设置,禁止编辑:,readonly,=true,DataGridView,的前身是,DataGrid,控件,新版的有一些变化,包括属性,看比较旧的书注意此问题。,一些常用属性的使用,我们结合问题逐步介绍,。,绑定数据时的默认设置,绑定了数据源,会自动为数据源中的每个字段单独创建一列。,自动使用字段名称作为,列标题,。,支持自动,排序,。在列标题中单击或双击,该字段中的值就会按升序或降序排序。,支持自动调
26、整,列宽,。在标题之间的列分隔符上双击,该分隔符左边的列就会自动按照单元格的内容展开或收缩。,标题及行列控制,DataGridView,提供了两个重要的集合,Columns,和,Rows,,用于处理整个数据集。,Columns,:是表格中的所有列(字段)的集合,为,DataGridViewColumn,对象的集合。,Rows,:是表格中的所有行(记录)的集合,是,DataGridViewRow,对象的集合。,每个,DataGridViewRow,对象又都包含一组,DataGridViewCell,对象。,可以按使用数组的方式定位到集合的元素,DataGridViewColumn,column=
27、dataGridView1.Columns,学号,;,if(,column.HeaderText,!=,column.DataPropertyName,),/,让标题与绑定的字段名称相同,column.HeaderText,=,column.DataPropertyName,;,else ,column.HeaderText,=Student ID;,了解,Command,对象,我们对数据库的操作都是通过,Command,对象的,SQL,字串进行的,:,/设置,SqlCommand,对象,SqlCommand,Sql,Command1=,new,System.Data,.,SqlClient.
28、SqlCommand,();,/,执行的操作,Sql,Command1.CommandText=SELECT*FROM Authors;,创建连接,Sql,Command1.Connection=,conn,;,执行命令,但不返回执行的表数据,只是操作行数,Sql,Command1.ExecuteNonQuery(),;,SqlCommand,对象主要的数据库操作方法,ExecuteNonQuery,方法:,该方法执行,SQL,语句的结果,但不返回命令执行的表数据,仅返回操作所影响的行数。,ExecuteReader,方法:,返回一个,SqlDataReader,对象。,ExecuteScal
29、er,(),方法:,该方法用于执行,SELECT,查询,返回结果为一个值的情况,比如用,sum,函数求和等。,6.访问,SQL Server,数据库的视图,我们将,视图,看作是驻留在数据库上的一个或多个,SQL,语句构成的“,虚拟数据表,”,将它当一般的表来操作就可以,访问视图的方法:,通过“服务器资源管理器”先建立一个视图“,MyView,”,然后用与访问数据表类似的方法访问该视图,差别只是将原来连接字符串中的,表名,改为,视图名,不满足于只读,我还想多做点,添加和修改记录,前提:,在适配器配置向导的“高级选项”中没有去掉,Insert,、,Updata,等选择。,原理:,控件中显示的是,d
30、ataSet,中的内容,而,dataSet,与,Adapter,关联,,Adapter,又连接着实际的数据库,操作:,当对控件中的数据进行了改变,相应的,dataSet,等于也进行了更新,因此只要对,Adapter,提交更新(,Updata,)即可。,实战,在 窗体中添加一个按钮,在按钮的,click,方法中添加下列语句:,this.,oleDb,DataAdapter1.Update,(,this.dataSet11,);,运行,程序,修改一个值,然后点击该按钮,修改前,点击“,Updata,”,后关闭程序,再次运行查看对应记录,会看到已经是更新后的结果了,添加新纪录,将记录移动到最后一行,
31、填写新的记录,注意这个例子中“客户,ID”,是和客户表关联的,不能乱改也不能随便填,必须是现有的。,完成后单击按钮,删除记录,DataGridView,的行与列不支持手动删除操作,必须要使用代码来实现。,在当前窗体的构造函数中添加如下代码。,this.dataGridView1.AllowUserToDeleteRows=true;,该属性表示,DataGridView,允许用户删除行。,添加“删除”按钮,,click,方法添加如下代码:,foreach,(,DataGridViewRow,r,in dataGridView1.SelectedRows)dataGridView1.Rows.R
32、emove(r);,r,表示选中的行,通过,Remove(),方法将该行删除。,运行程序,选中,dataGridView1,中的任意一行,单击“删除”按钮,注意,此时只是在,dataSet,中删除了,原始数据库没有变,还应该单击“更新设置”按钮,将刚才的删除操作的结果提交到数据库。,不演示图片了,大家自己应该会做了,练习,在,Books.mdb,数据库添加一个新表,在,DataGrid,中显示该表,单击一,button,后,用,dataSet,对象和,DataAdapter,对象,自动,更新,该表中的值,/循环更改,Authors,表,firstName,字段的值,foreach,(,DataRow,row,in,dataSet1.TablesAuthors.Rows),rowfirstName,=,aa,;,小结,本章对,ADO.NET,数据库编程的主要方面几乎都涉及到了,由于课时关系不能详细介绍,只能给你们提供信息和基本的方法,书中还有很多内容我们这里没有涉及,对编程具体问题要靠自已去研究,作业,完成选课程序,在资源管理器中建立数据库,建立相应的表并输入一些记录,建立数据库连接,完成代码编写并调试,提交实验报告(包括系统设计、必要的设计图、关键技术说明、代码及界面图等)到服务器(,11.28,截止,),报告文件名格式“,学号,-,姓名,.DOC,”,






