学习情境四 任务 9 ado.net 数据访问

28
学学学学学 学学 9 ADO.NET 学学学学

Upload: gail-mullen

Post on 02-Jan-2016

127 views

Category:

Documents


0 download

DESCRIPTION

学习情境四 任务 9 ADO.NET 数据访问. 主要学习任务. ADO.NET 模型 Connection 对象 Command 对象 DataReader 对象 DataSet 和 DataAdapter 对象. 4.1 ADO.NE 模型. 4.1.1 ADO.NET 简介 - PowerPoint PPT Presentation

TRANSCRIPT

学习情境四

任务 9ADO.NET数据访问

主要学习任务• ADO.NET 模型 • Connection 对象 • Command 对象 • DataReader 对象 • DataSet 和 DataAdapter 对象

4.1 ADO.NE 模型

• 4.1.1 ADO.NET 简介• ADO.NET 相 对 于 ADO 有 了 很 大 的 改

进。 ADO.NET 与 ADO 既相似又有很大的区别。二者都能够编写对数据库服务器中的数据进行访问和操作的应用该程序,并且具有易于使用、高速度、低内存支出和占用磁盘空间较少等特点,支持用于建立基于客户机 / 服务器和 Web 应用程序的主要功能。但是ADO 使用 OLE DB 接口并且基于微软公司的 COM 技术,而 ADO.NET 拥有自己的 ADO.NET 接口并且基于微软公司的 .NET 体系框架。众所周知, .NET 体系不同于 COM 体系, ADO.NET 接口也完全不同于 ADO和 OLE DB 接口,也就是说, ADO.NET 和 ADO 是两种数据访问方式, ADO.NET 不是 ADO 的 .NET 版

• 实现在线操作和离线操作,一般情况下各自都需要用到如下对象。

• ( 1 ) 在 线 操 作 :Connection 、 Command 、 Parameter ( 可选)、 DataReader (可选)、 Transaction (可选)、 DataAdapter (可选)。

• ( 2 ) 离 线 操 作 :Connection 、 DataAdapter 、 DataSet 、 DataTable、 DataRow 、 DataColumn 、 DataView ( 可选)、 DataRelation (可选)、 Constraint (可选)

4.1.2 ADO.NET 的体系结构

.NET 框架数据提供程序

ConnectionTransaction

CommandParameters

DataReader

DataAdapter

SelectCommand

InsertCommand

UpdateCommand

DeleteCommand

DataSet

DataTableCollection

DataTable

DataRowCollection

DataColumnCollection

ConstraintCollection

DataRelationCollection

XML数据库

Web应用程序

4.1.3 应用程序的开发流程

• ASP.NET 通过 ADO.NET 访问数据库, .NET 数据库应用程序的开发流程有以下几个步骤。

• ( 1 )创建数据库。具体方法不在本书中介绍,读者可参考相关书籍。

• ( 2 )利用 Connection 对象创建到数据库的连接。• ( 3 )利用 Command 对象对数据源执行 SQL 命令并返回

结果。• ( 4 ) 利 用 DataReader 对 象 读 取 数 据 源 的 数

据。 DataReader 对象只能将数据源从头至尾按顺序读取数据,不能只读取某条数据,也不能写入数据。因此,利用DataReader 对象只能完成读取数据的功能,更复杂的功能将由 DataSet 对象完成。

• ( 5 ) DataSet 对象是 ADO.NET 的核心,与 DataAdapter对象配合,完成数据库操作的增加、删除、修改、更新等操作。

4.2 Connection 对象• 4.2.1 Connection 对象概述• Connection 对象可用来连接到数据库和管理数据库的事务。它

的一些属性描述数据源和用户身份验证。• Connection 对象还提供一些方法允许程序员与数据源建立连接

或断开连接。

数 据 源 数据提供程序 连 接 对 象

SQL Server7.0或更高版本 SQL Server .NET 数据提供程序

System.Data.SqlCilent.SqlConnection

OLE DB 数据源、 SQL Server 6.x或更低版本

OLE DB .NET数据提供程序 System.Data.Oledb.OledbConnection

ODBC数据源 ODBC .NET数据提供程序 System.Data.Odbc.OdbcConnection

Oracle数据库 Oracle .NET数据提供程序 System.Data.OracleClient.OracleConnection

Connection对象与要连接的数据源类型

4.2.2 连接字符串• 为了连接到数据源,需要一个连接字符串,即

Connection 对象的 ConnectionString 属性。连接字符串通常由分号隔开的名称和值组成,它指定数据库运行库的设置。连接字符串中包含的典型信息包括数据库的名称、服务器的位置和用户的身份。还可以指定其他操作的信息,诸如连接超时和连接池设置等。

4.2.3 使用 Connection 对象连接数据库

• 1.连接字符串的设置方法• 对于 SQL Server 数据库,可以使用如下两种

方式连接数据库,即采用集成的 Windows 验证和使用 SQL Server 身份验证进行数据库的登录。

• ( 1 )集成的 Windows 身份验证语法范例。• string connectionString=“server=localhost;database=Northwind;integrated

security=SSPI”;

• ( 2 )采用 Sql Server 身份验证的语法范例。• string connectionString = "server=localhost; database=Northwind; uid=sa;

pwd=frock";

4.2.3 使用 Connection 对象连接数据库(2)

• 2.创建 Connection 对象• 以 SqlConnection 为例,可以用 SqlConnection 构造函数生成一个新的 SqlConnection 对象。这个函数是重载的,即可以调用构造函数的不同版本。例 :

• SqlConnection mySqlConnection =new SqlConnection(“server=localhost;

database=Northwind;uid=sa;pwd= frock”);

• 通 过 使 用 new 关键字生成 了 一 个 新 的SqlConnection 对 象 。 因 此 也 可 以 设 置 该 对 象 的ConnectionString 属性,为其指定一个数据库连接字符串。这和将数据库连接字符串传入 SqlConnection() 构造函数 的 功 能 是 一样的 。 要注意的 是 , 只 能 在 关闭Connection 对象时设置 ConnectionString 属性。

4.2.3 使用 Connection 对象连接数据库(3)• 3.连接字符串的存储

• ( 1 )存储在配置文件中。• 在 ASP.NET 2.0 中,使用了一种在运行时解析为连接

字符串值的新的声明性表达式语法,按名称引用数据库连接字符串。连接字符串本身存储在 Web.config 文件中的 <connectionStrings> 配置节下面,以便易于在单个位置为应用程序中的所有页进行维护。

• ( 2 )存储在类的方法中。• 将数据库连接字符串存放在新建的一个类方法中,如

可将此类命名为 MySetting

4.2.4 连接池• 打开 与 关闭数 据 库 都 是比较耗时 的 。 为

此, ADO.NET 自动将数据库连接存放在连接池中。连接池可以大幅度提高程序的性能和效率,因为不必等待建立全新的数据库连接过程,而是直接利用现成的数据库连接。注意,利用 Close 方法关闭连接时,并不是实际关闭连接,而是将连接标为未用,放在连接池中,准备下一次复用。

• 使用 SqlConnection 对象时,可以在连接字符串中指定 max pool size ,表示连接池允许的最大连接数(默认为 100 ),也可以指定 min pool size表示连接池允许的最小连 接 数 (默认为 0 ) 。 下面的代码指 定 了SqlConnection 对 象 的 max pool size 为 10 , min pool size 为 5 。

• SqlConnection mySqlConnection = new SqlConnection("server=localhost;database=Northwind; integrated security=SSPI;" + "max pool size=10; min pool size=5");

• 在上述范例的程序代码中,程序最初在池中生成 5 个SqlConnection 对 象 。 池 中 可 以 存 储 最 多 10 个SqlConnection 对象。

4.3 Command 对象• 4.3.1 Command 对象概述• Command 对象继承于 .NET 框架的 IDbCommand 接口

。 Command 对象提供对数据库(或数据源)的查询、插入、修改、删除等操作,且它可以使用 3 种不同方式(即CommandType 属性的值)执行数据库的命令 。

• ( 1 ) Text (文本)类型,为 Command 对象的系统默认执行方式,它用于执行 SQL语句, Command 对象不需要进行任何处理就可以把该文本直接传递给数据库并执行。

• ( 2 ) Stored Procedure (存储过程)类型,用于执行存储过程,存储过程是一种特殊的数据库命令,它把多个命令(如 SQL语句)集中起来一次性提交给数据库并执行,因此可以提高数据库的执行效率。

• ( 3 ) ableDirect 类型,执行 Command 命令时,该类型执行方式返回一个完整的表,等价与 Command对 象 使 用 Text 执 行 方 式 执 行 “ Select * from TableName”SQL语句。该类型执行方式只有 OLE DB托管提供程序支持。

4.3.2 创建和使用 Command 对象• 一般把对数据库的各种操作分成如下两种。• ( 1 )不返回记录集的命令。通常是执行添加、插入

和修改等操作的 SQL语句来更新记录。• ( 2 )返回记录集的命令。通常是执行查询 SQL语句

来获取数据集用于呈现。• 不论是那种操作,都需要使用 Command 对象来执

行 SQL语句。这里,使用 Sql Client Data Provider ,所以需要定义 SqlCommand 对象。 SqlCommand 对象重载 的 几 个 构 造 方 法 包 括 :SqlCommand() 、 SqlCommand(string cmdText) 、 SqlCommand(string cmdText, SqlConnection connection) 、 SqlCommand(string cmdText, SqlConnection connection 、 SqlTransaction transaction)。

• 使用一个 Command 对象简单来说需要以下步骤。• ( 1 )声明一个有效的 Connection 对象。• ( 2 )声明一个有效的 Command 对象。• ( 3 )为 Command 对象指定 SQL语句字符串和

关联的 Connection 对象的实例。• ( 4 )打开 Connection 对象。• ( 5 )执行 Command 对象的各种方法执行数据库

操作。• ( 6 )关闭 Connection 对象。

4.4 DataReader 对象 • 4.4.1 DataReader 对象概述• 可以使用 DataReader 从数据库中检索只读、只进

的数据流。只读是指在数据阅读器 DataReader上不可更新、删除、增加记录;只进是指记录的接收是顺序进行且不可后退的。 DataReader 对象接收到的数据是以数据库的记录为单位的。查询结果在查询执行时返回,并存储在客户端的网络缓冲区中,直到用户使用DataReader 的 Read 方法对它们发出请求。使用DataReader 可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且默认情况下一次只在内存中存储一行,减少了系统开销。

1 . DataReader 对象的属性

属 性 说 明

FieldCount 获取字段的数目,若 DataReader对象没有任何行,返回 0

IsClosed 获取 DataReader对象的状态,True表示 DataReader对象已经关闭,False表示 DataReader对象打开

Item({name,ordinal}) 获取或设置字段的内容,name 为字段名,ordinal 为字段序号。ordinal为 0表示第一列,为 1表示第二列,依此类推

RecordsAffected

获取执行 Insert、Delete、Update等 SQL命令后有多少行受到影响。若受到影响的行数为 0,则返回 0。RecordsAffected属性必须在读取完所有行且 DataReader对象关闭后才会被指定。只有RecordsAffected属性和 IsClosed属性可以在DataReader对象关闭后还能够使用

2 . DataReader 对象的方法

方 法 说 明

Close 关闭 DataReader对象

GetBoolean(ordinal) 获取 ordinal+l列的内容,返回值为 Boolean类型的数据

GetByte(ordinal) 类似于 GetBoolean(ordinal),区别是返回值的类型为 Byte。

GetDataTypeName(ordinal) 获取第 ordinal+l列的数据类型名

GetFieldType(ordinal) 获取第 ordinal+l列的数据类型

Getname(ordinal) 获取第 ordinal+l列的字段名称

GetOrdinal(name) 获取字段名称为 name的字段序号

GetValue(ordinal) 获取第 ordinal+l列的内容

GetValues(values) 获取所有字段的内容,并将字段内容存放在 values数组,values数组的大小最好与字段数目相等,如此才能获取所有字段的内容,GetValues方法比 GetValue方法效率高

IsDBNull(ordinal) 判断第 ordinal+l 列是否为空,返回 False 表示不为空,返回 True

表示为空

Read 读取下一条数据并返回布尔值,返回 True 表示还有下一条数据,返回 False表示没有下一条数据

4.4.2 创建和使用 DataReader 对象

• 在创建 Command 对象的一个实例之后,用户可以通过命令调用 Command 对象的 ExecuteReader 方法来创建 DataReader 对象,该方法从在 Command 对象中指定的数据源检索一些行,这时, DataReader 就会被来自数据库的记录所填充。其创建格式如下(不能直接使用构造函数)。

• SqlDataReader ObjReader=ObjCmd.ExecuteReader();

4.5 DataSet 和 DataAdapter 对象

• 4.5.1 DataSet 对象概述• 数据集( DataSet )对象是 ADO.NET 的核

心,是实现离线访问技术的载体。数据集相当于内存中暂存的数据库,不仅可以包括多张数据表( DataTable ),还可以包括数据表之间的关系和约束。由于 DataSet 对象是使用无连接传输模式访问数据源,因此,在用户要求访问数据源时,无需经过冗长的连接操作,而且有数据读入DataSet 对象之后,便关闭数据连接,解除数据库的锁定,其他用户便可以再使用该数据库,避免了用户之间对数据源的争夺。

• 使用 DataSet 对象访问数据库的步骤如下。• ( 1 )使用 Connection 对象创建数据连接。• ( 2 )使用 DataAdapter 对象执行 SQL 命令并返回结

果, DataAdapter 对象构造在 Command 对象之上。• ( 3 )使用 DataSet 对象访问数据库。• DataSet 对象的创建方法如下。• DataSet myDS=new DataSet(“scores”);

4.5.2 DataSet 对象的基本结构

• DataSet 对象模型由 3 个集合组成: Tables、 Relations 和ExtendedProperties ,这 3部分组成 了 DataSet 的关系数据结构,如图所示 :

4.5.3 DataAdapter 对象• ADO.NET 提供了两种不同的方式从数据库中检索数据。一种是使用 DataReader 对象,但 DataReader对象检索的是只读的、前向的数据流,不能对数据库中的数据进行增加、删除等操作。另一种方法是DataAdapter 对象, DataAdapter 对象与 DataSet 对象配合以创建数据的内存表示。 DataReader 对象通过一个数据连接来检索数据库中的数据,然后执行 SQL命 令 ,搜索要检索的 数 据 ,最后关闭数 据 连接。 DataAdapter 对象仅仅在需要填充 DataSet 对象时才使用数据库连接,完成操作之后就释放所有的资源。

4.5.4 使用 DataAdapter填充数据集

• DataAdapter填充 DataSet 的过程分为如下两步 :

• ( 1 )通过 DataAdapter 的 SelectCommand 属性从数据库中检索出需要的数据。

• ( 2 )再通过 DataAdapter 的 Fill 方法把检索的数据填充 DataSet 。

4.5.5 DataSet 数据更新 • 从前面对 DataSet 对象的介绍中可以知道,每次调用 DataAdapter 对象的 Fill 方法都会检索一组新的记录,同时刷新 DataSet 的内容。但因为 DataSet是面向无连接的,如果改变了 DataSet 的内容,就必须将改动写回数据库。

• ADO.NET 提供了 DataAdapter 的 Update 方法来完成更新数据库的功能。此方法分析 DataSet 中的每个 记 录 的 RowState , 并 且 调 用 适 当 的Insert 、 Update 和 Delete语句。

代码实例:

• 演示了插入一条记录的方法。• string ConnString = "server=(local);uid=sa;pwd=frock;database=stu;";• string mySQLstr = "select * from student";• SqlDataAdapter sda = new SqlDataAdapter(mySQLstr, ConnString);• SqlCommandBuilder builder = new SqlCommandBuilder(sda);• //声明一个 SqlCommandBuilder 对象 , 并将其实例化• DataSet ds = new DataSet();• sda.Fill(ds, "student");• DataTable table = ds.Tables["student"]; //插入数据• DataRow row = table.NewRow(); //插入一行• row["id"] = "1008";• row["name"] = "李思 ";• table.Rows.Add(row); //插入一条记录• sda.Update(table); // 更新数据• this.GridView1.DataSource = ds;• this.GridView1.DataBind();