第9章ADO.NET数据访问技术ActiveXDataObjects(ADO)是Microsoft开发的面向对象的数据访问库,目前已经得到了广泛的应用。而ADO.NET则是ADO的后续技术。但ADO.NET并不是ADO的简单升级,而是有非常大的改进。利用ADO.NET,程序员可以非常简单而快速地访问各种数据库,如SQLServer数据库。9.1数据库概述9.1.1关系数据库的基本结构1.表2.记录3.字段4.关系5.索引6.视图7.存储过程表9.1学生情况表student学号姓名性别民族班号1王华女汉族070012孙丽女满族070023李兵男汉族070016张军男汉族070018马棋男回族07002表9.2学生成绩表score学号课程名分数1C语言801数据结构832C语言702数据结构523C语言763数据结构706C语言906数据结构928C语言888数据结构79Stud数据库中有以下两个表:9.1.2SQLServer2005数据库管理系统SQLServer2005是微软公司在SQLServer2000基础上推出的关系数据库管理系统,是目前主流的数据库管理系统之一。SQLServer2005版本:SQLServer2005EnterpriseEdition(X86/X64)——企业版SQLServer2005StandardEdition(X86/X64)——标准版SQLServer2005WorkgroupEdition(X86)——工作组版SQLServer2005DeveloperEdition(X86/X64)——开发版SQLServer2005ExpressEdition(X86)——学习版SQLServer7→SQLServer2000→SQLServer2005→SQLServer2008→SQLServer20121.建立数据库Stud在安装并进入SQLServer2005系统后(这里的登录名为sa,密码为123456),通过右击“数据库”项,在出现的快捷菜单中选择“新建数据库”命令,建立一个名称为Stud的数据库,将其路径改为Myaspnet网站的App_Data文件夹中(完整路径为C:\ASPNET示例\ASPNET\App_Data文件夹),这样自动建立Stud.mdf和Stud_log.ldf两个文件,前者为数据库主文件,后者是日志文件。2.建立数据表student和score再展开Stud数据库,右击下方的“表”项,在出现的快捷菜单中选择“新建表”命令,可以通过交互建立表结构。这里新建student和score两个表,前者的关键字为“学号”,后者的关键字为“学号+课程名”,它们的表结构分别如图9.1和9.2所示。这样在Stud数据库的表项下方出现db.student和dbo.score两个表项,选中student表,右击鼠标,在出现的快捷菜单中选择“打开表”,可以输入表记录。在student和score表中输入的记录分别如图9.3和9.4所示(分别对应表9.1和表9.2中的记录)。本章后面的例子使用这些样本数据介绍数据库编程方法。图9.1student表结构图9.2score表结构图9.3student表记录图9.4score表记录3.权限设置为了在网页中访问Stud数据库,必须给Stud数据库设置一些访问权限,否则在网页运行时出现以下错误:无法打开登录所请求的数据库Stud。登录失败。用户'LCB-PC\ASPNET'登录失败。为了简单,给Stud数据库设置一些公共用户访问权限,其操作如下:(1)右击数据库项下的“Stud”项,在出现的快捷菜单中选择“属性”命令,在出现的“数据库属性-Stud”对话框中单击“选项页”中的“权限”项,此时全为空白项,说明没有授予任何权限。(2)单击“添加”命令按钮,在出现的“选择用户或角色”对话框中单击“浏览”命令按钮。(3)在出现的对话框中勾选“[public]”项,返回到“数据库属性-Stud”对话框。(4)通过勾选“public的显式权限”列表中的Delete、Insert、Select、Update的授予项以授予相应权限。如图9.5所示。9.1.3结构化查询语言(SQL)1.SQL语言的组成SQL语言包含查询、操纵、定义和控制等几个部分。它们都是通过命令动词分开的,各种语句类型对应的命令动词如下:数据查询的命令动词为SELECT。数据定义的命令动词为CREATE、DROP。数据操纵的命令动词为INSERT、UPDATE、DELETE。数据控制的命令动词为GRANT、REVOKE。2.数据定义语言(1)CREATE语句CREATE语句用于建立数据表,其基本格式如下:CREATETABLE表名(列名1数据类型1[NOTNULL][,列名2数据类型2[NOTNULL]]…)(2)DROP语句DROP语句用于删除数据表,其基本格式如下:DROPTABLE表名3.数据操纵语言(1)INSERT语句INSERT语句用于在一个表中添加新记录,然后给新记录的字段赋值。其基本格式如下:INSERTINTO表名[(列名1[,列名2,…])]VALUES(表达式1[,表达式2,…])(2)UPDATE语句UPDATE语句用于新的值更新表中的记录。其基本格式如下:UPDATE表名SET列名1=表达式1[,SET列名2=表达式2]…WHERE条件表达式(3)DELETE语句DELETE语句用于删除记录,其基本格式如下:DELETEFROM表名[WHERE条件表达式]4.数据查询语句SQL的数据查询语句是使用很频繁的语句。SELECT的基本格式如下:SELECT字段表FORM表名WHERE查询条件GROUPBY分组字段HAVING分组条件ORDERBY字段[ASC|DESC]各子句的功能如下:SELECT:指定要查询的内容。FORM:指定从其中选定记录的表名。WHERE:指定所选记录必须满足的条件。GROUPBY:把选定的记录分成特定的组。HAVING:说明每个组需要满足的条件。ORDERBY:按特定的次序将记录排序。【例9.4】查询student表中“09002”班所有学生记录。SELECT*FROMstudentWHERE班号='09002'SELECTstudent.学号,student.姓名,score.课程名,score.分数FROMstudent,scoreWHEREstudent.学号=score.学号ORDERBYscore.课程名【例9.6】查询所有学生的学号、姓名、课程名和分数,要求按课程名排序。【例9.7】查询分数在80~90之间的所有学生的学号、姓名、课程名和分数。SELECTstudent.学号,student.姓名,score.课程名,score.分数FROMstudent,scoreWHEREstudent.学号=score.学号ANDscore.分数BETWEEN80AND90【例9.8】查询每个班每门课程的平均分。SELECTstudent.班号,score.课程名,AVG(score.分数)AS'平均分'FROMstudent,scoreWHEREstudent.学号=score.学号GROUPBYstudent.班号,score.课程名【例9.9】查询最高分的学生姓名和班号。SELECTstudent.姓名,student.班号FROMstudent,scoreWHEREstudent.学号=score.学号ANDscore.分数=(SELECTMAX(分数)FROMscore)9.2ADO.NET模型9.2.1ADO.NET简介ADO.NET是在.NETFramework上访问数据库的一组类库,它利用.NETDataProvider(数据提供程序)以进行数据库的连接与访问。通过ADO.NET,数据库程序设计人员能够很轻易地使用各种对象来访问符合自己需求的数据库内容。9.2.2ADO.NET体系结构【说明】①ADO.NET是在.NETFramework上访问数据库的一组类库。②ADO.NET将数据库中的数据将通过DataAdapter对象,以XML的格式传送到客户端的DataSet对象中,实现数据库的离线操作。③DataSet对象被称为“内存数据库”,具有DBMS的主要功能。(如:DataSet对象中含有DataTable对象、DataTable又含有DataRow、DataColum对象……)④客户端对数据的操作都是在本地DataSet对象中完成的。最后,再通过DataAdapter对象“回写”到数据库中。⑤ADO.NET也提供“快捷、简单”的数据读取方法。如:通过,DataReader对象实现针对查询结果的只读操作。1..NETDataProvider.NETDataProvider是指访问数据源的一组类库,主要是为了统一对于各类型数据源的访问方式而设计的一套高效能的类库。下表给出了.NETDataProvider中包含的4个对象。对象名称功能说明Connection提供和数据源的连接功能。Command提供运行访问数据库命令,传送数据或修改数据的功能,例如运行SQL命令和存储过程等。DataAdapter是DataSet对象和数据源间的桥梁。DataAdapter使用4个Command对象来运行查询、新建、修改、删除的SQL命令,把数据加载到DataSet,或者把DataSet内的数据送回数据源。DataReader通过Command对象运行SQL查询命令取得数据流,以便进行高速、只读、按顺序的数据浏览。在.NETFramework中常用的有如下4组数据提供程序:(1)SQL.NETDataProvider(2)OLEDB.NETDataProvider(3)ODBC.NETDataProvider(4)ORACLE.NETDataProvider用于访问不同类型的数据库资源。【注意】如果采用SQL.NETDataProvider访问SQLServer数据源,则相应的ADO.NET对象名称之前都要加上“SQL”。如:SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader。2.DataSetDataSet(数据集)是ADO.NET离线数据访问模型中的核心对象,主要使用时机是在内存中暂存并处理各种从数据源中所取回的数据。DataSet其实就是一个存放在内存中的数据暂存区,这些数据必须通过DataAdapter对象与数据库进行数据交换。在DataSet内部允许同时存放一个或多个不同的数据表(DataTable)对象。这些数据表是由数据列和数据域所组成的,并包含有主索引键、外部索引键、数据表间的关系(Relation)信息以及数据格式的条件限制(Constraint)。9.2.3ADO.NET数据库的访问流程ADO.NET数据库访问的一般流程如下:(1)建立Connection对象,创建一个数据库连接。(2)在建立连接的基础上可以使用Command对象对数据库发送查询、新增、修改和删除等命令。(3)创建DataAdapter对象,从数据库中取得数据。(4)创建DataSet对象,将DataAdapter对象填充到DataSet对象(数据集)中。(5)如果需要,可以重复操作,一个DataSet对象可以容纳多个数据集合。(6)关闭数据库连接。(7)在DataSet上进行所需要的操作。若数据集的数据要输出到窗体中或者网页上,则可将DataSet绑定道数据控件上。9.3ADO.NET的数据访问对象9.3.1SqlConnection对象在数据访问中首先必须是建立数据库的物理连接。.NETDataProvider使用SqlConnection类的对象建立与SQLServer数据库的物理连接。1.SqlConnection类SqlConnection类的属性说明ConnectionString获取或设置用于打开数据库的字符串。Connection