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