第十章数据库应用系统设计与实现.ppt
《第十章数据库应用系统设计与实现.ppt》由会员分享,可在线阅读,更多相关《第十章数据库应用系统设计与实现.ppt(87页珍藏版)》请在冰点文库上搜索。
1,“实践出真知”,本章通过一个具体的实例来说明数据库应用系统的设计和实现过程,以使读者对数据库及其应用开发有一个真切的理解。
第十章数据库应用系统的设计与实现,1,2,10.1应用背景与需求说明首先来看看现在的目标:
在单机上实现一个教学管理系统的例子,并且可以很容易地把它移植到C/S结构中。
用Windows98操作系统,VC6.0作为数据库的前端开发环境。
为了简单起见,这里只涉及教学管理系统中的对学生、课程和教师的管理部分,此系统要求能够记录学生的修课情况、教师的授课情况以及课程情况。
具体要求为:
一门课程可由多名教师来讲授。
一个教师可讲授多门课程。
一个学生可以选修多门课程,2,3,需产生的报表有:
每学期开学时要生成学生修课情况表,内容包括学号、姓名、课程名、修课类别,其中修课类别分为必修、选修、重修。
学期结束时要生成学生修课成绩表,内容包括学号、姓名、课程名、修课类别、平时成绩、卷面成绩、总评成绩。
生成教师授课表,内容包括教师号、教师名、课程名、授课类别、学时数、班数,授课类别分为主讲、辅导、带实验。
3,4,10.2数据库设计,数据库系统的设计与程序的设计有类似之处,都是首先对需求进行研究和分析。
不同的是,数据库着重于数据对象的属性和数据对象之间的关系的分析。
一般采用ER模型方法来分析数据对象的属性和数据对象之间的关系。
4,5,10.2.1概念设计此系统所包含的实体有:
课程。
元素为由一个主讲教师负责且教学内容相同的教学活动单位,用课程号来标识此实体。
学生。
元素为一个学生,由学号来标识。
教师。
元素为一个教师,由教师号来标识。
其初步E-R图如图所示:
5,6,需要说明的是,由于实体的属性可能比较多,在画E-R图时不一定要把所有实体的属性都画在E-R图上,可以另外用文字说明,这样也使得所画的E-R图简明清晰,便于分析。
经过初步分析,得到课程管理系统中的各实体所包含的基本属性为:
课程(课程号,课程名,讲授学期,学时数)学生(学号,姓名,系,专业,班)教师(教师号,教师名,系,教研室),6,7,一个较为完整的E-R图如图所示:
7,8,10.2.2设计关系模式有了基本E-R图,就可以设计基本的关系模式了。
设计基本关系模式主要就是从E-R图出发,将其直接转换为关系模式。
转换规则为:
1将每个实体都转换为一个关系模式。
实体的属性就是关系的属性,实体的主键就是关系的主键。
2对于联系分情况来处理,主要有三种情况:
若联系是一对一的,则联系不作为一个独立的关系,只需在将一个实体的主键放置在另一个实体所对应的关系中作为外键即可。
若联系是一对多或多对一的,则联系不作为一个独立的关系,只需将一端实体的主键放置在多端实体对应的关系中作为外键即可。
若联系是多对多的,则此联系作为一个独立的关系存在,且将各个实体的主键放置在此关系中作为外键。
8,9,这个例子的E-R图转换的关系模式为:
课程(课程号,课程名,讲授学期,学时数),主键为课程号。
学生(学号,姓名,系,专业,班),主键为学号。
教师(教师号,教师名,系,教研室),主键为教师号。
修课(学号,课程号,修课类别,平时成绩,卷面成绩,总评成绩),主键为(学号,课程号),“学号”为引用学生表的外键,“课程号”为引用课程表的外键。
授课(课程号,教师号,授课类别,班数),主键为(课程号,教师号),“教师号”为引用教师表的外键,“课程号”为引用课程表的外键。
9,10,最后确定表中各属性的详细信息,包括数据类型和长度等。
课程表课程号:
字符串型,10字节,主键课程名:
字符串型,20字节,非空讲授学期:
字符串型,2字节,非空学时数:
整型,非空学生表学号:
字符串型,10字节,主键姓名:
字符串型,20字节,非空系:
字符串型,20字节,非空专业:
字符串型,20字节,非空班:
字符串型,10字节,非空教师表教师号:
字符串型,10字节,主键教师名:
字符串型,20字节,非空系:
字符串型,20字节教研室:
字符串型,10字节,10,11,修课表学号:
字符串型,10字节,主键,引用学生表的学号的外键课程号:
字符串型,10字节,主键,引用课程表的课程号的外键修课类别:
字符串型,4字节,非空平时成绩:
浮点型,大于等于0,小于等于100卷面成绩:
浮点型,大于等于0,小于等于100总评成绩:
浮点型,大于等于0,小于等于100授课表课程号:
字符串型,10字节,主键,引用课程表的课程号的外键教师号:
字符串型,10字节,主键,引用教师表的教师号的外键授课类别:
字符串型,10字节班数:
浮点型,大于0(假设选修课有半个班的情况,因此取浮点型)有了数据库的基本表之后,需要看一下这些基本表能否满足产生报表的需求。
11,12,此教学管理系统要产生三张报表:
学生修课情况表、学生修课成绩表和教师授课表。
先看一下学生修课情况表,学生修课情况表包含的内容为:
学生修课情况表(学号,姓名,课程名,修课类别)其中的“学号”、“姓名”可由学生表得到,“课程名”和“修课类别”可由修课表得到,因此可以满足学生修课情况表内容的要求。
这可以通过定义视图实现,也可以在生成报表时通过查询语句实现。
同样,“修课成绩表”的内容也可从学生表和修课表得到,教师授课表的内容可从课程表、教师表和授课表得到。
由此,可知道所设计的数据库表能够满足报表的要求。
12,13,10.2.3确定数据库应用的功能数据删除数据的删除要根据一定的条件进行,比如当某个学生退学时,则在“学生表”中做删除时的条件是删除学号等于退学学生的学号。
要避免进行无条件删除,因为那样会把数据表中的所有记录都删掉了。
数据修改当某些数据发生变化或某些数据录入不正确时,应该允许用户对数据库中的数据进行修改。
修改数据的操作一般是先根据一定条件查询出要修改的记录,然后再对其中的某些记录进行修改,修改完后再写回到数据库中去。
同删除一样,也不应该允许所有的人都具有修改数据的权力。
13,14,据查询在数据库应用系统中,数据查询是最常用的功能。
数据查询应根据用户提出的查询条件进行,在设计系统时应首先征求用户的查询需求,然后根据这些查询需求整理出系统应具有的查询功能。
一般允许所有使用数据库的人都具有数据查询权力。
生成报表生成报表是数据库应用中不可缺少的一个功能,也是比较麻烦的工作。
令人高兴的是,常见的许多数据库开发工具,如VB、Delphi,PowerBuilder等,都提供了报表生成工具,可以直接使用这些工具来生成符合用户要求的报表。
14,15,本章的例子中需要生成三张报表:
学生修课表、学生修课成绩表、教师授课表。
这三张报表所包含的内容分别为:
学生修课表(学号,姓名,课程名,修课类别)学生成绩表(学号,姓名,课程名,修课类别,平时成绩,卷面成绩,总评成绩)教师授课表(教师号,教师名,课程名,授课类别,学时数,班数)可以看到,这三张表的内容不能与某个关系模式完全对应,为此,可以采用定义视图的方法来解决。
创建这些报表的视图的SQL语句为:
CREATEVIEW学生修课表(学号,姓名,课程名,修课类别)ASSELECT学生.学号,学生.姓名,课程.课程名,修课.修课类别FROM学生JOIN修课ON学生.学号=修课.学号JOIN课程ON课程.课程号=修课.课程号对“学生成绩表”和“教师授课表”的处理与此类似。
15,16,创建的方法有很多种,例如,许多商用数据库都提供了图形化界面和命令行的方式用于创建和管理数据库;一些第三方的可视化数据管理器也可以用于数据库的创建和管理;用户也可以通过编写程序来实现数据库的创建和管理。
本章将以MicrosoftSQLServer为例讲述如何创建数据库和表,以用于教学管理系统之中。
10.3数据库的创建,16,17,10.3.1创建数据库数据库的创建需要一定的权限,默认情况下只有系统管理员和数据库拥有者才可以创建数据库,其他用户也可以被授予建立数据库的权限。
在创建数据库之前,用户需要确保拥有相应的权限。
数据库创建后,该用户即为数据库的拥有者。
在SQLServer中可以通过如下三种方式创建数据库:
在企业管理器中直接创建:
用户直接定制数据库名称、文件位置和文件属性等内容使用Transact-SQL语言创建:
编写创建数据库的代码,在查询分析器中执行。
使用向导创建:
根据系统提示逐项进行设置数据库的各个属性。
17,18,下面将讲述如何使用后两种方法创建数据库。
1使用向导创建数据库
(1)打开企业管理器,选中欲创建数据库的服务器节点,随后选择【工具】【向导】选项,或直接点击工具栏中的按钮打开向导对话框,如图10.3所示。
(2)双击“创建数据库向导”或点击【确定】按钮,出现图10.4所示对话框。
18,19,3)点击【下一步】按钮出现图所示对话框,在此对话框中可以指定将要创建的数据库的名字,以及数据库文件、数据库事务日志文件的存放位置,在这里使用的数据库名字为“JXGL”。
(4)单击【下一步】,出现如图所示对话框,在此对话框中可以修改数据库文件的名字以及该文件的初始大小,默认情况下数据库文件的名字为“数据库名_Data”,初始大小为1MB。
19,20,(4)单击【下一步】按钮,出现如图所示对话框。
其中可以指定数据库文件的增长方式,这里选择数据库文件每次增长的比例为10%,并且文件的最大尺寸不受限制,直至磁盘空间耗尽为止。
(5)单击【下一步】按钮,出现图所示对话框。
其中可以指定日至文件的名称以及该文件的初始大小,默认情况下日志文件的名字为“数据库名_Log”,初始大小为1MB。
20,21,(6)单击【下一步】按钮,出现如图10.9所示对话框。
其中可以指定日志文件的增长方式,这里选择日志文件每次增长的比例为10%,并且文件的最大尺寸不受限制,直至磁盘空间耗尽为止。
(7)点击【下一步】按钮,出现如图10.10所示对话框。
其中收集了前面步骤用户所指定的信息,确认无误后,点击【完成】按钮完成数据库的创建。
21,22,2使用Transact-SQL语言创建数据库上面创建的数据库已可以通过如下的Transact-SQL语言来编写,代码如下:
createdatabaseJXGLon(name=JXGL_Data,filename=D:
ProgramFilesMicrosoftSQLServerMSSQLDataJXGL_Data.MDF,size=1,maxsize=unlimited,filegrowth=10%)logon(name=JXGL_Log,filename=D:
ProgramFilesMicrosoftSQLServerMSSQLDataJXGL_Log.LDF,size=1mb,maxsize=unlimited,filegrowth=10%),22,23,在SQLServer的查询分析器中执行上述代码即可创建一个数据库,使用这种方式与采用向导创建的数据库属性是一致的。
数据库的创建、管理及维护是一件十分复杂的工作,值得用一本专门的著作来讲解。
在这里只是简单介绍一下相关的知识,感兴趣的读者可以阅读相关的书籍。
23,24,10.3.2创建数据库表每个数据库都由关系图、表、视图、存储过程、用户、角色、规则等等数据库对象构成,其中表是数据库中主要的对象,其中存储各种各样的信息。
本级将讲述如何通过企业管理器创建数据库表。
创建数据表
(1)设计表打开企业管理器,在左侧导航栏中选中前面刚刚建立的数据库,单击鼠标右键,在弹出的菜单中选择【新建】【表】命令,如图10.11所示。
24,25,25,26,过以上方式或直接点击工具栏中的按钮即可打开表设计器,在表设计器中可以输入列名、数据类型、长度及选择是否允许空,字段的属性可以在下面的列选项卡中设置。
各个属性的含义如下:
名称:
输入列的名称。
列名需要符合标识符的命名规则,表内唯一。
类型:
从中选一个适合于列的类型。
大小:
对于字符型的数据类型,在这里指定字符的长度。
对于固定长度的数据类型(比如Long类型),用户不能改变其大小,系统在这里自动显示Long类型的长度。
允许未空。
指定此列是否允许NULL值。
描述:
类的描述信息。
默认值:
当输入数据时,如果用户没有指定列的值,则该列设为默认值。
26,27,精度:
对于数值型列,指定其精度。
小数位数:
对于浮点数,指定其小数位数。
标识:
指定列是否为标识列,如果为标识列,当向表中添加新行时,将为该列提供唯一、递增的值。
一个表只能创建一个标识列。
标识种子:
指定标识列的初始值。
标识列递增量:
指定标识列的递增量。
是RowGuid:
指定该列是否使用全局唯一标识符,它可以保证任何数据表中都不会有完全一样的数据行。
公式:
指定计算列的列表达式,计算列是虚拟的,其值由其它列计算得到。
排序规则:
指定列的排序规则。
27,28,在表设计器中依次输入“课程号”、“课程名”、“授课学期”、“学时数”四个列,并设计其属性,如图10.12所示。
28,29,
(2)设置主键选中需要设置主键的列,单击鼠标右键,在弹出的菜单中选择【设置主键】命令或在工具栏中单击按钮即可设置主键。
使用主键可以唯一确定一条记录。
(3)建立索引建立好表的结构后就可以建立此表的索引了,建立索引可以提高查询表中记录的速度。
在表设计器中单击鼠标右键,在弹出的菜单中选择【索引/键】命令,或在工具栏中单击即可弹出管理索引/建的对话框。
单击【新建】按钮可以开始创建一个新的索引,如图10.13所示。
29,30,【选定的索引】文本框中显示系统分配给新索引的名称,用户可以自行修改。
在【列名】下可以选择索引所包含的列,对于每一列,还可以指定索引是按照升序还是降序组织索引键值。
如果希望创建唯一索引,可以选择【创建UNIQUE】复选框,如果希望创建聚集索引,需要选中【创建为CLUSTERED】复选框。
单击【关闭】按钮即完成索引的创建。
(4)保存设计当设计完成后,在工具栏中单击按钮,即弹出“选择名称”对话框,在文本框中输入表名,然后单击“确定”按钮即可保存设计,如图10.14所示。
30,31,2录入数据数据表结构建立好之后,就可以向表中输入数据了。
录入数据有很多方法,如通过编写代码录入数据,从外部数据源中导入数据等多种方式。
在企业管理器中也可以直接录入数据。
在刚刚建立的表上单击鼠标右键,在弹出的菜单中选中【打开表】【返回所有行】命令,表中存储的数据即可以表格的形式显示出来,在其中可以逐行逐列的录入数据。
录入的数据必须满足表中定义的完整性约束,否则会出现错误,如图10.15所示。
31,32,3查询数据表数据表建立好之后,如果已经在数据表中录入了数据,就可以对表中的数据进行有条件或无条件的查询。
无条件查询很简单,只要在表名上单击鼠标右键,然后从弹出的菜单中选择【打开表】【返回所有行】命令即可。
如果要进行条件查询,可以通过SQLServer的查询分析器来实现。
假设要查询学时数大于54的所有课程情况,可以先编写SQL命令:
SELECT*FROM课程WHERE学时数54在查询分析器中运行这个命令,得出的结果如图10.16所示。
32,33,使用查询分析器查询表,33,34,10.4数据库开发环境在完成设计之后,就应当确定数据库系统的开发环境和运行环境。
教学管理系统可在C/S环境下实现,也可在单机上实现。
1.4.1VC连接数据库的方法概述VisualC+中提供了多种数据库访问技术,常见的有ODBC、MFCODBC、DAO、OLEDB、ADO。
每种方式有着各自的特点,编程接口也不相同。
究竟选择哪种接口来编写程序,要视具体的应用程序对数据库的性能要求等条件而定。
1ODBCODBC(OpenDataBaseConnectivity)是微软公司提出来的一个用于访问数据库的统一接口。
基于ODBC的应用程序对数据的操作不和任何的数据库管理系统直接打交道,所有对数据库的操作是由数据库管理系统的ODBC驱动程序完成的。
ODBC建立在C/S体系结构之上,它分为四个层次:
应用程序、驱动程序管理器、驱动程序、数据源。
目前,ODBC已经成为一种标准,几乎所有的关系数据库都提供了ODBC驱动程序,这使ODBC的应用十分广泛。
34,35,1ODBCODBC(OpenDataBaseConnectivity)是微软公司提出来的一个用于访问数据库的统一接口。
基于ODBC的应用程序对数据的操作不和任何的数据库管理系统直接打交道,所有对数据库的操作是由数据库管理系统的ODBC驱动程序完成的。
ODBC建立在C/S体系结构之上,它分为四个层次:
应用程序、驱动程序管理器、驱动程序、数据源。
目前,ODBC已经成为一种标准,几乎所有的关系数据库都提供了ODBC驱动程序,这使ODBC的应用十分广泛。
由于ODBC是一种底层的访问技术,直接使用ODBCAPI连接数据库较为繁琐。
但是,应用程序使用ODBCAPI能够从底层管理和控制数据库,完成一些高层数据库访问技术不能完成的功能。
35,36,2MFCODBC直接使用ODBCAPI编写应用程序比较繁琐,在VisualC+中提供了MFCODBC类对复杂的ODBCAPI进行了封装,大大简化的数据库应用程序的开发。
MFC的ODBC类主要包含以下几个:
CDatabase类:
用于建立与数据源的连接。
CRecordset类:
代表从数据源中获取的一个记录集,通过该类可以对记录集中的记录进行滚动、修改、插入和删除等操作。
CRecordView类:
该类提供了一个表单视图来显示当前记录,该类支持记录的浏览和更新。
CFieldExchange类:
支持记录及字段数据成员与相应数据库表的字段之间的数据交换。
CDBException类:
代表ODBC类的异常。
36,37,DAODAO(DataAccessObject)使用MicrosoftJet数据库引擎访问数据库。
Jet引擎被包含在一组动态链接库(DLL)文件中,在运行时,这些文件被链接到应用程序。
它把应用程序的请求翻译成数据库的物理操作。
它真正读取、写入和修改数据库,并处理所有内部事务,如索引、锁定、安全性和引用完整性。
它还包含一个查询处理器,接收并执行SQL查询,实现所需的数据操作。
另外,它还包含一个结果处理器,用来处理查询所返回的结果。
Access、VB等具有基于MicrosoftJet数据库引擎的数据访问能力。
在访问Access数据库时,使用DAO具有良好的性能。
37,38,OLEDBOLEDB(ObjectLinkandEmbeddingDataBase)是Microsoft提出的新一代数据访问技术,它是建立在ODBC基础上的一个开发规范。
ODBC是为访问关系数据库而设计的,而OLEDB则可以访问关系型和非关系型数据源。
OLEDB定义了一组COM接口,对各种数据库管理系统服务进行封装。
OLEDB组件包括了数据提供者、数据消费者以及服务组件。
数据提供者实现了一套OLEDB核心接口;数据消费者可以是需要访问数据的任何程序;服务组件用于处理和传输数据,如查询处理器和游标引擎等。
38,39,ADOADO(ActiveXDataObject)是建立在OLEDB之上的高层数据库访问技术。
ADO控件能访问的数据,除了标准的关系数据库(如Access、SQLServer等)中的数据之外,还包括邮件数据、Web上的文本或图形、目录服务(DirectoryServices)等。
ADO是Microsoft公司长期的数据访问策略,它将逐步取代DAO和RDO而成为主要的数据访问接口。
ADO访问数据是通过OLEDB实现的,它是OLEDB的数据消费者,所以,ADO必须通过OLEDB引擎,才能访问各种数据。
在下一节将详细介绍ADO有关的内容。
39,40,10.4.2ADO对象无论是使用ADO控件还是直接使用ADOAPI编写数据库应用程序,了解ADO对象都是十分重要的,ADO中主要的对象有如下几个:
Connection对象:
代表与数据库的连接。
Recordset对象:
代表来自一个数据库表或命令执行结果的集合(结果集)。
Command对象:
代表将对数据源执行的指定命令。
Field对象:
代表ResultSet中的一列。
Parameter对象:
代表与Command相关联的参数化查询或存储过程的参数或自变量。
Error对象:
有关数据访问的错误信息。
Property对象:
ADO对象的动态特征。
40,41,10.5使用ADO数据控件访问数据库在VisualC+中使用ActiveX数据库访问控件可以使用户几乎不用编写代码就可以快速地生成数据库应用程序,VisualC+中提供的CrystalReports可用于生成报表。
有了这些工具,用户就可以创建各种应用程序,尤其对做原型开发更是有用。
当然,随着应用程序复杂性的提高,用户还是需要自己编写一些程序,但即使对于较复杂的应用程序,这些工具也为编程提供了很好的基础。
本节将通过一个具体实例,介绍在VisualC+中使用ADO数据访问控件对数据库进行操作的方法。
41,42,建立VC工程在这个例子中,通过MFC建立ADO应用程序,MFC提供了应用程序框架,创建一个图形界面应用程序十分简单。
建立工程
(1)依次点击【File】【New】命令,打开新建对话框,单击【Projects】选项卡,选择“MFCAppWizard(exe)”,输入工程名techInfo,如图10.17所示。
单击【OK】按钮进入工程创建向导。
42,43,43,44,
(2)在“MFCAppWizardStep1”对话框中,单击【Dialogbased】单选框,创建一个基于对话框的工程,如图10.18所示。
44,45,(3)在上面的对话框中直接点击【Finish】按钮,跳过向导的其它部分,使用默认值直接创建工程。
(4)在IDD_TECHINFO_DIALOG对话框中,将对话框初始提供的静态文本、OK按钮和Concel按钮删除。
下面就可以开始数据库应用程序的开发了。
45,46,10.5.2使用ADO数据控件MicrosoftADODataControl(Adodc)控件属于ActiveX控件,使用这个控件可以十分方便的实现与数据库的连接。
在使用这个控件之前,应首先将其加入到工程中。
1将Adodc控件加入到工程中在VisualC+中使用该控件的步骤如下:
(1)IDD_TECHINFO_DIALOG对话框中,单击鼠标右键,在弹出的菜单中选择【insertActiveXControl.】命令,弹出“insertActiveXControl”对话框,如图10.19所示。
46,47,
(2)在对话框中选中“MicrosoftADODataControl6.0(OLEDB)”,单击【OK】按钮,这样控件即出现在对话框中。
调节该控件的大小及位置,结果如图10.20所示。
47,48,2.设置ADO控件的属性和方法将ADO控件添加到窗体之后,就可以使用该控件来开发数据库应用程序。
ADO控件的最主要的属性是Connectionstring和RecordSource属性。
Connectionstring属性指出了ADO控件和数据库连接的连接字符串,通过这个连接字符串可以使ADO控件和OLEDBProvider支持的数据库连接;RecordSource属性指出了可以操作的数据的来源,即结果记录集,这个记录集可以是一张表,也可以是一个存储过程或SQL命令生成的结果集等。
另外,设置ADO控件的Mode属性可以控制对记录集的操作权限,如写、读、共享等。
通过使用Recordset对象的各种属性、方法和事件,就可以十分方便的操作数据库中的数据了。
48,49,ADO控件主要的属性设置方法如下:
Caption属性在Adodc控件上单击鼠标右键,在弹出的菜单中选中【Properties】命令,出现ADO属性对话框。
在其中选择【General】标签,将其中ID的值更名为IDC_ADODC,Caption的值设置为“ADO控件,点击滚动结果集”。
如图10.21所示。
49,50,
(2)Connectionstring属性使用ADO控件访问