ADONET数据访问技术

上传人:san****019 文档编号:22918360 上传时间:2021-06-02 格式:PPT 页数:62 大小:1.14MB
返回 下载 相关 举报
ADONET数据访问技术_第1页
第1页 / 共62页
ADONET数据访问技术_第2页
第2页 / 共62页
ADONET数据访问技术_第3页
第3页 / 共62页
点击查看更多>>
资源描述
第 16章 ADO.NET数据 访问 技术 在目前的主流软件开发中,信息管理或处理系统占据了主 要方面,所以几乎所有平台都支持数据库访问技术, .NET 平台自然也不例外。 ADO.NET是 .NET框架中的一个重要组件, 以一种统一的访问方式来连接多种形式的数据源,其中最 常见的就是关系型数据库。 ADO.NET采用相同的方法访问本 地数据库、客户机 /服务器数据库和基于 Internet的高度分 布式数据库。本章讲述 .NET开发技术中应用非常广泛的核 心开发技术 ADO.NET数据访问技术。 章节内容 16.1 数据库开发基础 16.2 使用 ADO.NET 16.3 ADO.NET综合应用 16.4 实例:图书信息管理 16.1 数据库开发基础 16.1.1 SQL Server 2005 SQL Server是一个全面的、集成的、端 到端的数据解决方案,它为企业中的用 户提供了一个安全、可靠和高效的平台 ,用于企业数据管理和商业智能应用。 使用 SQL Server 2005创建数据库 首先建立数据库 之后添加表结构和为表添加列。 最后可以直接为表添加数据。 16.1.2 SQL语句简介 SQL全称是结构化查询语言( Structured Query Language),是数 据库中使用的标准数据查询语言。 目前,绝大多数流行的关系型数据库管 理系统都采用了 SQL语言标准。虽然对 SQL语句进行了再开发和扩展,但是包 括 Select、 Insert、 Update、 Delete 、 Create以及 Drop在内的标准的 SQL命 令仍然可以被用来完成几乎所有的数据 库操作。 Insert Insert操作用于向数据库表中插入记录 。 INSERT INTO table (column ,column) VALUES (columnvalue ,columnvalue); 下面语句是向 BookInfo表中插入一行记 录。 INSERT INTO BookInfo VALUES (9787040074949, 数据库系统 概论 , 萨师煊 , 高等教育出版社 ,28.0, 2000-2-1); Select Select操作从一个或多个表中选取特定 的行和列。因为查询和检索数据是数据 库管理中最重要的功能,所以 SELECT语 句在 SQL中是工作量最大的部分。 SELECT语句的结果通常是生成另外一个 表。 SELECT columns FROM tables ORDERE BY column ASC|DESC WHERE predicates 下面语句将查询 BookInfo表中作者谭浩 强的书。 SELECT Name FROM BookInfo WHERE Author= 谭浩强 UPDATE UPDATE语句允许用户在已知的表中对现 有的行进行修改。 例如,下面语句是一个单行更新。 UPDATE BookInfo SET Name= C语言程序设计(第三版) WHERE ISBN=9787302108535 DELETE DELETE语句用来删除已知表中的行。如 同 UPDATE语句中一样,所有满足 WHERE 子句中条件的行都将被删除。由于 SQL 中没有 UNDO语句或是 “ 你确认删除吗? ” 之类的警告,在执行这条语句时千万 要小心。 例如,下面语句将删除所有清华出版社 的书的信息。 DELETE FROM BookInfo WHERE press= 清华出版社 16.2 使用 ADO.NET ADO.NET目前版本为 3.0,用于访问和操 作数据的两个主要组件是 .NET Framework数据提供程序和 DataSet。 16.2.1 理解数据提供者 ADO.NET用不同的数据提供者来操作不 同数据源 数据提供者实际上是 ADO.NET提供的一 组封装好的类,用于操作不同类型的数 据库系统。我们可以把这些数据提供者 想象成我们程序与数据库之间的一座桥 梁,我们的程序通过它和数据库打交道 。 4种数据提供者 SQL Server数据提供者:为操作 SQL Server 数据库( SQL Server 7.0及之后版本)提供 完善的支持。 OLE DB数据提供者:为所有支持 OLE DB驱动 的数据源提供支持,它可以支持 SQL Server 7.0之前的版本。 Oracle数据提供者:为操作 Oracle数据库( 8i及之后版本)提供完善的支持。 ODBC数据提供者:为操作 Access数据库及其 他支持 ODBC驱动的数据源提供支持。 命名空间 命名空间 描述 System.Data 包含 columns, relations, tables, datasets, rows, views和 constraints等这些主要的数据容器类 System.Data.Common 主要包含 ADO.NET中的基类 , 大多数的抽象类 , 以及 ADO.NET中的一些核心函数 。 并实现了 System.Data中的 部分接口 。 不同的数据驱动程序从这些类中继承并构建它 们自己的功能 ( 比如 DbConnection, DbCommand等 ) System.OleDb 包含用于连接提供 OLE DB驱动的数据源的所有累 , 包括 OleDbCommand, OleDbConnection, OleDbDataReader, 和 OleDbDataAdapter。 这些类支持大多数的 OLE DB数据源 , 但是不能支持那些使用了 OLE DB2.5 版接口的数据源 System.Data.SqlClient 包含了连接 SQL Server数据库的类 , 包括 SqlDbCommand, SqlDbConnection, SqlDataReader, and SqlDBDataAdapter System.Data.OracleClie nt 包含了连接 Oracle数据库 ( 8i或之后版本 ) 所需要的类 , 包括 OracleCommand, OracleConnection, OracleDataReader, 和 OracleDataAdapter System.Data.Odbc 包 含 连 接 ODBC 数 据 库 所 需 的 类 , 这 些 类 包 括 : OdbcCommand, OdbcConnection,OdbcDataReader, 和 OdbcDataAdapter System.Data.SqlTypes 包含与 SQL Server中的数据类型相对应的数据结构 , 这 些数据类型并不强制使用 , 如果使用了标准的 .NET数据类 型话 , 系统会自动将他们转化成匹配的 Sql 数据类型 我们需要根据所使用数据库系统的不同 ,选择相对应的数据提供者,并在代码 中包含相应的命名空间。 16.2.2 连接数据库 ADO.NET中使用 Connection类 完成数据 库的连接。只有建立了连接之后,才能 对数据库表中的记录进行添加、删除、 修改、读取之类的功能。 数据库连接字符串 要建立一个数据库连接,首先需要提供一个 连接字符串。连接字符串的格式是一个以分 号为界,划分键值参数对的列表。 这个串中包含了数据库的位置,想要连接的 数据库的名称以及数据库的身份验证方式等 众多的信息。必须提供的信息有以下 3个。 数据库所在服务器的位置( Data Source)。 数据库的名称( Initial Catalog)。 数据库的身份验证方式( Windows集成验证或者是 SQL Server身份验证)。 下面是一个用于连接 16.1.2节创建的 SQL Server数据库 VBNET2008的连接字 符串,采用 Windows集成验证的方式。 Dim connectionString As String= Data Source=localhost; Initial Catalog= VBNET2008;Integrated Security=SSPI; 关于更多的数据库连接字符串,可参考 http:/。 连接字符串确定后,需要将其传递给 Connection类的实例的 ConnectionString属性,然后调用其 Open方法打开该连接。这里 以 SqlConnection类 为例。 1 Dim connectionString As String = Data Source=server;Initial Catalog=VBNET2008; Integrated Security=SSPI; 2 Dim conn As SqlConnection= new SqlConnection( ) 3 conn.ConnectionString = cString 4 conn.Open( ) 将连接字符串写入配置文件 如果是 Windows窗体应用程序,则需要 先添加该配置文件。单击菜单栏中的【 项目】 【添加新项】,打开【添加新 项 -WindowsApplication1】窗口,选择 常规类别中的应用程序配置文件。 在 app.configue文件中加入一个 connectionStrings标签,代码如下。 1 2 3 4 5 6 7 使用配置文件中的连接字符串 可以通过 ConfigurationManager.ConnectionStr ings集合通过名字将其取出。使用该集 合,首先要添加 System.Configuration 命名空间的引用 。 下面代码通过 ConfigurationManager.ConnectionStr ings集合取出了连接字符串。 Dim conn string As String = ConfigurationManager.ConnectionStrings (MyConnectionString).ConnectionStri ng 如果是 ASP.NET项目,则可以将数据库连接字 符串写入 Web.Config文件。方式与 Windows窗 体应用程序中的 app.config文件类似,添加 一个 connectionstring标签即可。 在需要用到连接字符串的时候,可以从 WebConfigurationManager.ConnectionStrin gs集合中通过名字将它取出来。要使用这个 集合的话,同样需要在项目中添加对 System.Configuration命名空间的引用。 16.2.3 执行数据库操作 .NET中执行数据库操作是通过 Command 类来完成的。 Command类是一个执行 SQL 语句和存储过程的类。通过它,我们可 以实现对数据的添加、删除、更新、查 询等各种操作。 使用 Command类 首先要确定 Command的种类,是 SqlCommand, OracleCommand,还是其他类型。 在确定了 Command类型之后,需要把为它指定 一个 Connection。 另外需要指定 CommandType 和 CommandText。 这 3项信息可以在创建 Command对象的时候以 参数的形式传到 Command的构造函数中,也可 以通过属性的方式进行设置。 需要说明的是, CommandText既可以是 SQL语句,也可以是存储过程,也可以 是数据表的名字。 使用不同种类的 CommandText,需要设 置相应的 CommandType。 3种不同的 CommandType 类型 描述 CommandType.Text CommandType的默认值 。 它指示执行的是 SQL语句 。 为 CommandText指定 SQL字符串 CommandType.Stored Procedure 指示 执 行 的 是 存 储 过 程 , 需 要 为 CommandText指定一个存储过程的名称 CommandType.TableD irect 指示 执行的是得到某个数据表中的所有 数据 。 此时需要为 CommandText指定一个数据表名称 。 ( 通常情况下还是直接写 SQL语句来实现这个功能比较可靠 ) 如果需要执行 SQL语句 下面的代码演示了如何使用 SqlCommand对象执行一 个 SQL查询语句,采用了属性设置的方式指定了必 须的 3项信息,代码如下。 1 Dim cmd As SqlCommand = new SqlCommand( ) 2 cmd.Connection = con 3 cmd.CommandType = CommandType.Text 4 cmd.CommandText = SELECT * FROM BookInfo“ 事实上,上面代码还可以写成更简洁的形式,如下。 Dim cmd As SqlCommand = new SqlCommand(SELECT * FROM BookInfo , con) 如果需要执行存储 过程 如果需要执行存储过程,可以使用下面 这种方式。 Dim cmd As SqlCommand = new SqlCommand(GetBooks, con) cmd.CommandType = CommandType.StoredProcedure 至此,我们只是简单地定义出了 Command对象,并为它们设置了一些属 性,但还并没有真正的执行这些操作。 如果想要执行 Command操作的话,还需 要调用其他方法来执行。我们有 3种方 法可以使用,这 3种方法的主要不同之 处在于它们的返回值不同。 三种执行方法 ExecuteNonQuery( ):用于执行非 SELECT的命令, 如 INSERT, DELETE或者 UPDATE命令,返回一个命令 所影响的数据的行数。也可以用 ExecuteNonQuery( )方法来执行一些数据定义命令,如新建,更新,删 除数据库对象(如表,索引等)。 ExecuteScalar( ):用于执行 SELECT查询命令,返 回数据中第一行第一列的值。这个方法通常用来执 行那些用到 COUNT( )或者 SUM( )函数的 SELECT命令 。 ExecuteReader( ):用于执行 SELECT命令,并返回 一个 DataReader对象。这个 DataReader是前向只读 的数据集。 16.2.4 DataReader DataReader是一种非常有用的数据读取 工具,提供一种连接着数据库、只能向 前的记录访问方式,它可以执行 SQL语 句或者存储过程。 DataReader是一个轻量级的数据对象, 如果只是需要将数据读出并显示的话, 那么它就是最合适的工具 DataReader在读取数据的时候要求数据 库保持在连接状态,读完数据之后才能 断开连接。 DataReader的常用方法 方法 名 返回 类型 说明 Close Void 关闭 数据读取器 。 已重载 NextResult Boolean 当 读取批量的 SQL语句的结果时 , 前进到 下一个结果集 , 如果有更多的结果集 , 将 返回 True。 有重载 Read Boolean 前进 到下一条记录 。 如果有更多的记录 , 将返回 True GetName String 取得 指定字段的字段名称 GetOrdinal Int 取得 指定字段名称在纪录中的顺序 GetValue Object 取得 指定字段的数据 示例 1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 2 创建 Connection对象和 Command对象 3 Dim connectionString As String = ConfigurationManager.ConnectionStrings(MyConne ctionString).ConnectionString 4 Dim con As New SqlConnection(connectionString) 5 Dim cmd As New SqlCommand( SELECT * FROM BookInfo, con) 6 Dim reader As SqlDataReader 7 Try 8 con.Open( ) 打开数据库连接 9 执行 ExecuteReader( )方法返回的是一个 DataReader 对象 10 reader = cmd.ExecuteReader( ) 11 While reader.Read( ) 遍历 DataReader时最常用的方 式 12 Label1.Text &= reader(0) & vbTab & reader(1) & vbCrLf 按照顺序或列名指定要读取的项 13 End While 14 Catch ex As SqlException 15 Throw New ApplicationException(ex.ToString() 执行 过程中发生异常的话,抛出异常 16 Finally 17 reader.Close( ) 关闭 DataReader 18 con.Close( ) 断开数据库连接 19 End Try 20 End Sub 通过这段代码,我们得到了一个填充了 数据的 DataReader对象。在需要显示这 些数据的地方,就可以通过读 DataReader的方式来显示这些数据了。 Close方法可以关闭 DataReader对象和 数据源之间的联系。在读完数据之后务 必把 DataReader对象关闭,否则当 DataReader对象尚未关闭时, DataReader所使用的 Connection对象就 无法执行其他操作。 16.2.5 DataSet与 DataAdapter DataSet是实现基于非连接的数据查询 的核心组件。可以将 DataSet看成是一 个数据容器,将数据库中的数据拷贝了 一份放到了用户本地的内存中,供用户 在不连接数据库的情况下读取数据, DataSet对象表示数据库中数据的缓存 ,具有类似数据库的结构,如表、列、 关系和约束等。 下面代码创建了一个 DataSet,创建时 可以选择指定一个名称参数。如果没有 为 DataSet指定名称,则该名称会设置 为“ NewDataSet”。 Dim books As DataSet = New DataSet(Books) DataAdapter类 使用 DataSet,就一定会用到 DataAdapter类。这也是一个非常常用 的类,因为 DataSet必须通过 DataAdapter才能得到数据。 因为 DataSet并不能直接跟数据源产生 联系,这种联系必须通过 DataAdapter 来完成。 DataAdapter对象的工作步骤 一般有两种。 一种是通过 Command对象执行 SQL语句,将 获得的结果集填充到 DataSet对象中; 另一种是将 DataSet里更新数据的结果返回 到数据库中。 DataAdapter的常用方法 Fill方法:用于填充或刷新 DataSet。 Update方法:将 DataSet中的数据更新 到数据库里。 16.3 ADO.NET综合应用 应用背景: 某学院的图书资料室需要设 计一个图书信息管理的程序,能够显示 该资料室的图书的信息,并实现对图书 的添加、删除、更新,并且可以对图书 进行查询。 数据库表结构 字段名 数据类型 ISBN Varchar(13) Name Varchar(100) Author Varchar(10) Press Varchar(20) Price money PressDate SmallDateTime 分层逻辑 真正进行项目开发时,我们并不会把对 数据库的操作代码嵌入到业务逻辑代码 中。它们一般都是分开存放的。 当逻辑代码需要数据的时候,它通过调 用专门的数据库操作代码来得到这些数 据。 这个可以简单的理解成业务的分层:不 同的代码负责不同的功能,互不干扰。 这样做对代码的维护和代码的重用都非 常的有利。 到目前为止比较成熟并被众多开发者所 采用的是这样一种模式: 为数据库中每一个主要的表配置一个专 门的数据信息类,这个类中包含这个表 中的数据信息。 另外为这个表提供一组它要用到的方法 ,如保存数据、删除数据、更新数据等 方法,将这些方法也封装在一个类中。 与 BookInfo表对应的数据类 这个数据类非常简单,每个属性都与数 据表中的一项对应。 数据库操作类 1 Public Class BookInfoDB 2 3 End Class 这个类暂时是空的,下面所有针对数据 库表 BookInfo的操作,我们都会添加到 这个类中。 16.3.1 连接数据库 首先 在项目中添加应用程序配置文件 app.config,在该配置文件中配置上连 接字符串 1 2 3 将这个字符串定义成一个全局变量,这 样整个类中需要用到它的地方都可以方 便的调用。 常见的方式是将这个获取字符串内容的 代码放到 数据操作 类的构造函数中 。 1 Public Class BookInfoDB 2 Public connectionString As String 3 Public Sub New( ) 4 connectionString = System.Configuration.ConfigurationManager.Con nectionStrings(Book ).ConnectionString 5 End Sub 6 End Class 16.3.2 查询数据 在 BookInfoDB类中添加 GetBooks( )的函数,用于 查询所有图书的信息 。 1 批量查询 2 Public Function GetBooks( ) As DataSet 3 Dim con As New SqlConnection(connectionString) 4 Dim ds As New DataSet( ) 5 假设我们想要得到所有的图书信息 6 Dim cmd As New SqlCommand(SELECT * FROM BookInfo, con) 7 Dim adp As New SqlDataAdapter(cmd) 8 Try 9 con.Open( ) 10 adp.Fill(ds) 将数据填充到 DataSet中 11 Catch ex As SqlException 12 Throw New ApplicationException(Data error.) 执行过程中 发生异常的话,抛出异常 13 Finally 14 con.Close() 关闭数据库连接 15 End Try 16 Return ds 返回数据集 17 End Function 查询单条数据需要首先指定我们想要得到哪条学生信息。 这里我们通过指定图书的名称来确定具体的那条记录。 1 单个查询 2 Public Function GetBookByName(ByVal name As String) As BookDetails 3 定义 BookDetails对象,用于存储图书信息 4 Dim book As New BookDetails 5 Dim reader As SqlDataReader 6 Dim con As New SqlConnection(connectionString) 7 Dim cmd As New SqlCommand(, con) 8 cmd.CommandText = SELECT * FROM BookInfo WHERE Name= & name & 9 Try 10 con.Open( ) 11 调用 Command对象的 ExecuteReader方法 12 reader = cmd.ExecuteReader( ) 13 循环读取所有数据,实际上这里只有一条记录 14 While reader.Read 15 根据列名取出不同列的数据 16 book.ISBN = reader(ISBN) 17 book.Name = reader(Name) 18 book.Author = reader(Author) 19 book.Press = reader(Press) 20 book.Price = reader(Price) 21 book.PressDate = reader(PressDate) 22 End While 23 reader.Close( ) 24 Catch ex As SqlException 25 如果读取数据过程中发生异常的话,将 book对象设 置成空 26 book = Nothing 27 Throw New ApplicationException(ex.Message) 28 Finally 29 con.Close( ) 30 End Try 31 Return book 32 End Function 16.3.3 添加和更新数据 我们在添加图书数据的时候,先用 BookDetails这个类 的对象来收集图书信息,然后再把它们集中送到 BookInfoDB类中进行处理,代码如下。 1 添加记录 2 Public Function InsertNewBook(ByVal book As BookDetails) As Integer 3 Dim affectRow As Integer = 0 4 Dim con As New SqlConnection(connectionString) 5 Dim cmd As New SqlCommand(, con) 6 cmd.CommandText = String.Format(INSERT INTO BookInfo(ISBN,Name,Author,Press,Price,PressDate) VALUES(0,1,2,3,4,5), book.ISBN, book.Name, book.Author, book.Press, book.Price, book.PressDate) 7 Try 8 con.Open( ) 9 调用 ExecuteNonQuery方法,返回 SQL语句所影响到的行 数,据此我们可以判断 SQL语句执行是否成功 10 affectRow = cmd.ExecuteNonQuery( ) 11 Catch ex As SqlException 12 affectRow = 0 发生异常的话,将影响的行数值设置成 0, 说明没有插入成功 13 Throw New ApplicationException(ex.Message) 14 Finally 15 con.Close( ) 16 End Try 17 Return affectRow 18 End Function 16.4 实例:图书信息管理 数据库设计: 主界面设计 添加与修改窗体
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!