280 likes | 450 Views
学习情境四 任务 9 ADO.NET 数据访问. 主要学习任务. ADO.NET 模型 Connection 对象 Command 对象 DataReader 对象 DataSet 和 DataAdapter 对象. 4.1 ADO.NE 模型. 4.1.1 ADO.NET 简介
E N D
主要学习任务 • 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.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对象还提供一些方法允许程序员与数据源建立连接或断开连接。 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可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且默认情况下一次只在内存中存储一行,减少了系统开销。
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();