在关系数据库中有型和值两种类型结构。关系模式是型,关系是值,关系模式是对关系的描述。
描述一个关系需要从以下两个方面来定义:第一方面,关系实质上是一个二维表,表的每一行为一个元组,每一列为一个属性。一个元组就是该关系所涉及的属性集的笛卡儿积的一个元素。关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映象关系。
第二方面,一个关系通常是由赋予它的元组语义来确定的。元组语义实质上是一个n目谓词(n是属性集中属性的个数)。凡使该n目谓词为真的笛卡儿积中的元素(或者说凡符合元组语义的那部分元素)的全体就构成了该关系模式的关系。
1.3.1关系数据库基本概念关系数据中,关系模式涉及众多概念、术语,初学者对这方面不容易把握与理解,以下用通俗易懂的语言来对这些概念及术语作简单的介绍。
1.关系关系(Relation)是指数据库中实体的信息,也就是数据库中二维表的数据。一个关系就是一个数据库表的值,表中的内容是对应关系模式在某个时刻的值,称为一个关系。例如,关系A表示数据库有一张名字为A的数据表所记录的所有数据。关系数据库中每一个关系都具有以下六方面的性质:((1)列是同质的。即每一列中的分量为同一类型的数据,来自同一个域。
(2)不同的列可出自同一个域,称其中的每列为一个属性,不同的属性要给予不同的属性名。
(3)列的顺序无所谓。即列的次序可以任意交换。
(4)任意两个元组不能完全相同。
(5)行的顺序无所谓。即行的次序可以任意交换。
(6)分量必须取原子值。即每一个分量都必须是不可分的数据库属性。
2.模式模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图,也称逻辑模式。有以下几方面性质:((1)一个数据库只有一个模式。
(2)模式是数据在逻辑级上的视图。
(3)以某一种数据模型为基础。
定义模式时不仅要定义数据的逻辑结构,包括数据项的构成、名字、类型、取值范围等,而且要定义与数据有关的安全性、完整性要求,定义这些数据之间的联系。
3.关系模式关系模式(RelationSchema)描述的是与关系相对应的二维表的表结构,即关系中包含哪些属性,属性来自哪些域,以及与域之间的映象关系。
关系模式与关系的区别:((1)关系模式描述了关系数据结构和语义,是关系的型。而关系是一个数据集合,是关系模式的值,是关系模式的一个实例。
(2)关系实际上就是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为数据库 *** 作会不断地更新数据库中的数据。
4.元组元组(Tuple)是关系数据库中的基本概念,一个关系表中的每行就是一个元组。也就是说数据库表中的每条记录都是一个元组,表结构的每列就是一个属性,在二维表里,元组也称为记录。元组可表示一个关系或关系之间的联系。
一般情况下,一个关系数据表中的每条记录均有一个唯一的编号(记录号),这个编号也叫元组号。
5.码码(Key)是关系数据库系统中的基本概念。所谓码,就是能唯一标识实体的属性集,是整个属性集,而不是单个属性。在关系数据库中,码包括多种类型,如超码、候选码和主码。
((1)超码(SuperKey)。超码是一个或多个属性的集合,这些属性可以在一个实体集中唯一地标识一个实体。如果K是一个超码,那么K的任意超集也是超码,也就是说如果K是超码,那么所有包含K的集合也是超码。例如,学生是一个实体,则学生的集合是一个实体集,而超码用来在学生的集合中区分不同的学生。假设学生(实体)具有多个属性:学号,身份z号,姓名,性别。因为通过学号可以找到唯一一个学生,所以{学号}是一个超码,同理{学号,身份z号}、{学号,身份z号,姓名}、{学号,身份z号,姓名,性别}、{身份z号}、{身份z号,姓名}、{身份z号,姓名,性别}也是超码。在这里,因为不同的学生可能拥有相同的姓名,所以姓名不可以区别一个学生,即{姓名}不是一个超码,{性别}、{姓名,性别}也不是。
(2)候选码(CandidateKey)。候选码是可以唯一标识一个元组的最少的属性集合。候选码是从超码中选出的,因此候选码也是一个或多个属性的集合。因为超码的范围太广,很多是无用的,所以候选码是最小超码,它们的任意真子集都不能成为超码。例如,如果K是超码,那么所有包含K的集合都不能是候选码;如果K,J都不是超码,那么K和J组成的集合{K,J}有可能是候选码。
虽然超码可以唯一标识一个实体,但是可能大多数超码中含有多余的属性,所以需要候选码。
例如学生表,学生(学号,姓名,年龄,性别,专业),其中的学号是可以唯一标识一个元组,所以学号可以作为候选码。既然学号都可以作候选码,那么学号和姓名这两个属性的组合就可以唯一区别一个元组。此时的学号可以成为码,学号和姓名的组合也可以成为码,但是学号和姓名的组合不能成为候选码,因为即使去掉姓名属性,剩下的学号属性也完全可以唯一地标识一个元组。也就是说,候选码中的所有属性都是必需的,缺少任何一个属性,都不能唯一标识一个元组。
(3)主码(PrimaryKey)。主码是从多个候选码中任意选出一个作为主键,这个被选中的候选码就称为主码。如果候选码只有一个,那么候选码就是主码。虽然说主码的选择是比较随意的,但在实际开发中还是需要一定的经验,不然开发出来的系统会出现问题。一般来说,主码都应该选择那些从不或者极少变化的属性。
例如,在一个职工实体中,职工(职工号,姓名,入职时间,部门,岗位,工资,职级,工龄,电话),职工号可以用来唯一确定实体中的一个元组,所以职工号是一个候选码。如果实体属性——姓名、入职时间、部门三者组合也能唯一地确定一个元组,则(姓名,入职时间,部门)也是一个候选码。在上述两个候选码中任选一个均可作为职工实体的主码,一般来说直接选择职工号作为实体的主码是最为简单方便的。
1.3.2关系模式的定义关系是数据库二维表中的数据记录,关系模式是数据库二维表的表结构,关系是动态的,关系模式是静态的。
关系模式可由六个元素来描述,分别是R、U、D、dom、I、F。其中,R为关系的名称;
U为组成该关系的属性名的集合;D为U集合中属性的域集合;dom为属性集U向域集D的映射;I为完整约束集合;F为属性间数据的依赖关系集合。
一个关系模式通常表示为R(U,D,dom,I,F),也可以忽略其他元素,直接简化为R(U)或R(A1,A2,A3,…,An),其中A1,A2,A3,…,An为属性名。
例如,在一个选课模块中,包含“学生”“课程”“选修”等关系实体。“学生”实体的属性有SNO(学号)、SNAME(姓名)、AGE(年龄)、SEX(性别)、SDEPT(系部),其中“学号”为主键;“课程”实体的属性有CNO(课程号)、CNAME(课程名称)、CDEPT(系部)、TNAME(教师),其中“课程号”为主键;“选修”实体的属性有GRADE(成绩)、SNO(学号)、CNO(课程号),其中“学号”和“课程号”为联合主键。学生和课程之间是多对多的关联关系,即一个学生可以同时选修多门课程,一门课程也可以同时被多个学生选修。这种多对多的关联关系可以通过“选修”关系实体作为中间桥接实体,变成两个一对多的实体关联关系,如图所示。
图学生选课实体
66037833981
从图的实体关系图中可以得到选课模块的实体关系模式集——学生关系、课程关系、选修关系,具体关系模式如下:学生关系模式Student(SNO,SNAME,AGE,SEX,SDEPT);
课程关系模式Course(CNO,CNAME,CDEPT,TNAME);
选修关系模式StudentCourse(SNO,CNO,GRADE)。
对以上定义的三个关系模式实例化,插入初始化数据后,可得到学生、课程、选修三个关系的实例,如图所示。图中矩形框圈住部分为选课模块中的关系模式(表结构);椭圆框圈住部分为选课模块中的关系(数据)。整个选课模块的表环境由关系模式与关系两部分共同组成,缺一不可。关系模式的分解标准关系模式的规范化过程实际上就是关系模式的“分解”过程,即把逻辑上独立的信息放在独立的关系模式中。分解是解决数据冗余的主要方法,也是规范化的一条原则——关系模式有冗余问题就要分解。
数据库设计者在进行关系数据库设计时,应参照模式规范化理论,尽可能使数据库模式保持高的标准。一般尽量把关系数据库设计成巴斯−科德范式(BCNF)的模式集,如果设计成巴斯−科德范式(BCNF)模式集时达不到保持函数依赖的标准,那么只能降低要求,设计成第三范式(3NF)的模式集,以达到保持函数依赖和无损分解的基本要求。
学生、课程、选修三个关系的实例
66037830023
1.分解的定义一个关系模式可以分解成众多子关系模式,分解方式不同,得到的子关系模式也不同。
关系模式的分解是指把某一个关系模式按照某一种方式进行分解得到的所有子关系模式。
如关系模式R按照某一种方式分解,可以得到一个关系集ρ={R1,R2,…,Rn}。其中属性集U=U1∪U2∪…∪Un,并且不能存在Ui⊆Uj,1≤i,j≤n。
函数依赖关系集F=F1∪F2∪…∪Fn,其中F1,F2,…,Fn是F在U1,U2,…,Un上的投影。
2.分解的标准把低级的关系模式分解成高级的关系模式的方法不是唯一的,只要能够保证分解后的关系模式与原关系模式等价,就是一个完整、标准的分解方法。关系模式的标准分解方法应同时达到以下两方面的要求:((1)分解具有无损连接性。
(2)分解要保持函数依赖性。
具有无损连接性的分解保证信息不会丢失,但无损连接不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题,如要解决这些问题,则要考虑更高的关系数据范式理论原则。
各种类型数据的高等界面,后来逐渐演变成满足所有数据访问需要的完整解datamodule4.adoquery2.sql.add('SELECT借书证号,密码FROM[user]WHERE(借书证号=:tt)')datamodule4.adoquery2.parameters[0].value:=username
datamodule4.adoquery2.open
在为TQuery或TADOquery部件设置SQL属性时调用Close方法总是很安全的,如果TQuery或TADOquery部件已经被关闭了,调用Close方法时不会产生任何影响。在应用程序中为SQL属性设置新的SQL命令语句时,必须要调用Clear方法以清除SQL属性中现存的SQL命令语句,如果不调用Clear方法,便调用Add方法向SQL属性中设置SQL命令语句,那么新设置的SQL命令语句会追加在现存SQL命令语句后面,在程序运行时常常会出现出乎意料的查询结果甚至程序无法运行下去。
在这里要特别注意的,一般情况下TQuery或TADOquery部件的SQL属性只能包含一条完整的SQL语句,它不允许被设置成多条SQL语句。当然有些数据库服务器也支持在TQuery或TADOquery部件的SQL属性中设置多条SQL语句,只要数据库服务器允许这样,我们在编程时可以为SQL属性设置多条SQL语句。
在为TQuery或TADOquery部件设置完SQL属性的属性值之后,也即编写好适当的SQL程序之后,可以有多种方式来执行SQL程序。
在设计过程中,设置完TQuery或TADOquery部件的SQL属性之后将其Active属性的值置为True,这样便可以执行SQL属性中的SQL程序,如果应用中有与TQuery或TADOquery部件相连的数据浏览部件(如TDDGridTDBEdit等)那么在这些数据浏览部件中会显示SQL程序的执行结果。
在应用程序运行过程中,通过程序调用TQuery或TADOquery组件的Open方法或ExecSQL方法可以执行其SQL属性中的SQL程序。Open方法和ExecSQL方法是不一样的。Open方法只能用来执行SQL语言的查询语句(Select命令),并返回一个查询结果集,而ExecSQL方法还可以用来执行其它常用的SQL语句(如INSERT,UPDATE,DELETE等命令),例如:
Query1.Open(这样会返回一个查询结果集)
如果调用Open方法,而没有查询结果时,会出错。此时应该调用ExecSQL方法来代替Open方法。如:
Query1.ExecSQL(没有返回结果)
当然在设计应用程序时,程序设计人员是无法确定TQuery或TADOquery组件中的SQL语句是否会返回一个查询结果的。对于这种情况应当用Try…Except模块来设计程序。在Try部分调用Open方法,而在Except部分调用ExceSQL方法,这样才能保证程序的正确运行。
例如:
Try
Query1.Open
Except
Query1.ExecSQL
End
通过Tquery或TADOquery组件可以获得两种类型的数据:
u“活动”的数据
这种数据就跟通过TTable部件获得的数据一样,用户可以通过数据浏览部件来编辑修改这些数据,并且当调用Post方法或当焦点离开当前的数据浏览部件时,用户对数据的修改自动地被写回到数据库中。
u非活动的数据(只读数据)
用户通过数据浏览部件是不能修改其中的数据。在缺省情况下,通过TQuery部件获得的查询结果数据是只读数据,要想获得“活动”的数据,在应用程序中必须要设置Tquery或TADOquery组件的RequestLive属性值为True,然而并不是在任何情况下(通过设置RequestLive的属值True)都可以获得“活动”的数据的,要想获得“活动”的数据,除了将TQuery部件的RequestLive属性设置为True外,相应的SQL命令还要满足以下条件。
本地SQL语句查询情况下,要得到可更新的数据集,SQL语句的限制为:
n查询只能涉及到一个单独的表
nSQL语句中不能包含ORDERBY命令
nSQL语句中不能含聚集运算符SUM或AVG
n在Select后的字段列表中不能有计算字段
n在Select语句WHERE部分只能包含字段值与常量的比较运算,这些比较运算符是:Like,>,<,>=,<=。各比较运算之间可以有并和交运算:AND和OR
当通过SQL语句查询数据库服务器中的数据库表:
n查询只能涉及到一个单独的表
nSQL语句中不能包含ORDERBY命令
nSQL语句中不能含聚集运算符SUM或AVG运算
另外,如果是查询Sybase数据库中的表,那么被查询的表中只能有一个索引。
如果在应用程序中要求TQuery或TADOquery组件返回一个“活动”的查询结果数据集,但是SQL命令语句不满足上述约束条件时,对于本地数据库的SQL查询,BDE只能返回只读的数据集。对于数据库服务器中的SQL查询,只能返回错误的代码。当Tquery或TADOquery组件返回一个“活动”的查询结果数据集时,它的CanModIfy属性的值会被设置成True。
§3.4MSSQLServer简述
SQLServer是一个后台数据库管理系统,它功能强大 *** 作简便,日益为广大数据库用户所喜爱。越来越多的开发工具提供了与SQLServer的接口。SQLServer是一个关系数据库管理系统,它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的。于1988年推出了第一个OS/2版本,在WindowsNT推出后,Microsoft与Sybase在SQLServer的开发上就分道扬镳了,Microsoft将SQLServer移植到WindowsNT系统上,专注于开发推广SQLServer的WindowsNT版本。
SQLServer2000是Microsoft公司推出的SQLServer数据库管理系统的最新版本,该版本继承了SQLServer7.0版本的优点,同时又比它增加了许多更先进的功能、具有使用方便、可伸缩性好与相关软件集成程度高等优点。可跨越从运行MicrosoftWindows98的膝上型电脑到运行MicrosoftWindows2000的大型多处理器的服务器等多种平台使用。MSSQLServer不但可以应用于大中型数据库管理中,建立分布式关系数据库,并且也可以开发桌面数据库。事实上,SQLServer数据库处理的基本结构,采取关系型数据库模式,尽管如此,相信大家都可以轻易的发现,在SQLServer的数据库处理方式,则是使用面向对象的 *** 作方式与精神,也就是说,SQLServer的所有功能,都可以基于系统已经建立好的一些对象来达成,是相当OO(面向对象)的一个系统结构。
SQLServer企业管理器是SQLServer的主要管理工具,它提供了一个遵从MMC标准的用户界面,使用户得以:
·定义SQLServer实例组。
·将个别服务器注册到组中。
·为每个已注册的服务器配置所有SQLServer选项。
·在每个已注册的服务器中创建并管理所有SQLServer数据库、对象、登录、用户和权限。
·在每个已注册的服务器上定义并执行所有SQLServer管理任务。
·通过唤醒调用SQL查询分析器,交互地设计并测试SQL语句、批处理和脚本。
·唤醒调用为SQLServer定义的各种向导。
·
第三章图书管理系统设计分析
§4.1应用需求分析
图书管理系统需要满足来自三方面的需求,这三个方面分别是图书借阅者、图书馆工作人员和图书馆管理人员。图书借阅者的需求是查询图书馆所存的图书、个人借阅情况及个人信息的修改;图书馆工作人员对图书借阅者的借阅及还书要求进行 *** 作,同时形成借书或还书报表给借阅者查看确认;图书馆管理人员的功能最为复杂,包括对工作人员、图书借阅者、图书进行管理和维护,及系统状态的查看、维护并生成催还图书报表。
图书借阅者可直接查看图书馆图书情况,如果图书借阅者根据本人借书证号和密码登录系统,还可以进行本人借书情况的查询和维护部分个人信息。一般情况下,图书借阅者只应该查询和维护本人的借书情况和个人信息,若查询和维护其他借阅者的借书情况和个人信息,就要知道其他图书借阅者的借书证号和密码。这些是很难得到的,特别是密码,所以不但满足了图书借阅者的要求,还保护了图书借阅者的个人隐私。
图书馆工作人员有修改图书借阅者借书和还书记录的权限,所以需对工作人员登陆本模块进行更多的考虑。在此模块中,图书馆工作人员可以为图书借阅者加入借书记录或是还书记录,并打印生成相应的报表给用户查看和确认。
图书馆管理人员功能的信息量大,数据安全性和保密性要求最高。本功能实现对图书信息、借阅者信息、总体借阅情况信息的管理和统计、工作人员和管理人员信息查看及维护。图书馆管理员可以浏览、查询、添加、删除、修改、统计图书的基本信息;浏览、查询、统计、添加、删除和修改图书借阅者的基本信息,浏览、查询、统计图书馆的借阅信息,但不能添加、删除和修改借阅信息,这部分功能应该由图书馆工作人员执行,但是,删除某条图书借阅者基本信息记录时,应实现对该图书借阅者借阅记录的级联删除。并且还应具有生成催还图书报表,并打印输出的功能。
在本系统中由于没有打印机设备供试验,所以预先把报表打印改成报表预览。
设计不同用户的 *** 作权限和登陆方法
对所有用户开放的图书查询
借阅者维护借阅者个人部分信息
借阅者查看个人借阅情况信息
维护借阅者个人密码
根据借阅情况对数据库进行 *** 作并生成报表
根据还书情况对数据库进行 *** 作并生成报表
查询及统计各种信息
维护图书信息
维护工作人员和管理员信息
维护借阅者信息
处理信息的完整性
对借阅过期的图书生成报表
图4-2图书管理系统数据库应用需求的总结
根据以上所做的需求分析,并略掉一些细节(如不考虑用户的登录;对记录的维护),得出以下的三层数据流图。
§4.2系统功能模块划分
系统功能框图如图4-10所示。
§4.3系统数据库设计
4.3.1概念设计
在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。然后再把概念模式转换成逻辑模式。将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。
利用ER方法进行数据库的概念设计,可分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局模式,最后对全局ER模式进行优化,得到最终的模式,即概念模式。
(1)设计局部ER模式
实体和属性的定义:
图书(图书编号,图书名称,作者,出版社,出版日期,备注,价格,数量,)
借阅者(借书证号,姓名,性别,身份z,联系电话,密码)
身份(身份编号,身份描述,最大借阅数)
图书类别(图书类别编号,类别描述)
ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。联系定义如图4-5所示。解释如下:
u一个借阅者(用户)只能具有一种身份,而一种身份可被多个借阅者所具有;
u一本图书只能属于一种图书类别(类别),而一种图书类别可以包含多本图书;
u一个用户可以借阅多本不同的书,而一本书也可以被多个不同的用户所借阅。
(2)设计全局ER模式
所有局部ER模式都设计好了后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部ER模式,而且必须合理地表示一个完整、一致的数据库概念结构。
1)确定公共实体类型
为了给多个局部ER模式的合并提供开始合并的基础,首先要确定各局部结构中的公共实体类型。在这一步中我们仅根据实体类型名和键来认定公共实体类型。一般把同名实体类型作为公共实体类型的一类候选,把具有相同键的实体类型作为公共实体类型的另一类候眩
2)局部ER模式的合并
合并的原则是:首先进行两两合并;先和合并那些现实世界中有联系的局部结构;合并从公共实体类型开始,最后再加入独立的局部结构。
3)消除冲突
冲突分为三类:属性冲突、结构冲突、命名冲突。
设计全局ER模式的目的不在于把若干局部ER模式形式上合并为一个ER模式,而在于消除冲突,使之成为能够被所有用户共同理解和接受的同一的概念模型。
3)全局ER模式的优化
在得到全局ER模式后,为了提高数据库系统的效率,还应进一步依据处理需求对ER模式进行优化。一个好的全局ER模式,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体类型的个数要尽可能的少;实体类型所含属性个数尽可能少;实体类型间联系无冗余。
综上所述,“图书管理系统”的全局ER模式如图4-13所示。
4.3.2关系数据库的逻辑设计
由于概念设计的结果是ER图,DBMS一般采用关系型(本人所使用的MSSQLServer就是关系型的DBMS),因此数据库的逻辑设计过程就是把ER图转化为关系模式的过程。由于关系模型所具有的优点,逻辑设计可以充分运用关系数据库规范化理论,使设计过程形式化地进行。设计结果是一组关系模式的定义。
(1)导出初始关系模式
book(图书编号#,图书名称,图书类别#,作者,出版社,出版日期,备注,价格,数量)class(图书类别#,类别名)user(借书证号#,姓名,性别,身份编号#,身份z,联系电话,密码)ID(身份编号#,身份描述,最大借阅数)Owner(借书证号#,图书编号#,借书日期)
图4-14关系模式集
(2)产生子模式
子模式是用户所用到的那部分数据的描述。除了指出用户用到的数据外,还应指出数据与概念模式中相应数据的联系,即指出概念模式与子模式之间的对应性。
借书子模式(借书证号#,姓名,图书编号#,图书名称,借书日期)
图4-15部分子模式
(3)根据设计中出现的问题本人在写系统时还加入了两个关系模式:
1、ownertemp:用于工作人员在处理借书、还书工作时临时存储借书、还书信息,以便打印报表时使用。
2、keyer:用于存储工作人员和图书馆管理员的用户名和密码及权限,以便工作人员或图书馆管理员进入相应的功能模块时进行验证用户的身份。
4.3.3数据库的实现
我选用MicrosoftSQLServer2000(企业版)数据库来进行数据库的逻辑设计。首先创建七个基本数据库表如表4-1-4-7所示,然后根据全局ER图,建立各个表之间的联系,如图4-8所示。
表4-1借阅者基本信息表的结构(User)
表4-2图书信息表的结构(Book)
表4-3图书类别信息表的结构(Class)
表4-4借阅者身份信息表的结构(ID)
表4-5借阅情况信息表的结构(Owner)
表4-6借阅情况临时存储信息表的结构(Ownertemp)
注:在owner表和ownertemp表中加入了索引字段,用来唯一标识一条借书记录,并且设置为标识,标识种子为1。
表4-7工作人员和管理员信息表的结构(Keyer)
图4-8数据库表间联系图
第五章图书管理系统应用程序设计
§5.1系统窗体模块组成
§5.2数据模块窗体的设置
在编写数据库应用程序时,经常要遇到这样的情况,即好多组件、窗体同时访问相同的数据源,如果为每一个组件或者窗体都设置一个数据源将是十分耗时的工件,而且要保证这些数据源的确是相同的也需花一番功夫。那么,能不能将这些数据源集中管理,最好是做成一个统一的模块,需要时就将该模块引入而不必直接 *** 作数据源本身呢?数据模块(DataModule)是解决这个问题最好的答案。简单说来,数据模块是用来集中管理数据源的一个窗体,该窗体可被需要的地方随时引入。
但本人在开发这个系统时,开始使用了一下数据模块,但在使用过程中却碰到了一些问题。并且考虑这个系统使用到的TADOQuery控件比较多,如果使用数据控件可能会带来管理上的麻烦,如弄混各个数据控件的作用。还考虑到使用动态生成ADOQuery可能会更节省资源。所以在本人的系统中,开始做的第一个模块“借阅者个人模块”中还稍微使用了一下数据模块。但在后面做的两个模块中大多都是用动态生成ADOQuery来实现的。并且由于SQL语句是动态加入的所以datamodule中的控件也不会多。
§5.3启动画面的实现
启动画面是为了给用户一个良好的印像,加深软件的亲和力,没有实际的功能,在Form1窗体中加入了Image和Time组件。启动画面的窗体略,主要的源代码如下:
§5.4用户登录窗体的的实现
本窗体是为三种不同的用户(一般用户,工作人员,管理员)提供选择以进入不同的模块,满足不同用户的需求。源代码比较简单,略。
§5.5用户密码认证窗体的的实现
本窗体是为了让工作人员或图书馆管理员按照用户名和密码进行登录,并且跟据用户名检查Keyer表中的“权限”字段,以分辩进入图书馆管理人员模块还是进入工作人员模块。窗体界面、源代码如下
§5.6借阅者服务模块的实现
借阅者服务窗体的功能主要是图书的查询,个人借阅情况查看及个人部分信息的修改。界面图如下:
5.6.1图书查询功能的实现
在本系统中,任何人都有权限使用查询功能,不做任何限制。界面如下,
由于实现的查询功能有多种,如按图书编号、图书名称等字段进行完全体配查找和部分体配的模糊查找,还有按多个条件进行逻辑与或是逻辑或的多条件查找。其中实现的方法者差不多,所以只给出多条件查找的代码,如下:
5.6.2借阅者登录功能的实现
这个功能的实现与工作人员和管理人员登录功能实现的方法大致一样,并且还要简单。是从User表中查到到借阅证号与密码,看与用户输入的是否一致。如果一致,那么用户就可查看自已的借阅情况并维护自己的部分信息。源代码与借阅者登录界面都略。
5.6.3借阅者借阅情况功能的实现
当借阅者正确登录到系统后,此功能将被激活,使用户能查看到自身的借阅情况。在此系统中,信息的显示一般用ListView来实现,只在较少的情况下用到了DBgrid,因为我觉得ListView更好实现,并能使信息数据对用户的完全分离。
在这里跟据借阅者的不同要求实现借阅情况的查询,有检查所有的借阅情部、某本书的借阅情况、和根据已借阅天数的来查询。其中根椐借阅天数来查询更有代表性,有方式一和方式二。以下给出此功能的源代码
按借阅天数查询方式一
按借阅天数查询方式二
5.6.4借阅者个人资料维护功能的实现
此功能实现当前借阅者部份资料的修改,但借书证号和身份类别这样的信息不允许修改,这是图书馆管理员模块的功能。在此界面中点击修改按钮将出现“修改”窗体(Form8),点击修改密码按钮将出现groupbox8,在这里进行密码修改。关键源代码如下。
这里给出个人部分信息修改的源代码:
这里给出密码修改的源代码:
5.7工作人员-图书借阅/归还模块的实现
5.7.1工作人员进行图书借阅功能实现
在这个功能中,工作人员输入借阅者的借阅证号和所要借阅的图书的图书编号,然后点击借阅按钮就可进行图书借阅。考虑到实际中可能会出现只知图书名而不知图书编号的情况,在此界面下方加入了一个转换功能,可以把图书名称转换成图书编号,再进行图书借阅。
在借阅完成后会生借阅报表以便借阅者检查和确认,借阅报表的打印效果如下图,实现比较简单,略去实现过程。
5.7.2工作人员进行图书归还功能实现
在此功能中,工作人员根据借阅者的借书证号和归还的图书编号进行图书的归还工作。并且根据现实中可能会出现的只知图书名不知图书编号的归还情况,所以加入了按书籍名称进行归还的功能。这个功能是图书借阅功能中把图书名称转换成图书编号的一种改进方法,这样就不用如借阅功能中一样要先转换再借阅了。归还完成后,同样会打印出归还报表以便用户检查和确认。
5.8图书馆管理员模块的实现
5.8.1图书馆管理员图书管理功能的实现
在这个功能中可以在(*图书编号)中输入图书编号,点查找按钮后就会在各个相应的组件中显示出信息,或按图书名称模糊查找到所要的记录,在各个相应的组件中显示第一条记录的信息,也可在下端的ListView组件中点击某一条记录,在各个相应的组件中也会显示所选记录的信息。在入库功能中只要不是相同的图书编号并且带*号提示的字段不为空就可插入新的图书记录。删除则删除那些Book表中的图书记录,如果借出还可依用户要求连带删除owner表中的记录。因为图书修改与图书入库的功能与工作人员记录修改和工作人员记录添加的实现过程一样,所以下面仅给出删除功能的源代码,如下
5.8.2图书馆管理员工作人员和管理员管理功能的实现
在此功能中可以加入工作人员或是管理员,或是修改他们的密码、权限。
在此功能中如果选中ListView中的记录,则在右边相应的组件中显示出信息,并且管理员还可对这些记录进行修改或加入新的记录。并且也可以点删除按钮删除选中的一条或多条记录。删除功能与图书记录的删除一般,所以下面只给出添加与修改的实现过程。
5.8.3图书馆管理员修改图书类别及统记功能的实现
在此窗体中能对图书的类别进行删除,添加和修改,这模块的功能的实现过程与图书记录的删除,添加和修改一样的,但是这个窗体还能跟据图书类别进行统计,还可根据Book表和owner表统计出图书总数目,库存图书数目,借出图书数目及借阅过期的图书数目。在这里给出统计图书总数目,库存图书数目,借出图书数目及借阅过期的图书数目的实现过程中的几个函数和过程
5.8.4图书馆管理员借阅者管理功能的实现
查询借阅者可根据借阅者的借书证号或姓名或身份编号查找到借阅者的信息,也可以实行模糊查找,这个功能的实现与前面图书查找的实现过程一般,就不再详细说明。
5.8.5图书馆维护借阅者管理功能的实现
此功能能对借阅者信息进行查看添加、删除、修改。在这里给出刷新按钮的实现过程
5.8.6图书馆身份维护功能的实现
这一部分是对借阅者身份进行管理,能对身份进行添加、删除、修改。并且同样的在listview中选中某条或多条记录时会在相应的右边的组件中显示出信息。此功能实现过程与前面所叙有雷同,略。
5.8.7图书馆借阅者统计功能的实现
此功能按借阅者身份进行统计,得出具有某种身份的借阅者总数,此种身份的并借阅图书的借阅者数和所借阅的图书数,在下面给出实现过程。
5.8.8图书馆统计借阅过期记录功能的实现
打印出的借阅过期催还报表如下图所示:
此报表能显示按借书证号升序排列的借阅信息超过限定时限的信息,其中主要的SQL语句如下:
5.9系统信息显示的实现
显过本系统的信息,并且右边的字向上滚动显示,主要实现如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)