文章教程

第9章数据库基础与数据访问控件

8/31/2020 8:49:51 PM 人评论 次浏览

第9章 数据库基础与数据访问控件

随着计算机软硬件技术的提高,数据管理技术也从原来的文件系统阶段发展到了现在的数据库系统阶段。提供数据库访问方法已成为所有应用程序开发平台的一种事实标准。

任何一个应用程序对数据库的操作无非是数据的增、删、改、查和操作结果的展示。Visual Studio提供了一些功能强大的、专门用于数据库操作结果展示的控件,如GridView、DataList、FormView、Repeater和DetailsView等。使用这些控件可以将数据表或查询结果关联到显示界面。通常将这种关联操作称为“数据绑定”,用于数据绑定的控件称为“数据绑定控件”。

9.1 使用数据库系统

数据库系统是由计算机硬件、操作系统、数据库管理系统,以及在其他对象支持下建立起来的数据库、数据库应用程序、用户和维护人员等组成的一个整体。

数据库是存放各类数据的文件,而数据库应用程序则是管理和使用这些数据的用户接口。也就是说用户是通过数据库应用程序来查询、添加、删除和修改保存在数据库中的数据的。

数据库的种类有很多,但最常用的是关系型数据库。在关系型数据库中是根据表、记录和字段之间的关系进行数据组织和访问的。它通过若干个表(Table)来存储数据,并通过关系(Relation)将这些表联系在一起。

一个关系型数据库中可以包含若干张表,每张表又由若干记录(行)组成,记录由若干字段(列)组成。表与表之间通过关系连接。这种结构与Excel工作簿十分相似。

9.1.1 创建Microsoft SQL Sever数据库

Microsoft SQL Server(以下简称为SQL Server)是美国微软公司推出的一个数据库软件,在中小应用环境中有很高的市场占有率,目前其最高版本为SQL Server 2016。为了方便开发人员和小型桌面应用程序设计,Microsoft提供了对应于各个版本的、免费的、体积较小且具有SQL Server主要功能的SQL Server Express版,它可以运行在Windows 7、Windows 10等非服务器版的Windows操作系统中。

Visual Studio 2015中内置了SQL Server 2014 Express LocalDB版(安装升级包后,可自动更新为LocalDB 2016),LocalDB是SQL Server Express的一种运行模式,也可以理解为超轻量级的SQL Server,特别适合在开发环境中使用。本书所有涉及SQL Server的内容和示例均以LocalDB版为背景。

1.新建数据库和数据表

在解决方案资源管理器窗口中右击网站名称,在弹出的快捷菜单中选择“添加”→“添加新项”命令,在弹出的如图9-1所示的对话框中选择新项类型为“SQL Server数据库”,并在下方的“名称”文本框中为数据库命名,如本例的“mydb.mdf”(mdf为SQL Server数据库的规定扩展名,不能更改)。设置完毕后单击“添加”按钮,系统将弹出信息框询问是否需要将数据库文件存放在专用于存放数据文件的App_Data文件夹中,一般应选择“是”。系统将按照用户的选择,在网站中创建一个App_Data文件夹,并将新建的空数据库文件存放到其中。

978-7-111-58440-7-Chapter09-1.jpg

图9-1 向网站中添加SQL Server数据库

为方便数据库管理,Visual Studio提供了一个简单的、可操作本地或远程SQL Server数据库的“服务器资源管理器”。在Visual Studio中选择“视图”→“服务器资源管理器”命令,可切换到该窗口,如图9-2所示。

在“服务器资源管理器”窗口中右击数据库名称下的“表”,在弹出的快捷菜单中选择“添加新表”命令,打开如图9-3所示的“表设计器”窗口。在该窗口中使用可视化或T-SQL语句的方式创建表结构(指定各字段的名称、数据类型及是否允许为空等)。表结构设计完毕后,需要在T-SQL窗格中指定表名称(如本例的users,系统默认值为Table)。

978-7-111-58440-7-Chapter09-2.jpg

图9-2 添加新表

978-7-111-58440-7-Chapter09-3.jpg

图9-3 设计表结构

最后单击“更新”按钮,在弹出的对话框中单击“更新数据库”按钮,将新表按指定名称保存到数据库中。

若需修改表结构,可在“服务器资源管理器”窗口中右击表名称,在弹出的快捷菜单中选择“打开表定义”命令。若需向表中添加或修改记录,可右击表名称,在弹出的快捷菜单中选择“显示表数据”命令。若需删除某条记录,可在显示记录窗口中右击该记录,在弹出的快捷菜单中选择“删除”命令。

2.SQL Server中常用数据类型

与程序设计时相同,存储在数据库中的数据也需要在设计时就指定其数据类型,以下是SQL Server中最常用的,也是最基本的数据类型。

(1)char(n)

char(n)是一种字符类型,它需要定长存储,这意味着为它指定的长度n将用于所有存储该类型的列或变量中所存储的值。例如,如果指定char(20),表中包含那一列的每一行都将使用20个字符,如果数据列中只使用了2个字符,则其余18位将使用空格填充。

(2)varchar(n)

varchar用于声明一个包含n个可变长度的非Unicode字符列。它是SQL Server中最有用的字符类型之一,因为它所存储的字符数据可以表示大多数数据,同时它也不会因字段值长度不同而浪费存储空间。

(3)nvarchar(n)

包含n个字符的可变长度Unicode字符列,占用存储空间的字节数是所输入字符个数的两倍。一般情况下,若数据是字母或符号可使用varchar类型,数据是汉字时最好使用nvar-char类型。

(4)text

text类型用来存储由大量文本组成的文本块的,最多可以存放多达2GB的字符数据。

(5)int

int类型用于存储整型数字,占4字节的存储空间,允许的数据范围为-231~231-1。对于更大或更小的数据可以使用bigint(8字节)、smallint(2字节)或tinyint(1字节)类型。需要注意的是,tinyint类型能存储的最大整数为255。

(6)real和float

real和float都是浮点数据类型。同样,它们范围内的任何值都无法被精确地表示,因此被称为近似数字。

(7)decimal

精确数值型,用来存储从-1038-1~1038-1的固定精度和范围的数值型数据。使用这种数据类型时必须指定范围和精度。

(8)money和smallmoney

money和smallmoney数据类型用来表示货币值。能精确到货币单位的万分之一。money类型能存储从-9220亿~9220亿的数据,smallmoney类型占用较小的存储空间,但只能存储从-214748.3648~214748.3647的数据。

(9)datetime

datetime作为两个4字节整数存储。第一个整数说明超前或落后于系统基本时间(1900年1月1日)的天数。后1字节记录小时之后的毫秒数。

datetime类型的有效日期范围从1753年1月1日开始,直到9999年的最后一天,并且它对毫秒的记录为它提供了3.33毫秒的精确度。关于日期时间类型数据SQL Server还提供有date、datetime2、datetimeoffset、smalldatetime和time等类型。

9.1.2 常用的SQL语句

结构化查询语言(Structured Query Language,SQL)是专为数据库而建立的操作命令集,它是一种功能齐全的数据库语言,并且现在几乎所有的数据库均支持SQL。SQL语句书写时不区分大小写。

使用SQL语句可以从数据库中返回一个或多个表中的部分或全部记录,返回的记录中可以包含全部或部分字段,并且可以按指定的方式进行记录排序。通常将使用SQL语句返回的数据集合称为“数据集”,它是大多数数据库应用程序的操作对象。

1.查询语句(SELECT)

SELECT语句主要用于从数据库中返回需要的数据集,其语法格式如下。

978-7-111-58440-7-Chapter09-4.jpg

各参数的说明如下。

1)select_list:选择列表用来描述数据集的列,它是一个用逗号分隔的表达式列表。每个表达式定义了数据类型、大小及数据集列的数据来源。在选择列表中可以使用“∗”号指定返回源表中所有的列(字段)。

2)INT Onew_table_name:使用该子句可以通过数据集创建新表,new_table_name表示新建表的名称。

3)FROM table_list:在每条要从表或视图中检索数据的SELECT语句中,都必须包含一个FROM子句。使用该语句指定要包含在查询中的所有列以及WHERE所引用的列所在的表或视图。用户可以使用As子句为表和视图指定别名。

4)WHERE:这是一个筛选子句,它定义了源表中的行要满足SELECT语句的要求所必须达到的条件。只有符合条件的行才会被包含在数据集中。WHERE子句还用在DELETE和UPDATE语句中,指定需要删除或更新记录的条件。

5)GROUP BY:该语句根据group_by_list中的定义,将返回的记录集结果分成若干组。

6)HAVING:该语句是应用于数据集的附加筛选。HAVING子句从中间数据集对行进行筛选,这些中间数据集是用SELECT语句中的FROM、WHERE或GROUP BY子句创建的。该语句通常与GROUPBY语句一起使用。

7)ORDER BY:该语句定义了数据集中的行排列顺序(排序)。order_list指定了列排列的顺序。可以使用ASC或DESC指定排序是按升序还是降序。

下列列举几个实例。

返回“学生信息”表中的所有记录的语句如下。

SELECT∗FROM学生信息 //通配符“∗”表示包括记录中所有字段

从“学生信息”表中查询“姓名”字段值为“张三”的记录,但仅返回记录的“姓名”字段,代码如下。

978-7-111-58440-7-Chapter09-5.jpg

从“学生信息”表中返回“姓名”“班级”和“总分”字段,条件为“性别”是“女”,并且“总分”大于360,代码如下。

978-7-111-58440-7-Chapter09-6.jpg

从“学生成绩”表中返回姓名字段中含有“张”的所有记录。这是在实现“模糊”查询时常用的手段。语句中的“%”为通配符,表示任意字符串。

SELECT∗FROM学生信息WHERE姓名LIKE%张%

将表9-1和表9-2通过“课程名称”字段进行关联,返回一个多表查询数据集。要求其中包括“学号”“姓名”“课程名称”和“主讲教师”4个字段。

9-1 学生选课

978-7-111-58440-7-Chapter09-7.jpg

9-2 任课教师表

978-7-111-58440-7-Chapter09-8.jpg

SELECT学生选课.学号,学生选课.姓名,学生选课.课程名称,任课教师.主讲教师

FROM任课教师INNER JOIN学生选课ON任课教师.课程名称=学生选课.课程名称

2.插入记录语句(INSERT)

使用INSERT语句可以向表中插入一条记录,该语句的语法格式如下。

INSERTINTO表名称(字段名)VALUE(字段值)

例如,下列语句用于向“学生成绩”表中插入一条记录,并填写“编号”字段值为0009,“数学”“语文”和“英语”字段(成绩)的值依次为89、76和92。

INSERT INTO学生成绩(编号,数学,语文,英语)VALUES(0009,89,76,92)

3.修改记录语句(UPDATE)

使用UPDATE语句可更新(修改)表中的数据,该语句的语法格式如下。

UPDATE表名称SET字段名=值WHERE条件

举例如下。

将“学生成绩表”中“总分”大于300的所有记录的“等级”字段值更改为“优秀”,代码如下。

978-7-111-58440-7-Chapter09-9.jpg

修改grade表中学号为0006的学生的数学为86,语文为87,英语为88,代码如下。

978-7-111-58440-7-Chapter09-10.jpg

4.删除记录语句(DELETE)

使用DELETE语句可以删除数据表中指定的行,该语句的语法格式如下。

DELETE FROM表名称WHERE条件

例如,下列语句用于删除学生信息表中“班级”字段值为“网络0001”的所有记录(行)。

978-7-111-58440-7-Chapter09-11.jpg

在实际应用中,SQL语句是作为字符串被引用的,所以其中的关键字不区分大小写,但数据表名称和字段名不要使用中文来定义,上例中仅是为了使读者更容易理解SQL语句的含义才以中文表示了表名称和字段名。由于篇幅所限,不能尽述SQL的使用方法和技巧,读者可参阅有关参考资料。

9.1.3 Microsoft SQL Server常用操作

在简单的应用范围中,使用前面介绍的SQL语句就能很好地完成对数据库的查询、修改、添加或删除操作,但在一些较大应用中,可能因数据库中记录条数众多而影响操作的速度,此时就需要使用“存储过程”等技术来提高应用程序的运行效率。此外,在将数据库文件中一台计算机迁移到另一台计算机时,还需要使用数据库的“分离”或“附加”功能。

1.创建存储过程

存储过程可以使得对数据库的管理,以及显示关于数据库及其用户信息的工作容易得多。存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行,以及提供其他强大的编程功能。

存储过程可包含程序流、逻辑,以及对数据库的查询。它们可以接受参数、输出参数,以及返回单个或多个结果集及返回值。

使用存储过程具有以下优点:

1)可以在单个存储过程中执行一系列SQL语句。

2)可以在自己的存储过程中引用其他存储过程,这可以简化一系列复杂的SQL语句,提高语句的利用率。

3)存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句要快许多。

一般情况下,数据库应用程序中需要经常、反复使用的SQL查询或其他操作,应在设计数据库时就创建相应的存储过程。

在Visual Studio的“服务器资源管理器”中创建存储过程的操作步骤如下。

在“服务器资源管理器”窗口中连接某数据库,并展开其内容列表。右击内容列表中的“存储过程”选项,在弹出的快捷菜单中选择“添加新存储过程”命令,在弹出的对话框中选择数据来源(表、视图或函数等,一般可选择某数据表)后单击“添加”按钮,在Visual Studio中打开如图9-4所示的存储过程代码设计窗口。

可以看到系统已自动创建了存储过程的框架代码,程序员只要在框架中填入相应的代码即可。例如,下列代码创建了一个名为SelectUser的存储过程,当该存储过程执行时能从users表中返回指定username字段值的记录。

978-7-111-58440-7-Chapter09-12.jpg

978-7-111-58440-7-Chapter09-13.jpg

978-7-111-58440-7-Chapter09-14.jpg

图9-4 存储过程代码编辑窗口

其中,@username表示需要从外界接收的参数(用户名);AS关键词后面是存储过程需要执行的SQL语句;RETURN表示终止执行,无条件退出(该语句如果在最后一行,则可省略)。

存储过程创建完毕后,可在“服务器资源管理器”窗口中右击“存储过程”文件夹下的存储过程名称,在弹出的快捷菜单中选择“执行”命令,在弹出的如图9-5所示的对话框中输入需要传递的参数值后(如本例的zhang-san),单击“确定”按钮,在输出窗口中即可看到如图9-6所示的输出结果。

978-7-111-58440-7-Chapter09-15.jpg

图9-5 输入存储过程需要的参数

978-7-111-58440-7-Chapter09-16.jpg

图9-6 存储过程执行结果

又如,下列代码创建的存储过程editstu,可从外界接收两个数据:@stuno(学号)和@result(成绩),并将Exam(考试)表中的stuno字段值为@stuno的记录的result字段值改为@result中接收的数据。

978-7-111-58440-7-Chapter09-17.jpg

2.分离和附加数据库

开发人员经常会遇到需要将某SQL Server数据库平台中的数据库安全地迁移到另一服务器中使用的问题,SQL Server提供的“分离”和“附加”数据库功能可以帮助用户方便地完成数据库迁移工作。

SQL Server允许“分离”数据库的数据和事务日志文件,然后将其重新“附加”到另一台服务器上。分离数据库操作将使数据库脱离SQL Server的管理成为独立的数据库文件(一个数据库文件.mdf和一个事务日志文件.ldf)。只有完成了分离操作,数据库和事务日志文件才可以复制或移动到其他位置。

(1)分离数据库

如图9-7所示,在服务器资源管理器的“数据连接”选项下,右击需要分离的数据库名称,在弹出的快捷菜单中选择“分离数据库”命令即可完成分离操作。数据库分离后若需要重新连接,可选择快捷菜单中的“修改连接”命令。

(2)附加数据库

首先需要将从其他计算机分离复制过来或从Internet中下载的数据库文件复制到安装有SQL Server Express LocalDB的计算机中,启动Visual Studio,在“服务器资源管理器”中右击“数据连接”选项,在弹出的快捷菜单中选择“新建连接”命令,弹出如图9-8所示的“添加连接”对话框。

978-7-111-58440-7-Chapter09-18.jpg

图9-7 分离数据库

978-7-111-58440-7-Chapter09-19.jpg

图9-8 “添加连接”对话框

1)单击“更改”按钮,选择“数据源”类型为“Microsoft SQL Server数据库文件(SqlClient)”。

2)单击“浏览”按钮,选择需要附加的数据库文件(日志文件必须与数据库文件保存在同一文件夹中)。

3)若为本地SQL Server数据库系统,则可选择登录方式为“使用Windows身份验证”;若为远程数据库系统则一般应选择“使用SQL Server身份验证”方式。

4)单击对话框下方的“测试连接”按钮,可在执行附加前进行检测,检测无误后可单击“确定”按钮执行附加操作。

“附加”完成后新数据库即成为服务器所管辖的数据库之一,可以按照服务器定义的相关设置对其进行管理,或在ASP.NET网站中使用该数据库。

9.1.4 创建MicrosoftAccess数据库

Access数据库管理系统是Microsoft Office的一个组件,是最常用的本地数据库之一,在Visual Studio中可以方便地使用各种数据库对象操作Access数据库。Access特别适合小型网站或单机版Windows应用程序开发。

1.创建数据库

在Windows的“开始”菜单中选择Microsoft Office→Microsoft Access 2010命令。在打开的Access程序窗口中选择“空数据库”模板,输入数据库文件名并选择保存位置,然后单击“创建”按钮。至此一个空Access数据库创建完毕,并以指定的文件名(∗.accdb)保存在指定的文件夹中。用户可以继续创建需要的表,也可以退出Access,待以后需要时再将其打开完成后续工作。

2.创建数据表

新建或打开数据库后,单击工具栏中的“设计”按钮978-7-111-58440-7-Chapter09-20.jpg ,在指定了表名称后系统将打开如图9-9所示的创建表结构窗口,在此可以依次输入各字段的名称、选择数据类型,在“字段属性”栏中输入字段的大小、格式等属性值。表结构设计完毕后,单击设计视图窗格右上角的“关闭”按钮978-7-111-58440-7-Chapter09-21.jpg 退出设计视图(注意是关闭设计视图窗格,而不是关闭Access窗口)。

978-7-111-58440-7-Chapter09-22.jpg

图9-9 Access设计视图

一般应在每个表中指定一个字段为该表的主键(带有978-7-111-58440-7-Chapter09-23.jpg 标记的字段),主键应唯一地代表一条记录,即所有记录中该字段没有重复的值。有了主键后,可以方便地与数据库中的其他表进行关联,并利用主键值相等的规则结合多个表中的数据创建查询。

如果需要修改表结构,可以在Access窗口左侧的“所有Access对象”窗格中选择表名称,然后单击工具栏中的“设计”按钮,重新进入创建表结构窗口进行必要的修改。

双击“所有Access对象”窗格中的表名称,可以将其打开到表数据输入窗格。需要注意的是输入数据记录时,表中的主键字段值不允许空缺。输入完毕后关闭输入窗格,将数据保存在数据库文件中。

需要说明的是,在ASP.NET网站中使用扩展名为accdb的Access 2007格式的数据库时需要安装Access 2007数据组件“AccessDatabaseEngine.exe”,否则会出现“未在本地计算机上注册Microsoft.ACE.Oledb.12.0提供程序”的出错提示。若无特殊需要,可在完成了Access数据库设计后,选择“文件”→“保存并发布”命令,将数据库保存成Access 2003格式(扩展名为mdb)。

9.2 使用数据控件访问数据库

对数据库的基本操作无非就是增、删、改、查4项内容,但为了在程序中实现这些基本操作经常需要编写大量的重复代码。Visual Studio为了减轻开发人员的工作量,提供了一种自动将数据按照指定格式显示到程序界面上的技术,通常将这种技术称为“数据绑定”,将用于显示数据和操作数据库的控件称为“数据访问控件”。

9.2.1 使用数据源控件

ASP.NET在ADO.NET的数据模型基础上进行了进一步的封装和抽象,提出了一个新的概念“数据源控件”(DataSource Control),这些控件被放置在Visual Studio工具箱的“数据”选项卡中,分别以xxxxDataSource命名(如SqlDataSource、LinqDataSource等)。在数据源控件中隐含了大量常用的数据库操作基层代码,使用数据源控件配合数据绑定控件(如Grid-View、FormView等)可以方便地实现对数据库的常规操作,而且几乎不需要编写任何代码。在程序运行时数据源控件是不会被显示到屏幕上的,但它却能在后台完成许多重要的工作。数据源控件的类型主要有以下几种。

1.SqlDataSource

SqlDataSource数据源控件主要为连接Microsoft SQL Server数据库而设计,在中等以上规模的ASP.NET网站中建议使用这种数据库来存放需要的数据。使用SqlDataSource控件还能建立与Access、Oracle、ODBC及OLEDB等数据库的连接,并对这些数据库执行查询、插入、编辑或删除操作。

2.ObjectDataSource

当应用系统较为复杂,需要使用三层分布式架构时,可以将中间层的逻辑功能封装到这个控件中,以便在应用程序中共享。通过ObjectDataSource控件可以连接和处理数据库、数据集、DataReader或其他任意对象。

3.XmlDataSource

XML文件通常用来描述层次型数据,通过XmlDataSource数据源控件可以将一个XML文件绑定到一个用于显示层次结构的的TreeView控件上,使用户可以方便、明了地访问XML文件中的数据。

4.SiteMapDataSource

SiteMapDataSource数据源控件可用来按层次浏览网站上的所有内容,该控件需要与一个XML格式的网站地图文件∗.sitemap和一个TreeView控件与之配合,站点地图文件用来设置网页之间的逻辑关系,TreeView控件用于显示这些逻辑关系。

5.LinqDataSource

使用该控件可以在DataContext类的基础上,配合GridView、DataList等数据访问控件可以非常简单地实现LINQ to SQL对数据库的增、删、改、查等操作,而且程序员几乎不用编写任何代码。

9.2.2 使用GridView控件

GridView控件是ASP.NET中最为常用的数据访问控件,配合用于连接SQL Server数据库的SqlDataSource数据源控件可对数据库进行浏览、编辑和删除等操作。

【演练9-1】本例以创建一个能操作SQL Server数据库的ASP.NET应用程序为例,介绍SqlDataSource数据源控件配合GridView控件实现数据浏览、编辑和删除操作的设计方法。

程序运行后在浏览器中显示如图9-10所示的页面,其中显示有当前数据源中的所有记录。单击某列标题(字段名),可使数据按此列进行排序(连续单击可在升序或降序之间切换)。

978-7-111-58440-7-Chapter09-24.jpg

图9-10 浏览数据库

如果用户单击页面中的“删除”链接,则所在行的数据记录将直接从数据库中删除。如果用户单击页面中的“编辑”链接,则页面切换为如图9-11所示的编辑模式,用户在修改了数据后可单击“更新”链接将现有数据保存到数据库中,单击“取消”链接则放弃对数据的修改。

978-7-111-58440-7-Chapter09-25.jpg

图9-11 修改数据

(1)添加数据表和数据源控件

新建一个ASP.NET空网站,向网站中添加一个Web窗体页面Default.aspx。切换到Default.aspx的设计视图,向窗体中添加一个数据表格控件GridView1和一个数据源控件SqlDataSource1,如图9-12所示。

978-7-111-58440-7-Chapter09-26.jpg

图9-12 添加到页面的GridView和SqlDataSource控件

SqlDataSource控件用于建立与SQL Server数据库的连接,负责向数据访问控件(如GridView、DataL-ist、DatailsView和FormView等)提供数据绑定。由于该控件在程序运行时是不可见的,故可以放置在页面的任何位置。

(2)创建数据库

在解决方案资源管理器中右击网站名称,在弹出的快捷菜单中选择“添加”→“添加新项”命令,在弹出的对话框中选择“SQL Server数据库”选项后单击“添加”按钮,向网站中添加一个App_Data文件夹和保存在其中的、名为employee.mdf的SQL Server数据库文件。参照本章前面介绍过的方法,在数据库中创建一个名为emp的数据表,按如图9-13所示设计表结构并录入一些用于测试的数据。

978-7-111-58440-7-Chapter09-27.jpg

图9-13 emp表中的数据

(3)配置数据源

选中SqlDataSource控件后,其右上角会出现一个箭头按钮,单击该按钮将显示控件的任务菜单,选择“配置数据源”命令,在弹出的“配置数据源”对话框中单击“新建连接”按钮。在弹出的如图9-14所示的“添加连接”对话框中选择“数据源”类型为“Microsoft SQL Server数据库文件(SqlCli-ent)”。单击“浏览”按钮,选择网站App_Data文件夹下的“employee.mdf”数据库文件后单击“确定”按钮,系统将返回到如图9-15所示的“配置数据源”对话框。此时,单击对话框中“连接字符串”前面的“+”标记,可以看到由系统自动生成的数据库连接字符串内容。关于连接字符串将在后续章节中详细介绍。

978-7-111-58440-7-Chapter09-28.jpg

图9-14 添加连接对话框

978-7-111-58440-7-Chapter09-29.jpg

图9-15 由系统自动生成的连接字符串

创建了数据连接后,在“配置数据源”对话框中单击“下一步”按钮,在弹出的对话框中直接单击“下一步”按钮,接受系统推荐将连接字符串保存到配置文件web.config中。

在如图9-16所示的“配置Select语句”对话框中可选择或自行书写适当的Select语句,以指定从数据库中返回哪些数据。本例选择了“∗”表示返回数据库中所有记录的所有字段。

单击对话框中的WHERE按钮可设置返回记录的条件,单击ORDER BY按钮可设置返回记录的排序方法。

若单击对话框中的“高级”按钮,将弹出如图9-17所示的对话框,用户可选择是否自动生成用于添加记录(INSERT)、更新记录(UPDATE)和删除记录(DELETE)的SQL语句,同时也可选择是否使用“开放式并发”,设置完毕后单击“确定”按钮。

978-7-111-58440-7-Chapter09-30.jpg

图9-16 配置Select语句

978-7-111-58440-7-Chapter09-31.jpg

图9-17 高级SQL生成选项

返回到“配置Select语句”对话框后单击“下一步”按钮,在如图9-18所示的“测试查询”对话框中单击“测试查询”按钮,在数据区应能显示出正确的返回结果。测试完毕后单击“完成”按钮,结束“数据源配置”向导。

978-7-111-58440-7-Chapter09-32.jpg

图9-18 测试生成的Select查询

(4)绑定数据源

数据源配置结束后,需要配置用于显示和操作数据库的GridView控件,将数据源与GridView控件绑定。在如图9-19所示的GridView任务菜单中单击“选择数据源”下拉按钮,并选择前面创建的数据源SqlDataSource1,将数据源绑定到GridView控件。

如图9-20所示,选择了数据源后GridView任务菜单中将多出若干选项。若希望程序具有“分页”“排序”“编辑”或“删除”等数据库操作功能可选择相应的复选框。启用“排序”功能后,用户可通过单击某列的标题实现按该列排序,连续单击可在升序和降序之间循环切换。

978-7-111-58440-7-Chapter09-33.jpg

图9-19 将数据源绑定到GridView

978-7-111-58440-7-Chapter09-34.jpg

图9-20 选择程序功能

(5)设置GridView控件的属性

选择GridView任务菜单中的“编辑列”命令,弹出如图9-21所示的对话框。为了在GridView控件中显示中文的列标题,可在“选定的字段”列表框中逐一选择各字段,并将其HeaderText属性设置为相应的中文名称(如编号、姓名等)。

在“选定的字段”列表框中选择CommandField(命令字段),设置Item-Style(行样式)属性集Font(字体)子集中的Size(大小)属性为Smaller(较小),Wrap(是否允许换行)为False,width属性为60px(列宽为60px)。

978-7-111-58440-7-Chapter09-35.jpg

图9-21 设置列属性

依次选择编号、姓名、性别等字段,将HeaderStyle(标题样式)属性集Font子集中的Size属性设置为Smaller,将HorzontalAlign(水平对齐)属性设置为Center(居中),Warp属性设置为False。

依次选择编号、姓名、性别等字段,将ItemStyle(行样式)属性集Font子集中的Size属性设置为Smaller,将HorzontalAlign(水平对齐)属性设置为Center,Warp属性设置为False。

在设计视图中选择GridView控件,在“属性”窗口中设置其Caption属性为“<h2>员工基本情况表</h2>”(使用“h2”样式为数据表添加标题);设置RowStyle属性集下的height属性为27px(设置GridView控件的行高为27px);设置GridView控件的Width属性为500px(控件的宽度)。

GridView控件的外观样式除了可以如上所述在编辑列属性和GridView的“属性”窗口中进行设置外,也可以通过直接在Web窗体的源视图中编写样式设置代码的方式进行设置。若网站中存在多个需要设置成统一风格的GridView控件,就需要使用主题和外观文件配合进行统一的设置。图9-22所示为经过上述设置后,在Web窗体的源视图窗口中看到的、由系统自动生成的代码。

978-7-111-58440-7-Chapter09-36.jpg

图9-22 GridView控件在源视图中的代码

9.2.3 使用FormView控件

FormView控件与前面介绍过的GridView控件相似,也是用于浏览或操作数据库的数据访问控件。它与GridView相比,主要的不同在于显示在FormView中的数据记录是分页的,即每页只显示一条记录。此外,FormView控件还提供较为完整的模板编辑手段,开发人员可以在可视化环境或源视图中修改控件的外观。

FormView控件的常用属性如表9-3所示。

9-3 FormView控件的常用属性

978-7-111-58440-7-Chapter09-37.jpg

FormView控件支持的主要事件如表9-4所示。

9-4 FormView控件的常用事件

978-7-111-58440-7-Chapter09-38.jpg

(续)

978-7-111-58440-7-Chapter09-39.jpg

【演练9-2】使用FormView数据控件配合SqlData-Soure控件创建一个用于浏览和操作SQL Server数据库的应用程序。

程序运行后屏幕上显示如图9-23所示的数据浏览界面,单击页面下方的数字可跳转到相应的记录页面。单击“删除”链接将从数据库中删除当前记录。

单击“编辑”链接显示如图9-24所示的页面,用户可编辑修改数据。修改完毕后单击“更新”链接保存结果,单击“取消”链接放弃修改。

单击“新建”链接将显示如图9-25所示的页面,用户可输入新记录的各字段值。单击“插入”链接可将数据保存到数据库,单击“取消”链接将返回浏览页面。

978-7-111-58440-7-Chapter09-40.jpg

图9-23 浏览数据

978-7-111-58440-7-Chapter09-41.jpg

图9-24 修改数据

978-7-111-58440-7-Chapter09-42.jpg

图9-25 添加新记录

(1)添加数据源控件

新建一个ASP.NET空网站,向网站中添加一个Web窗体页Default.aspx。双击工具箱“数据”选项卡中的SqlDataSource控件图标将其添加到页面中。将【演练9-1】中创建的App_Data文件夹及其中的SQL Server数据库文件复制到网站中,在解决方案资源管理器中右击网站名称,在弹出的快捷菜单中选择“刷新文件夹”命令。通过SqlDataSource1控件的任务菜单启动数据源配置向导,在“选择您的数据连接”对话框中通过下拉列表框选择连接对象为employee.mdf。参照【演练9-1】中介绍的方法配置SqlDataSource1,使之与前面创建的employee数据库中的emp表关联。

(2)添加和设置FormView控件

双击工具箱“数据”选项卡中的FormView控件图标,将其添加到页面中,并通过FormView任务菜单选择前面配置完毕的SqlDataSource1为控件的数据源。

一般情况下,FormView默认样式可能符合用户的需求,若要修改其样式可选择“Form-View任务”→“编辑模板”命令,在打开的模板编辑器中可通过“显示”下拉列表框分别对ItemTemplate(浏览模板)、EditItemTemplate(编辑模板)和InsertItemTemplate(插入模板)进行修改,也可以切换到页面的源视图直接编辑修改控件的HTML代码。

为了使页面整齐美观,可向模板中添加一个HTML表格用于页面定位。此外,页面中所有的字段说明文字默认取为英文的字段名,在模板编辑器窗口中应注意将其改为中文显示(可切换到源视图直接编辑HTML代码或配合主题、外观文件、CSS样式表修改页面)。

3个模板修改后的外观样式如图9-26所示。在修改记录模板中可以看到由于员工编号字段是数据表的“主键”,故在修改记录时该字段值使用标签控件显示,不允许修改。模板修改完毕后,可选择FormView任务菜单中的“结束模板编辑”命令退出编辑状态。

978-7-111-58440-7-Chapter09-43.jpg

图9-26 修改后的查看、修改和新建页面模板

9.2.4 使用Repeater控件

Repeater控件是一个数据绑定列表控件(数据浏览控件,不具备选择、编辑和添加等功能),它允许通过为列表中显示的每一项重复指定的模板来自定义数据显示布局。Repeater控件是一个基本模板数据绑定列表,它并没有内置的布局或样式,因此必须在这个控件的模板内显式声明所有的HTML布局标记、格式设置及样式标记等。也正因如此,Repeater控件具有更好的灵活性。

1.Repeater控件的模板

Repeater控件与其他数据列表控件的不同之处在于,它可以将HTML段落放置在自己的模板中,这样就可以创建更为灵活的HTML结构。

使用Repeater控件时,若要通过HTML表格显示数据,应在HeaderTemplate模板中放置<table>标记来开始此表格,然后在ItemTemplate模板中放置<tr>、<td>标记和数据绑定项来创建该表的行和列。

若要使表格中的交替项呈现不同的外观,可使用与ItemTemplate相同的内容创建Alter-natingItemTemplate模板,并为其指定一个不同的样式。最后在FooterTemplate模板中放置</table>标记完成表格的设置。

Repeater控件支持的模板及说明如表9-5所示。

9-5 Repeater控件支持的模板及说明

978-7-111-58440-7-Chapter09-44.jpg

使用Repeater控件时,可以将ItemTemplate模板和AlternatingItemTemplate模板绑定到其DataSource属性中引用的数据表或数据集,但不能将其他模板绑定到数据源。

2.使用Repeater控件

使用Repeater控件时,首先需要向页面中添加一个数据源控件(如SqlDataSource),在对数据源控件进行设置后,将其绑定到Repeater控件。Repeater控件的所有代码必须在Web页面的源视图中手动添加,这需要有一定的HTML代码编写能力。

所有数据绑定表达式都必须包含在“<%#”和“%>”标记之间。为了计算数据绑定表达式,并将计算结果格式化为字符串,应调用DataBinder对象的Eval方法来分析和计算对象的数据绑定表达式。举例如下。

//语句将返回当前数据源中当前记录的“编号”字段值

<%#DataBinder.Eval(Container.DataItem,"编号"%>

//语句以长日期格式显示“出生日期”字段的值

<%#DataBinder.Eval(Container.DataItem,"出生日期",{0:D}%>

//语句以保留两位小数的格式显示“基本工资”字段的值

<%#DataBinder.Eval(Container.DataItem,"基本工资","{0:f}"%>

【演练9-3】使用Repeater控件浏览【演练9-1】中创建的employee数据库中emp表的信息。程序运行时能直接将数据库中的所有记录显示到HTML表格中,如图9-27所示。

程序设计步骤如下。

(1)添加数据源控件

978-7-111-58440-7-Chapter09-45.jpg

图9-27 程序运行结果

新建一个ASP.NET空网站,向网站中添加一个Web窗体页Default.aspx。双击工具箱“数据”选项卡中的SqlDataSource控件图标,将其添加到页面中。将【演练9-1】中创建的App_Data文件夹及其中的SQL Server数据库文件employee.mdf和employee_log.ldf复制到网站中,在解决方案资源管理器中右击网站名称,在弹出的快捷菜单中选择“刷新文件夹”命令。通过SqlDataSource1控件的任务菜单启动数据源配置向导,在“选择您的数据连接”对话框中通过下拉列表框选择连接对象为em-ployee.mdf。参照【演练9-1】中介绍的方法配置SqlDataSource1,使之与前面创建的em-ployee数据库中的emp表关联。由于Repeater控件不支持插入、新建和编辑记录,所以在配置数据源时无须为其生成Insert(插入)、Update(更新)和Delete(删除)语句。

(2)添加Repeater控件

在设计视图环境中,向Web窗体页面中添加一个Repeater控件。选中Repeater控件,单击在其右上角出现的三角标记,在弹出的菜单中选择数据源为前面配置完毕的SqlData-Source1,如图9-28所示。

978-7-111-58440-7-Chapter09-46.jpg

图9-28 为Repeater控件选择数据源

(3)在源视图中编写模板代码

在配置了Repeater控件的数据源后,按控件上的文字提示切换到页面的源视图,编写或修改如下代码(<%-- … --%>之间的文字为注释内容)。

注意:经过前面的操作和设置,系统已在源视图中添加了Web控件的声明和设置语句,对这些内容不要进行手工修改。需要用户自己编写的只有HeaderTemplate模板、ItemTem-plate模板、AlternatingItemTemplate模板和FooterTemplate部分。而且模板代码只能添加在Repeater控件的声明语句中,即<asp:Repeater>和</asp:Repeater>标记之间。

978-7-111-58440-7-Chapter09-47.jpg

978-7-111-58440-7-Chapter09-48.jpg

9.2.5 使用DetailsView控件

DetailsView控件,顾名思义,就是用于查看细节信息的控件,其作用主要是根据用户在父表中的选择,在DetailView控件中显示子表的信息。

例如,在某数据库中有存放学校班级信息的class表和存放学生信息的students表。利用class表中的班级编号字段class_no与students表中同名字段值相同的关系(class.class_no=students.class_no),两个表之间建立了一对多的关系,即class表中的一条记录对应students表中的多条记录。对于这种关系通常将class称为父表,而将students称为子表。

DetailsView控件与GridView控件一样都继承于CompositeDataBoundControl类,因此它们具有很多共同的属性。DetailsView控件不但可以通过数据源控件连接到数据库,也可以对数据表执行插入、编辑或删除等操作。

DetailsView控件与GridView控件的最大不同点是,GridView控件是面向整个记录集合的,而DetailsView控件则是面向单条记录的。在DetailsView控件的界面中每次只能显示一条记录,而且内容按照垂直方向排列。在查询中当出现有多条符合条件的记录(例如,对应同一班级名称,可能有几十个不同的学生)时,DetailsView控件将以分页显示的方法处理。

在实际应用中,DetailsView控件通常与GridView控件或DropDownList控件配合使用,在GridView控件或DropDownList控件中显示父表数据,在DetailsView控件中显示子表中的数据。

【演练9-4】使用DetailsView控件配合GridView控件设计一个父表(Gridview控件)与子表(DetailsView控件)同步的Web应用程序。

要求使用Microsoft Access自带的示例数据库文件Northwind.mdb中的“类别”表作为父表,使用“产品”表作为子表。程序运行时显示如图9-29所示的界面,用户在左侧父表(“类别”表)中单击某项前面的“选择”链接按钮时,可以改变子表数据集中的“类别ID”,并在右侧子表(“产品”表)中显示出相同“类别ID”的数据记录集合。

在DetailsView控件中单击下方分页标记“1、2、3…”可以查看同类别不同记录的信息。程序设计原理如图9-30所示。

978-7-111-58440-7-Chapter09-49.jpg

图9-29 程序运行界面

978-7-111-58440-7-Chapter09-50.jpg

图9-30 程序设计原理

程序设计步骤如下。

(1)设计Web页面

新建一个ASP.NET空网站,向网站中添加一个App_Data文件夹并将需要的数据库文件Nothwind.mdb复制到站点App_Data文件夹中。

切换到Default.aspx的设计视图,向页面中添加一个用于布局的HTML表格,向表格中添加一个GridView控件和一个DetailsView控件,适当调整个控件的大小及位置。向页面中添加两个数据源控件SqlDataSource1和SqlDataSource2,Web页面设计如图9-31所示。

(2)配置数据源控件

选择SqlDataSource1控件,单击控件右上角出现的三角标记,在弹出的菜单中选择“配置数据源”命令,在弹出的“选择您的数据连接”对话框中单击“新建连接”按钮。在如图9-32所示的“更改数据源”对话框中选择“Microsoft Access数据库文件”选项,然后单击“确定”按钮。在如图9-33所示的“添加连接”对话框中单击“数据库文件名”后的“浏览”按钮,在弹出的对话框中选择网站App_Data文件夹下的Northwind.mdb数据库文件,单击“确定”按钮。

978-7-111-58440-7-Chapter09-51.jpg

图9-31 设计Web界面

978-7-111-58440-7-Chapter09-52.jpg

图9-32 选择数据源类型为Access文件

返回“选择您的数据连接”对话框后,单击“下一步”按钮,在如图9-34所示的“配置Select语句”对话框中,设置数据表为“类别”,选择需要显示到GridView控件中的字段为“类别ID”“类别名称”和“说明”。以后所有的选项均取默认值即可。

978-7-111-58440-7-Chapter09-53.jpg

图9-33 选择要使用的数据库文件

978-7-111-58440-7-Chapter09-54.jpg

图9-34 配置SqlDataSource1的Select语句

SqlDataSource2也需要配置到North-wind.mdb数据库,在“配置Select语句”对话框中,设置数据表为“产品”,选择需要显示到DetailsView控件中的字段为“产品ID”“产品名称”“类别ID”“单位数量”和“单价”。

单击“配置Select语句”对话框中的“WHERE”按钮,在如图9-35所示的对话框中设置条件列为“类别ID”,运算符为“=”,源为Control(控件),控件ID为GridView1,设置完毕后单击“添加”按钮。这个设置表示数据源控件Access-DataSource2返回的数据以GridView1控件中用户选择的“类别ID”数据为筛选条件,仅返回“产品”表中“类别ID”字段值等于GridView1中用户选择值的数据记录。页面初次加载,用户没有进行任何选择时,默认“类别ID”为1,即显示类别编号为“1”的子表数据。以后所有的选项均取默认值即可。

978-7-111-58440-7-Chapter09-55.jpg

图9-35 为SqlDataSource2添加WHERE子句

(3)设置GridView和DetailsView控件的属性

在GridView1控件的任务菜单中选择数据源为SqlDataSource1,选择“启用选定内容”复选框,并在自动套用格式中选择一个外观样式。

在DetailsView1控件的任务菜单中选择数据源为SqlDataSource2,选择“启用分页”,并在自动套用格式中选择一个外观样式。

(4)编写事件代码

Web页面载入时执行的事件过程代码如下。

978-7-111-58440-7-Chapter09-56.jpg

DetailsView控件除了可以用于浏览数据表中的信息外,与FormView控件相似,还具有插入、删除和编辑数据的功能。

9.3 实训——使用数据访问控件查询数据库

9.3.1 实训目的

1)通过上机操作熟练掌握GridView控件配合SqlDataSource控件操作数据库的基本方法。理解GridView控件的常用属性、事件和方法。

2)掌握在SqlDataSource控件设置中直接使用SQL语句和LIKE运算符的技巧。理解设置GridView控件外观的基本技巧。

9.3.2 实训要求

设计一个ASP.NET网站,要求使用SQL Server数据库,配合GridView控件和SqlData-Source控件实现对数据记录的多功能查询。页面载入时显示如图9-36所示的界面,其中显示有当前数据表中的所有记录,并添加有一个“总分”计算字段。用户单击标题栏中的字段名时,可按该字段进行排序。数据库结构和数据记录可根据图示自行设计。

在“关键字类型”下拉列表框中选择“学号”“姓名”或“班级”后,在“关键字”文本框内输入查询关键字,单击“查询”按钮可得到希望的查询结果。单击“显示全部”按钮可再次显示所有记录数据。要求使用“姓名”或“班级”进行查询时支持“模糊查询”方式,如图9-37所示,在输入“姓名”关键字为“王”后单击“查询”按钮,将得到姓名中包含有“王”的所有记录。

978-7-111-58440-7-Chapter09-57.jpg

图9-36 页面载入时显示全部记录

978-7-111-58440-7-Chapter09-58.jpg

图9-37 按姓名进行模糊查询

此外,要求当用户的查询返回结果集为空时,弹出信息框提示“未找到符合条件的记录!”;如果用户在没有输入查询关键字而直接单击“查询”按钮时,弹出信息框提示“查询关键字不能为空!”。

9.3.3 实训步骤

1.设计Web界面

新建一个ASP.NET空网站,向页面中添加一个用于布局的HTML表格,向页面中添加必要的说明文字,添加一个下拉列表框控件DropDownList1,一个文本框控件TextBox1,以及两个按钮控件Button1和Button2。向表格中添加一个用于显示数据库数据的GridView1和一个SqlDataSource1控件,适当调整各控件的大小及位置。

2.设置对象属性

设置DropDownList1的ID属性为dropKey,并添加“学号”“姓名”和“班级”3个供选项;设置TextBox1的ID属性为txtKey;设置Button1和Button2的ID属性分别为btnQuery和btnShowAll,Text属性分别为“查询”和“显示全部”。

向网站中添加一个SQLServer数据库students.mdf,并将其存放在App_Data文件夹中。向数据库中添加一个grade表,并向表中输入一些数据记录。表结构可根据需要自行设置。

配置SqlDataSource1时,在“配置Select语句”对话框中选择“指定自定义SQL语句或存储过程”选项,并输入如下所示的Select语句。

SELECT id,name,sex,class,math,chs,en,math+chs+en AS总分FROM grade

通过GridView1控件的任务菜单,配置其数据源为SqlDataSource1,设置其AllowSorting属性为True(允许排序)。

3.编写代码

1)在Default.aspx的源视图中添加对超链接样式设置的CSS代码(超链接文字使用蓝色显示,鼠标指向时使用红色显示,不带下画线)。

978-7-111-58440-7-Chapter09-59.jpg

2)在Default.aspx的源视图中修改GridView1的代码如下。

978-7-111-58440-7-Chapter09-60.jpg

978-7-111-58440-7-Chapter09-61.jpg

3)为了使用DataView对象统计符合条件的记录数,需要在网站中引用System.Data命名空间。切换到Default.aspx的代码编辑窗口,在命名空间的引用区中添加以下代码。

using System.Data;

4)在Default.aspx代码编辑窗口中编写事件处理代码如下。

页面载入时执行的事件处理代码如下。

978-7-111-58440-7-Chapter09-62.jpg

“显示全部”按钮被单击执行的事件处理代码如下。

978-7-111-58440-7-Chapter09-63.jpg

教程类别