在线考试系统

目 录
摘 要 3
Summary 4
前言 5

第一章 系统设计相关原理 7
1.1 ASP技术介绍 7
1.2 SQL语句介绍 11
1.3 VBScript介绍 15

第二章 需求分析 18
2.1 系统需要解决的主要问题 18
2.2 系统应该具备的基本功能 19

第三章 系统总体设计 20
3.1基本简介 20
3.2 运行环境与系统结构 21
3.3 系统结构图 21
3.4 详细设计 22
3.4.1试题设计 22
3.4.2数据库中表的设计 22
3.4.3 用户、管理员权限 25
3.4.4 功能模块详细设计 25

第四章 系统实现 28
4.1 系统流程图设计 28
4.2 各文件功能介绍及详解 30
4.2.1. 30
4.2.2. 30
4.2.3. 31
4.2.4. 32
4.2.5. 33
4.2.6. 34
4.2.7. 36
4.2.8. 36
4.2.9. 36
4.2.10. 36
4.2.11. 36
4.2.12. 36
4.3调试过程中遇到的主要问题和解决办法 37
4.4 系统测试及实现后主要界面 47

结论 48

结束语 49

参考文献 50

前 言
随着技术的飞速发展,现在很多国外的大学和社会其他部门都已经开设了教学,通过计算机实现异地教育和培训。现在,计算机硬件技术的发展已经达到了相当高的水平。但是,教学软件的开发目前还处于起步阶段,随着这项技术的不断深入发展,就要求有更好、更完善的软件系统应用到教学当中去,这就给软件设计人员提出了更高的设计要求。
教学包括很多环节,例如教学系统、答疑系统和考试系统等等。其中很重要的一个环节就是在线考试系统,同时它也是最难实现的环节。在我国,虽然教学已经蓬勃地发展起来,但是目前学校与社会上的各种考试大都采用传统的考试方式,在此方式下,组织一次考试至少要经过五个步骤,即人工出题、考生考试、人工阅卷、成绩评估和试卷分析。显然,随着考试类型的不断增加及考试要求的不断提高,教师的工作量将会越来越大,并且其工作将是一件十分烦琐和非常容易出错的事情,可以说传统的考试方式已经不能适应现代考试的需要。随着计算机应用的迅猛发展,应用不断扩大,如教学和虚拟大学的出现等等,且这些应用正逐步深入到千家万户。人们迫切要求利用这些技术来进行在线考试,以减轻教师的工作负担及提高工作效率,与此同时也提高了考试的质量,从而使考试更趋于公证、客观,更加激发学生的学习兴趣。例如目前许多国际著名的计算机公司所举办的各种认证考试绝大部分采用这种方式。
在线考试是现阶段研究开发的一个热点。它是建立在国际互联网上的应用系统,客户端的配置可以极为简单,使考试不受地域的局限。一个完备的在线考试系统可以使用户在网上学习过后及时检验自己的学习效果,已发现自己的不足,使得学习效率得到很大提高。在线考试系统中题目的生成、试卷的提交、成绩的批阅等都可以在上自动完成。只要形成一套成熟的题库就可以实现考试的自动化。这样一来,教师所要做的只是精心设计题目、维护题库,而不是组织考试,从而大大减轻了教师的负担,这表明其经济性是相当可观的。为了适应新形势的发展,我进行了这一系统的初步设计工作,也可以说是做一个初步的探索,希望它能够在各类考试中发挥高效、便捷的作用,把老师从繁重的工作中解脱出来!
目前,应用软件运行的模式主要有二类:Client/server模式,Browser/Web模式。前者主要的缺点是维护、升级较麻烦,后者是近几年伴随Internet迅速发展起来的一种技术,它与客户/服务器方式类似,客户端是一个标准的浏览器,服务器端是Web Server ,而Web Server与数据库和应用服务器的紧密结合,使得这种模式的应用范围不断扩大,它已不仅仅用于网上查询,有很多部门的业务系统、企业的MIS系统纷纷采用这种模式,它的主要优点是便于扩充应用、升级维护简便。
另外,考试系统的软件也必将不断的更新;同时软件产品本身就要经过一个不断自我完善的过程。
基于上述考虑,用Browser/Web模式来设计考试系统比较合适,服务器端我们采用Access数据库系统和ASP组件来构成考试的应用服务系统;客户端采用浏览器来完成考试全过程,同时可进行远程系统维护和管理。
利用和数据库技术,结合目前硬件价格普遍下跌与宽带网大力建设的有利优势,应用Active Server Page技术,我开发了基于B/S模式多用户在线考试系统这一程序。它运用方便、操作简单,效率很高(同时,它要求计算机配置也很高,尤其是服务器端)。现阶段虽只实现了试卷的客观题部分,但已具有用户注册、多用户同时在线考试、动态随机出题、时间控制、自动判卷,试题录入、修改题库、用户管理、科目管理、管理员管理、分数管理等重要功能,也就是说实现了真正的无纸化考试,满足任何授权的考生随时随地考试并迅速获得成绩,同时也大大减轻了教师出题、出题和判卷等繁重的工作量。

第一章 系统设计相关原理
该在线考试系统主要采用ASP、HTML、Access数据库、VBScript、SQL等技术和工具,整体设计遵循软件工程的方法,经过需求分析、总体设计、文档和代码的编制、模块测试和系统实现几个阶段。下面就对这几种技术和方法做一个概述。
1.1 ASP技术介绍
Microsoft Active Server Pages 即我们所称的ASP,其实是一套微软开发的服务器端脚本环境。Active Server Page 是创建动态网页的一个很好的工具,它起一种编程语言的作用,可以利用它编写动态产生HTML的程序代码。因此,只要用户浏览Web站点并请求一个ASP页,Web服务器就可以处理相应的ASP代码,生成HTML代码,然后将它传递到用户浏览器并显示出网页。ASP内含于IIS3.0和4.0之中,通过ASP我们可以结合HTML网页、ASP指令和ActiveX元件建立动态、交互且高效的WEB服务器应用程序。有了ASP就不必担心客户的浏览器是否能运行所编写的代码,因为所有的程序都将在服务器端执行,包括所有嵌在普通HTML中的脚本程序。当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。以下罗列了ASP所独具的一些特点:
1.使用VBScript 、JScript等简单易懂的脚本语言,结合HTML代码,即可快速地完成网站的应用程序。
2.无须编译,容易编写,可在服务器端直接执行。
3.使用普通的文本编辑器,如Windows的记事本,即可进行编辑设计。
4.与浏览器无关,用户端只要使用可执行HTML码的浏览器,即可浏览ASP所设计的网页内容。ASP所使用的脚本语言(VBScript 、Jscript)均在WEB服务器端执行,用户端的浏览器不需要能够执行这些脚本语言。
5.ASP能与任何ActiveX scripting语言相容。除了可使用VBScript或JScript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其他脚本语言,譬如REXX、Perl、Tcl等。脚本引擎是处理脚本程序的COM(Component Object Model)物件。
6.ASP的源程序,不会被传到客户浏览器,因而可以避免所写的源程序被他人剽窃,也提高了程序的安全性。
7.可使用服务器端的脚本来产生客户端的脚本。
8.物件导向(Object-oriented)。
9.ActiveX Server Components(ActiveX服务器元件)具有无限可扩充性。可以使用Visual Basic 、Java 、Visual C++ 、COBOL等编程语言来编写你所需要的ActiveX Server Component。
10.另外,ASP技术的处理速度相当快,并且其安全性也很高。ASP最重要的优点是能够建立对诸如时间、地点、用户标志、以前的选择和活动等因素敏感的页面。换句话说,可针对每个用户的个别需求,用ASP定制网页,能够满足用户的各种需求。
总之,ASP包含三方面含义:
1.Active:ASP使用了微软的ActiveX技术。ActiveX(COM)技术是现在Microsoft软件的重要基础。它采用封装对象,程序调用对象的技术,简化编程,加强程序间合作。ASP本身封装了一些基本组件和常用组件,有很多公司也开发了很多实用组件。只要你可以在服务器上安装这些组件,通过访问组件,你就可以快速、简易地建立自己的WEB应用。
2.Server:ASP运行在服务器端。这样就不必担心浏览器是否支持ASP所使用的编程语言。ASP的编程语言可以是VBSCRIPT和JSCRIPT。VBSCRIPT是VB的一个简集,会VB的人可以很方便的快速上手。然而Netscape浏览器不支持客户端的VBSCRIPT,所以最好不要在客户端使用VBSCRIPT。而在服务器端,则无需考虑浏览器的支持问题。Netscape浏览器也可以正常显示ASP页面。
3.Pages:ASP返回标准的HTML页面,可以正常地在常用的浏览器中显示。浏览者查看页面源文件时,看到的是ASP生成的HTML代码,而不是ASP程序代码。这样就可以防止别人抄袭程序。
由此可以看出,ASP是在IIS下开发WEB应用的一种简单、方便的编程工具。在了解了VBSCRIPT的基本语法后,只需要清楚各个组件的用途、属性、方法,就可以轻松编写出自己的ASP系统。
运行 ASP 所需的环境如下:
☆Microsoft Internet Information Server version 3.0/4.0 on Windows NT Server
☆Microsoft Peer Web Services Version 3.0 on Windows NT Workstation
☆Microsoft Personal Web Server on Windows 95/98
与一般的程序不同,ASP程序无须编译。ASP程序的控制部份,是使用VBScript、JScript等脚本语言来设计的,当执行ASP程序时,脚本程序将一整套命令发送给脚本解释器(即脚本引擎),由脚本解释器进行翻译并将其转换成服务器所能执行的命令。当然,同其他编程语言一样,ASP程序的编写也遵循一定的规则,如果你想使用你所喜爱的脚本语言编写ASP程序,那么你的服务器上必须要有能解释这种脚本语言的脚本解释器。当你安装ASP时,系统提供了两种脚本语言:VBSrcipt和JScript,而VBScript则被作为系统默认的脚本语言。
ASP程序其实是以扩展名为.asp的纯文本形式存在于WEB服务器上的,可以用任何文本编辑器打开它,ASP程序中可以包含纯文本、HTML标记以及脚本命令。只需将.asp程序放在Web服务器的虚拟目录下(该目录必须要有可执行权限),就可以通过WWW的方式访问ASP程序了。要学好ASP程序的设计,必须掌握脚本的编写,那么究竟什么是脚本呢?其实脚本是由一系列的脚本命令所组成的,如同一般的程序,脚本可以将一个值赋给一个变量,可以命令Web服务器发送一个值到客户浏览器,还可以将一系列命令定义成一个过程。要编写脚本,你必须要熟悉至少一门脚本语言,如VBScript。脚本语言是一种介于HTML和诸如JAVA、Visual Basic、C++等编程语言之间的一种特殊的语言,尽管它更接近后者,但它却不具有编程语言复杂、严谨的语法和规则。如前所述ASP所提供的脚本运行环境可支持多种脚本语言,譬如:JScript、REXX、PERL等等,这无疑给ASP程序设计者提供了广泛的发挥余地。ASP的出现使得广大Web设计者不必在为客户浏览器是否支持而担心,实际上就算在同一个.asp文件中使用不同的脚本语言,都无须为此担忧,因为所有的一切都将在服务器端进行,客户浏览器得到的只是一个程序执行的结果,而你也只需在文件中声明使用不同的脚本语言即可。
ASP的对象和组件:
1.ASP有7个固有对象
这7个固有对象分别是Request、Response、Server、Application、Session、ASPError和ObjectContext。
Request对象用来处理用户做出的请求,就是处理用户要求浏览器查看特定的网页或Web应用时做出的请求。此请求可以HTML的形式输入或仅以URL的形式作出。Response对象用来处理从Web服务器向用户发送信息并对此信息进行控制。
Serve对象用来代表服务器自身。因此它提供几个与Web服务器可能要完成的任务相关的常用功能,诸如建立新对象和设置脚本的超时特性等。还有通过将不合法字符转化为合法字符,把字符串转换为URL和HTML正确的使用格式的方法。
Application对象用来代表应用,可用它来管理诸如应用目录这一类的东西。
Session对象用来代表用户会话,并存储该会话的信息。可利用Session对象来管理如Web服务器在用户“请求”之间等待的时间等。
ObjectContext对象用来管理事务处理。它目前已经集成到Windows2000操作系统中了。它包含了所有ASP其他对象,可通过ObjectContext引用ASP的每个对象。
ASPError对象包含ASP脚本或asp.dll本身产生的任何错误的详细内容。
2.Microsoft Data Access Component
MDAC作为操作系统的组成部分的组件,与ASP一起提供。此组件中包含一组称为ActiveX Data Object(ADO)的对象,他们对于查看不同平台上的各种数据(数据库、表单、文本文件)是必不可少的。ADO主要有3个对象,分别是Connection、Command和Recordset。
Connection对象就是使ADO与数据库之间建立一个通道,也就是实现与数据库的连接。
Command对象就是对数据库进行发号施令,比如建立新的索引,执行查询等,它可以通过标准的SQL数据库操作语言得以实现。
Recordset对象是一个数据记录集,它包含了我们检索出来的记录数据,通过它可以直接对数据库进行修改。
3.活动服务器组件
活动服务器组件是与ASP一起免费带来的组件或DLL,他们有着广泛的用途。主要包括AD Rotator、Browser Capabilities、Content Link、Content Rotator、Counters、logging Utility、MyInfo、Page Counter、permission Checker、tools等组件。由于本次设计用到的不多,在此就不详细介绍了。
4.ASP脚本对象
他们分别是Dictionary、FileSystemObject和TextStream.由于本设计用到的也不多,在此就不详细介绍了。
1.2 SQL语句介绍
SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。如今无论是像Oracle ,Sybase,Informix,SQL server这些大型的数据库管理系统,还是像Visual Foxporo,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。
Structured Query Language包含4个部分:
☆数据查询语言DQL-Data Query Language SELECT
☆据操纵语言DQL-Data Manipulation Language INSERT, UPDATE, DELETE
☆数据定义语言DQL-Data Definition Language CREATE, ALTER, DROP
☆数据控制语言DQL-Data Control Language COMMIT WORK, ROLLBACK WORK
1.2.1 SQL的优点
SQL广泛地被采用正说明了它的优点。它使全部用户,包括应用程序员、DBA管理员和终端用户受益非浅。
1.非过程化语言
SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集。所有SQL 语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。 SQL不要求用户指定对数据的存放方法。 这种特性使用户更易集中精力于要得到的结果。所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段。查询优化器知道存在什么索引,哪儿使用合适,而用户从不需要知道表是否有索引,表有什么类型的索引。
2.统一的语言
SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。 SQL为许多任务提供了命令,包括:
☆查询数据
☆在表中插入、修改和删除记录
☆建立、修改和删除数据对象
☆控制对数据和数据对象的存取
☆保证数据库一致性和完整性
以前的数据库管理系统为上述各类操作提供单独的语言,而SQL将全部任务统一在一种语言中。
3.是所有关系数据库的公共语言
由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一个。所有用SQL编写的程序都是可以移植的。SQL是PostgreSQL(和大多数其它关系型数据库)用做查询语言的语言。它是可以移植的,并且容易学习使用。但是所有SQL语句都必须由数据库服务器独立地执行。这就意味着客户端应用必须把每条查询发送到数据库服务器,等待它处理这个查询,接收结果,做一些运算,然后给服务器发送另外一条查询。所有这些东西都会产生进程间通讯,并且如果客户端在另外一台机器上甚至还会导致开销。如果使用了 PL/pgSQL,那么可以把一块运算和一系列查询在数据库服务器里面组成一个块,这样就拥有了过程语言的力量并且简化SQL的使用,因而节约了大量的时间,因为用不着付出客户端/服务器通讯的过热。通过使用PL/pgSQL,应用可以获得可观的性能提升。
1.2.2 SQL的使用
1.ASP与Access数据库连接:
<%@language=VBscript%>
<%
dimconn,mdbfile
mdbfile=server.mappath(“数据库名称.mdb”)
setconn=server.createobject(“adodb.connection”)
conn.open"driver={microsoftaccessdriver
(.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile
%>
2.ASP与SQL数据库连接:
<%@language=VBscript%>
<%
dimconn
set conn=server.createobject(“ADODB.connection”)
conn.open"PROVIDER=SQLOLEDB;DATA
SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
%>
建立记录集对象:
setrs=server.createobject(“adodb.recordset”)
rs.openSQL语句,conn,3,2
3.SQL常用命令使用方法:
(1)数据记录筛选:
sql="select
from数据表where字段名=字段值orderby字段名[desc]"
sql=“selectfrom数据表where字段名like’%字段值%'orderby字段名[desc]"
sql="selecttop10
from数据表where字段名orderby字段名[desc]”
sql=“selectfrom数据表where字段名in(‘值1’,‘值2’,‘值 3’)"
sql="select
from数据表where字段名between值1and值2”
(2)更新数据记录:
sql=“update数据表set字段名=字段值where条件表达式” 
sql=“update数据表set字段1=值1,字段2=值2……字段n=值nwhere条件表达式
(3)删除数据记录:
sql=“deletefrom数据表where条件表达式”
sql=“deletefrom数据表”(将数据表所有记录删除)
(4)添加数据记录:
sql=“insertinto数据表(字段1,字段2,字段3…)values(值1,值2,值3…)”
sql=“insertinto目标数据表select*from源数据表”(把源数据表的记录添加到目标数据表)
(5)数据记录统计函数:
AVG(字段名)得出一个表格栏平均值
COUNT(*¦字段名)对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名)取得一个表格栏最大的值
MIN(字段名)取得一个表格栏最小的值
SUM(字段名)把数据栏的值相加
引用以上函数的方法:
sql=“selectsum(字段名)as别名from数据表where条件表达式”
setrs=conn.excute(sql)
用rs(“别名”)获取统的计值,其它函数运用同上。
(5)数据表的建立和删除:
CREATETABLE数据表名称(字段1类型1(长度),字段2类型2(长度)……)
DROPTABLE数据表名称(永久性删除一个数据表)
4.记录集对象的方法:
rs.movenext将记录指针从当前的位置向下移一行
rs.moveprevious将记录指针从当前的位置向上移一行
rs.movefirst将记录指针移到数据表第一行
rs.movelast将记录指针移到数据表最后一行
rs.absoluteposition=N将记录指针移到数据表第N行
rs.absolutepage=N将记录指针移到第N页的第一行
rs.pagesize=N设置每页为N条记录
rs.pagecount根据pagesize的设置返回总页数
rs.recordcount返回记录总数
rs.bof返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete删除当前记录,但记录指针不会向下移动
1.3 VBScript介绍
Microsoft Visual Basic Scripting Edition是程序开发语言Visual Basic家族的最新成员,它将灵活的Script应用于更广泛的领域,包括Microsoft Internet Explorer中的 Web 客户机 Script 和 Microsoft Internet Information Server 中的 Web 服务器 Script。
VBScript使用ActiveX™ Script与宿主应用程序对话。使用ActiveX Script,浏览器和其他宿主应用程序不再需要每个Script部件的特殊集成代码。ActiveX Script使宿主可以编译Script、获取和调用入口点及管理开发者可用的命名空间。通过ActiveX Script,语言厂商可以建立标准Script运行时语言。Microsoft将提供VBScript的运行时支持。Microsoft正在与多个Internet组一起定义ActiveX Script标准以使Script引擎可以互换。ActiveX Script可用在Microsoft® Internet Explorer和Microsoft® Internet Information Server中。
VBScript只有一种数据类型,称为Variant。Variant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。因为Variant是VBScript中唯一的数据类型,所以它也VBScript 中所有函数的返回值的数据类型。最简单的Variant可以包含数字或字符串信息。Variant用于数字上下文中时作为数字处理,用于字符串上下文中时作为字符串处理。这就是说,如果使用看起来象是数字的数据,则VBScript会假定其为数字并以适用于数字的方式处理。与此类似,如果使用的数据只可能是字符串,则VBScript将按字符串处理。当然,也可以将数字包含在引号(”")中使其成为字符串。除简单数字或字符串以外,Variant可以进一步区分数值信息的特定含义。例如使用数值信息表示日期或时间。此类数据在与其他日期或时间数据一起使用时,结果也总是表示为日期或时间。当然,从Boolean值到浮点数,数值信息是多种多样的。Variant包含的数值信息类型称为子类型。大多数情况下,可将所需的数据放进Variant中,而Variant也会按照最适用于其包含的数据的方式进行操作。声明变量的一种方式是使用Dim语句、Public语句和Private语句在Script中显式声明变量。
另一种方式是通过直接在Script中使用变量名这一简单方式隐式声明变量。这通常不是一个好习惯,因为这样有时会由于变量名被拼错而导致在运行Script时出现意外的结果。因此,最好使用Option Explicit语句显式声明所有变量。
1.过程
在VBScript中,过程被分为两类:Sub过程和Function过程。
(1)Sub过程
Sub过程是包含在Sub和End Sub语句之间的一组VBScript语句,执行操作但不返回值。Sub过程可以使用参数(由调用过程传递的常数、变量或表达式)。
(2)Function过程
Function过程是包含在Function和End Function语句之间的一组VBScript语句。Function过程与Sub过程类似,但是Function过程可以返回值。Function过程可以使用参数(由调用过程传递的常数、变量或表达式)。如果Function过程无任何参数,则Function语句必须包含空括号()。Function过程通过函数名返回一个值,这个值是在过程的语句中赋给函数名的。Function 返回值的数据类型总是Variant。
2.VBScript中可使用下列循环语句:
☆Do…Loop:当(或直到)条件为True时循环。
☆While…Wend:当条件为True时循环。
☆For…Next:指定循环次数,使用计数器重复运行语句。
☆For Each…Next:对于集合中的每项或数组中的每个元素,重复执行一组语句。
3.在VBScript中可使用以下条件语句:
☆If…Then…Else 语句
☆Select Case 语句

第二章 需求分析
要实现一个软件系统,首先应该进行需求分析,这样才能令设计出的软件满足用户的各项功能。下面就对在线考试系统的设计进行需求分析。
2.1 系统需要解决的主要问题
首先,因为考试是面向特定的某些对象的,所以考试者进入系统应该进行身份验证。考试者进入考试系统后,应该能根据自己的需要选择考试科目,所以该系统还应具有考试科目选择的功能。在线考试于一般的单机考试是不同的。鉴于考试环境一般为机房,考试者之间的距离很近,为了在线考试做到规范,对于每个应试者来说,试卷的试题和题量都应是相同的,但试题并不相同。在线考试基于环境,试卷应该从服务器的数据库随机抽取试题后动态生成的。另外,系统还应该对考试时间进行控制,时间到了会要求考试者交卷。考试者选择答案提交后,应该由计算机自动判卷,得到成绩后显示出来。考试完毕后,可以返回登录界面或继续考试。此外,应该能够方便、快捷的对在线考试系统管理,此外,用户还应能进行远程注册。
2.2 系统应该具备的基本功能
☆用户注册:用户可以进行注册,然后登录。
☆用户信息的管理:管理员可以增删用户
☆试题模型设置:设置各科目试题的每种题型的数量和分值。
☆试题库管理:分科目,对单选、多选两种题型试题库的管理,使试题的增删、编辑更为简便。
☆试卷生成:可以指定试卷的各题型的数量,从试题库里随机抽取试题生成一份原始试卷。
☆在线考试:系统严格控制整个考试过程,实行时间的监控与权限的控制,考生需要在限定的考试时间内交卷。
☆计算机自动阅卷:本系统只考虑客观题,要求计算机能自动阅卷,然后马上显示出考生分数。
☆成绩查阅:考生考完以后,管理员应该能对所有纪录进行查询,并应该可以删除指定纪录。
除了实现上述功能以外,在线考试系统还应该具有友好、简洁的界面,安全性要高,稳定性要强,能够满足100人以上同时及进行在线考试。

第三章 系统总体设计
3.1基本简介
该系统是专门用于用户注册、登录、参加在线考试以及管理员进行试题录入、修改、删除、成绩查询、管理用户的ASP应用程序。它应该具有开放性、方便性和灵活性。管理员不仅可以轻松地向题库添加、修改和查询试题,而且还可以自动新增科目并建立相应的数据;它还允许用户根据自己的需求,选取考试科目。考生进行有效的身份验证登录后,选择考试科目,并要求在规定的时间内进行答题,当达到规定的时间后,系统将自动予以提示。一旦考生做完交卷后便能立即看到自己的考试成绩,并且其分数将被记入库中以供审核和查阅;另外,还可完全由计算机自动灵活、随机的抽取试题库中的各类试题组成各种形式的试卷,其内容会随着库中试题的改变而改变,而且,不同的考生生成的试题是不同的。
用户可以是学校等单位的教师及学生和企事业单位的培训部门(因企事业单位每年要对员工进行素质、安全教育与技能等方面的培训及考试等)。
3.2 运行环境与系统结构
为了保证系统运行的效率和可靠性,系统服务器端应具有较高的软硬件配置,客户端的要求不是很高。此应用程序可广泛运行于国际互联网即Internet,也可适用于内部的局域网。其运行要求如下:
☆软件环境:
客户端: Windows95/98,Internet Explorer(IE)等
服务器端:Windows NT/Windows2000,Internet Information Server (IIS)4.0及其以上版本,IE等;或者Windows98,Personal Web Server(PWS),IE等。
数据库:采用access,运行于服务器端。
☆硬件环境:
服务器 CPU:PIII 500以上 ,内存:256M以上
客户机 CPU:P200MMX以上,内存:32M以上
3.3 系统结构图
根据需求分析,在线考试系统的结构图如下:

           图3-1 在线考试系统结构图

3.4 详细设计
详细设计是整个设计过程中,最重要的步骤之一。下面就分如下几个部分对系统进行详细设计:(1)试题设计(2)数据库中表的设计(3)用户、管理员权限(4)功能模块详细设计(5)在线考试系统考试模块框图
3.4.1试题设计
鉴于主观题的主观性,目前无法实现系统自动判卷,所以本系统只作客观题部分。一般情况下,单选题往往在四个供选的答案A、B、C、D中选择唯一正确的答案;多选题是在供选答案中有多个选择;而判断题实质上就相当于有两个选项的单选题。因而,本系统中所涉及的单选题和多选题跟过去的大体相同,由于时间的关系,判断题部分没有做。并且假设多选题一般情况下也是最多提供四个备选答案,标准答案至少有一个。故各题型的样题设计如下:
单选题:password的意思是: A、密码 B、经过 C、单词
D、通路
正确答案为A
多选题:下面的表达式为真的有:A、1>2 B、7%5=2
C、sin(30)=1/2 D、Cint(7/5)=1
正确答案为B、C、D
3.4.2数据库中表的设计
1.question表结构
通常,每一类型的试题都应有一个表结构。但考虑到目前系统存贮空间可以很大,也为了更加方便。我们采用把全部试题集中在一起的方案来建立数据表,每道客观题均有四个备选答案项,每个试题均具有题型、所属科目等数据段表示其属性。字段名一般是相应的英文单词。这样,查询起来较方便,会节约时间,也不致于造成数据十分杂乱等。详细设计如下表所示:
表3-1 question 表
字段名称 类型 说明
Haveselect 数字 常整型
ID 自动编号 常整型,递增,主键
Question 文本 字段大小200
A 文本 字段大小50
B 文本 字段大小50
C 文本 字段大小50
D 文本 字段大小50
Answer 文本 字段大小50
Type 文本 字段大小50
subjectname 文本 字段大小50
各字段说明:
(1)haveselect字段代表在随机选题时是否已经被某用户选过,类型为数字。
(2)ID是问题的id号,用来唯一标志该问题,把它设为主键,类型为自动编号。
(3)Question字段为问题内容,类型为文本。
(4)A字段代表选项A的内容
(5)B字段代表选项B的内容
(6)C字段代表选项C的内容
(7)D字段代表选项D的内容
(8)Answer字段表示答案选项
(9)Type字段表示试题类型
(10)subjectname字段代表试题所属科目名称
2.subject表结构
表3-2 subject表
字段名称 类型 说明
Multiper 数字 常整型
Singleper 数字 常整型
multinumber 数字 常整型
singlenumber 数字 常整型
subjectname 文本 字段大小50
Testtime 数字 常整型
Id 自动编号 常整型,递增,主键
各字段说明:
(1)multiper字段代表在某考试科目的考试题中每个多选题的分值。
(2)singleper字段代表在某考试科目的考试题中每个单选题的分值。
(3)multinumber字段为某科的多选题题量。
(4)singlenumber字段为某科的多选题题量。
(5)subjectname字段代表科目名称。
(6)testtime字段代表某科的考试总时间。
(7)id字段代表科目的id号。
3.score表结构
表3-3 score表
字段名称 类型 说明
Studentname 文本 字段大小50
Subjectname 文本 字段大小50
Score 数字 常整型
Id 自动编号 常整型,递增,主键
Endtime 日期/时间
各字段说明:
(1)studentname字段代表在某次考试记录中学生的名字。
(2)subjectname字段代表在某次考试纪录中考试科目名。
(3)score字段为某次考试纪录中考试分数。
(4)id字段为某次考试纪录的标志号。
(5)endtime字段代表考试的结束时间。
4.student表结构
表3-4 student表
字段名称 类型 说明
Studentname 文本 字段大小50
Studentpassword 文本 字段大小50
Id 自动编号 常整型,递增,主键
各字段说明:
(1)studentname字段代表学生的名字。
(2)studentpassword字段代表密码。
(3)id字段为学生的标志号。
5.admin表结构
表3-5 admin表
字段名称 类型 说明
Name 文本 字段大小50
Password 文本 字段大小50
Id 自动编号 常整型,递增,主键
各字段说明:
(1)name字段代表管理员的名字。
(2)password字段代表密码。
(3)id字段为管理员的标志号。
3.4.3 用户、管理员权限
☆管理员:在此系统中可以由若干个管理员,即系统管理员。他们具有一般用户所没有的权限,即具有管理用户、试题以及试卷等内容的权力。它不需注册,在数据库有一个表来存放相关信息,可由以存在的管理员添加或删除管理员。
☆一般用户:主要是指学校的学生和企事业单位的培训对象等。
3.4.4 功能模块详细设计
下面,对各个功能模块分别进行详细讨论,具体情况见系统源程序。
3.4.4.1 管理模块
管理员可以向题库中添加各种类型且符合要求的试题,也可以对它们进行修改和删除。同时,管理员也能对科目、用户、考试记录等数据进行管理。
1.试题管理
(1)试题录入
首先,用户选择试题所属科目。若菜单中没有该科目,则可以新增一个。返回、刷新一次页面,即可看到新增的科目名称。而且,在本系统中其它需要选择科目的地方也会自动更新。其次,每道试题有类型、试题内容与选项和答案等栏目。管理员输入完以后,即可看到预览效果。如果输入不合法,或者该科题库中已有该试题编号和内容等,则系统给出相应的提示或警告,以待更正。
(2)试题修改
管理员还可以对试题进行修改。不过,对于各表中的主键不用修改,避免了造成系统中的数据混乱,或者覆盖其它有用数据的现象。如果用户执行了非法操作,则必须重新操作。
(3)试题删除
管理员可以删除不再需要的试题。
2.科目管理
(1)添加科目
其基本信息有科目名称、题型、题量和考试总时间等,对于用户输入的不符合系统要求的数据,系统仍旧给出提示或警告。
(2)科目删除
管理员可以删除不再需要的科目。
3.用户管理
管理员可以通过管理界面添加或删除用户。
4.管理管理员
管理员可以通过管理界面添加新管理员或删除原有管理员。
5.考试记录管理
系统中的管理员可以查询考试记录,也可以删除考试纪录。
3.4.4.2在线考试模块
进入在线考场是本系统最重要的部分之一。因为一个系统如果涉及到现实的话,就必须考虑得十分周到、完善。考生登录后,只要选择考试科目以后,就可以调出试卷进行在线考试。为了实现动态随机不重复的抽取试题,需要在选题过程中每选出一题,就要在试题库中作相应的标志,以便下次不会重复取出此题。试卷出来后要对试题库中的标志位复原。这样就会使每个考生的试卷都不同。考生的其答题信息通过单、复选按钮选择答案来反映。考试结束采取自主交卷和到了规定的时间自动题示有机结合的方式办法予以实现。
3.4.4.2用户注册模块
该模块的功能是实现用户远程注册。用户输入想要注册的用户名和密码,提交之后由系统判断该用户是否已经存在,如果存在,就给出相应信息,如果不存在,就把用户输入的用户名和密码写到数据库中,完成注册。
3.4.5 在线考试系统考试模块框图


          图3-2 在线考试系统考试模块框图

第四章 系统实现
在进行了整体设计以后,就开始进行详细的设计及编码工作。也就是设计文件和把他们有机地组织在一起实现所有功能。
4.1 系统流程图设计
根据系统总体设计,首先系统要有一个登录界面,用户可以从该界面登录参加考试。管理员也应该有一个进入管理登录界面的通道。此外,这个界面上还应该有一个用户注册的通道。
在考生正确输入用户名和密码以后,接着应该进入考试科目选择界面。在该界面上,考生选择参加考试的科目,这个人机交互的过程是必不可少的。
考生确定考试科目以后,进入开始考试界面,由计算机随机提取试题,显示出来组成试卷,并开始进行计时。考生再次进行考试,答完试题后交卷,进入下一个界面。
考生提交答卷后,由计算机进行处理–判卷,得出考试分数,显示出来,并把该生考试记录存入数据库。在这个界面上应该可以返回继续进行考试或回到登录界面。
以上是系统进行考试功能的部分,要对系统进行管理,如试题管理、科目管理、用户管理等就需要设计一些管理界面。下面就来逐步进行设计。
要进行管理首先要有管理员登陆验证,这里另外设计了一个界面,使它与用户登录区别开来。这个界面与用户登录界面表面上很相似,但是他们是从不同的表中提取数据进行验证的,以便于系统扩充和增加安全性。
管理员登录以后,应该有一个管理项目选择界面,其中包括管理用户选项、管理管理员选项、管理考试科目选项、管理考试纪录选项以及管理各科试题选项。
管理用户的界面可以实现用户的增加、和删除的功能,管理员在此可以对用户进行管理。
管理管理员的界面,功能和管理用户的差不多,实现对管理员的增加和删除功能。
管理考试科目界面用来增加或删除考试的科目,以方便对各科试题的管理和查询。
管理考试纪录界面可以对考生的每次考试进行纪录,管理员科可以对考生成绩、考试科目、时间及考试各相关纪录进行查询和删除。
最后是试题库管理界面,它根据各科进行分类。通过这个界面管理员可以对题库中的某科试题进行增加、修改或删除。这样就十分方便灵活的对试题库进行管理。
下图就是系统流程图:

图4-1 系统流程图

4.2 各文件功能介绍及详解
4.2.1.
该文件实现的是连接数据库和断开连接的功能。
文件中主要是定义了两个过程conn_init()和endConnection()。第一个是连接数据库,第二个是实现断开连接。其中conn_init()过程中的连接是通过下面语句实现的:
connstr= “DBQ=” + server.mappath(“data.mdb”) + “;DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};”
set conn=server.createobject(“ADODB.CONNECTION”)
conn.open connstr
connstr确定了数据文件的路径和数据库驱动程序。
Conn的含义是定义了一个变量用,来存放数据库连接所创建的对象。
conn.open connstr则真正实现了数据库的连接。
该文件主要被包含在其他文件中实现数据库的连接和断开功能。
4.2.2.
该文件的功能是系统登陆的入口,在此可以实现用户注册入口,管理员管理入口以及用户进入考试系统登陆界面的功能。
该文件的功能使这样实现的:表单提交给文件本身。再由HTML上面的ASP程序对提交信息进行处理。
最上面的<%@ Language=VBScript %>表示脚本语言是VBScript。

表示包含conn.asp文件。以下的程序进行了选择判断,如果提交的表单中的submit值为“登录”,就继续判断看student表中是否存在与该用户输入的用户名和密码相同的记录,如果存在就转到selectsubject.asp页进行考试科目选择。不存在就返回“对不起,请输入正确的用户名和密码。”如果submit值为“注册”,就转到register.asp页进行用户注册。如果submit的值为“管理”就转到admin文件夹中的login.asp页。重点程序如下:

set rs = server.createobject(“adodb.recordset”)
rs是一个变量,用来存放一个recordset对象。
sql=“select * from student where studentname='” & Request.Form(“studentname”) & “’ and studentpassword='” & Request.Form(“studentpassword”) & “'”
变量sql代表一个SQL语句,功能是从表student中选出用户名和密码与考生提交的用户名和密码都相同的记录。
rs.open sql,conn,1,1
该语句的功能是执行sql语句并把记录集结果存储在变量rs中。
rs.close的作用是关闭纪录。
session(“studentname”)=request.form(“studentname”)
该句的意思是把表单提交的变量studentname的值赋给一个session对象studentname。这个对象用来存储用户名,它在该用户对每个页面的访问中有效。
set rs=nothing含义是清空rs变量。
call endConnection()是调用conn.asp中的过程,用来关闭于数据库的连接。
4.2.3.
该文件实现了用户注册的功能,用户只要填写想要注册的用户名及密码,文件首先查看用户名是否已经存在,如果存在就提示该用户名已经存在,否则就将用户输入的信息添加到数据库中的student表内。然后用户就可以使用自己注册的用户名和密码登录在线考试系统进行在线考试。
在文件中,表单提交给register.Asp自身进行处理,如果submit值为“注册”首先进行判断看用户名或密码是否为空。如果为空就显示“错误!用户名或密码不能为空!”的信息。如果不为空,进行下一步判断,看student表中是否已经存在用户想要注册的用户名,如果存在,就显示信息“错误!该用学生存在!”,如果不存在就将要注册的用户名和密码写入student表。代码如下:
sql=“insert into student(studentname,studentpassword) values('” & cstr(trim(request(“studentname”))) & “‘,’” & cstr(trim(request(“studentpassword”))) & “')”
conn.execute sql
最后,用一个Vbscrip语言编写的消息框显示注册成功信息。
4.2.4.
该文件是实现用户登录在线考试系统后进行考试科目选择的功能,选择科目后进入考试界面。
该文件首先是将subject表中所有的纪录都以单选项的方式选出来,如果没有纪录,则显示“对不起,暂时没有任何考试科目。”用户按提交后,表单仍然提交给文件自身。处理程序首先判断用户是否选择了一个考试科目,如果没有选择显示“你没有选择考试科目,请选择考试科目!”如果选择了某个考试科目,先把该科目赋值给一个session变量selectsubjectname,然后从subject表中选出该科的相关信息,并也都设成session变量。Singlenumber表示单选试题数量,multinumber表示多选试题数量,singleper表示单选试题分值,multiper表示多选试题分值,testtime表示考试总时间。接着进入考试界面。
4.2.5.
该文件就是考试界面,实现真正的动态随机选题,并对每个考生的考试时间进行监控,到结束时间后自动给出提示。
该文件的总体构架是使用了if else 语句进行了一个选择,刚进入该页面submit1得值肯定不等于“开始考试”,所以先显示出“开始考试”的按钮。按下以后,首先把当前时间以分种为单位存储在session的变量starttime中。然后进入随机抽取试题部分,单选题和多选题的抽取很相似,只不过一个是单选按钮,一个是多选按钮罢了。这里只解释单选题的部分。
strid1="“是定义了一个字符串变量,并先赋值为空。
Randomize是产生随机种子,在使用rnd()函数之前一定要先用Randomize产生随机种子才能实现其产生0~1之间随机数的功能。
for i=1 to session(“singlenumber”)直到next是选择singlenumber(代表某科目的单选题数量)个单选题。
下面的代码实现了从数据库中随机不重复的选题:
set rs=server.createobject(“adodb.recordset”)
sql=“select * from question where subjectname='”&session(“selectsubjectname”) & “'and type=‘单选题’ and haveselect=0 "
rs.open sql,conn,3,2
count=rs.recordcount
temp=fix(count*rnd(10))
rs.move temp
rs(“haveselect”)=1
rs.update
strid1=strid1 & rs(“ID”) & “,”
其中haveselect标志某题是否已经被选过。
Count变量用来存放所有未被选过的单选题的总数。
temp变量用来存放0~Count之间的随机整数值。
rs.move temp是将当前记录移到第temp条纪录。
rs(“haveselect”)=1是将当前选出的纪录的标志位设为1,然后用rs.update把数据库中的相应标志位改为1。
strid1=strid1 & rs(“ID”) & “,“是将所有选出的试题的id号用逗号分割后存储在strid1一个变量中,以方便的把所有选出的试题的id号传到result.Asp文件中,这也是本设计的一个独特的地方。需要说明的是strid1变量的最后是一个逗号,在下一个文件中会详细说明如何进行处理。
set rs=server.createobject(“adodb.recordset”)
sql=“select * from question where haveselect=1 "
rs.open sql,conn,3,2
rs.movefirst
do while not rs.eof
rs(“haveselect”)=0
rs.update
rs.movenext
loop
上面一段程序是在选完题之后将所有已经设成1的haveselect改写成0,这样自己下次或别人就仍可以选择所有的试题。
最后一段程序是用来计时的,考试时间到了之后自动给出提示。
4.2.6.
考生提交答卷以后,该文件就把考生的答案同question表中的正确答案进行比较,最后得出考生的得分。
首先是变量赋值,取得session对象的一些变量值,以方便使用。endtime=now()是去的考试结束时间。
selectstr1=request.form(“hidQuestID1”)和
selectstr2=request.form(“hidQuestID2”)是获取存放被选单选和多选试题的id号的两个字符串。
len1=len(selectstr1)和
len2=len(selectstr2)是取得两个字符串的长度。
str1=left(selectstr1,len1-1)
str2=left(selectstr2,len2-1)是把两个字符串的结尾(也就是逗号)取掉。
dim id1,id2
id1=split(str1,”,”)
id2=split(str2,”,”)是用split()函数将存有id号的字符串拆开并存放到数组当中,以便调用。
以上就实现了所有被选中的试题的id号的传递。
下面这段程序就实现了单选试题的答案于正确答案的比较,并得出单选题应得分数。
for i=1 to singlenumber
result=request.form(“no”&id1(i-1))
if not isempty(result) then
sql=“select * from question where id=”& clng(id1(i-1))
set rs=server.createobject(“adodb.recordset”)
rs.open sql,conn,3,2
if result=rs(“answer”) then
score=score+cint(singleper)
end if
rs.close
set rs=nothing
else
end if
next
多选题与单选题程序基本相同,这里就不赘述了。
接着就是将考试结果纪录存入score表中,并对考生显示出考试成绩。
上面是在线考试系统考试部分的程序及其解释,该部分是系统最主要的部分,所以解释得比较详细。管理部分很多文件功能都很相似,这里就只挑功能最全又比较重要的文件作以解释。(这些文件都放在admin文件夹下)
4.2.7.
该文件实现的功能是管理员选择进行管理的项目,也就是管理主界面。
4.2.8.
该文件实现对用户进行管理(删除或添加)的功能。
4.2.9.
该文件实现对管理员进行管理(删除或添加)的功能。
4.2.10.
该文件的功能是实现对考试科目及相关参数(如考试时间、单选及多选题量)进行管理。
4.2.11.
该文件的功能是对考试记录进行查询或删除。
4.2.12.
两个文件和起来实现对试题库进行删除修改和添加的功能。
subjectname=trim(request(“subjectname”))是将上一个界面传来的科目名称赋值给subjectname变量。
set rs=server.createobject(“adodb.recordset”)
rs.open “select * from question where subjectname='” & cstr(trim(request(“subjectname”)))&”’ order by id desc ",conn,1,1
上面这段代码是从question表中将所有其科目名与所选科目相同的问题都选出来。
编辑 删除
上面这段代码的的作用是将删除的参数传给文件自身或将编辑的参数传给SureDel(id,subjectname)函数。
如果实执行删除操作就转到SureDel(id,subjectname),提示是否真的要删除,如果选择确定就执行如下代码:
sql=“delete from question where id=” &request(“id”)
conn.execute sql
执行删除该问题的操作,将question表中的相应记录删除。否则,如果选择取消就不执行删除操作。
如果执行编辑同样将参数传给文件自身,先执行下面代码将isedit的值设为真:
if request(“action”)=“edit” then
isedit=true
end if
文件最下面是编辑试题或添加试题部分,表单提交给addquestion进行处理。
13.
首先将表单传过来的各个参数值赋给不同的变量,以便于使用。然后判断question,subjectname,answer和leixing四个变量是否为空,如果为空显示错误信息。不为空就进行判断,看是修改问题还是添加问题,分别进行相应处理(修改question表中的记录或向其中添加记录),然后返回到mgquestion.asp页面。
4.3调试过程中遇到的主要问题和解决办法
在系统调试的过程中主要遇到三个比较困难的问题:
第一个就是如何实现在随机选题的同时保证不重复,本设计最后使用了在question表中设置了一个haveselect字段来标志选过的纪录的办法来解决。
第二个就是如何将test.asp中所有试题的id号传到result.asp页中。因为试题数是变值,用一般的使用变量方式实行不通的。本设计采用了将id号以逗号分隔存在字符串变量中,然后到result.asp页面用split()函数拆开存放到数组中的办法进行解决。
第三个就是问题在编辑之后就无法再选出来了,最后发现是因为编辑之后科目名的前面会有空格,所以会无法选出。解决的办法是使用trim()函数将空格去掉。
4.4 系统测试及实现后主要界面
本系统经先进行各模块测试,经过修改和调整通过以后,进行总体测试。测试结果各项功能均已经或基本达到设计要求。
下面就将各主要文件实现的界面一一列出:
1.

            图4-2 用户登录界面图  

2.

图4-3 考试科目选择界面图
3.

图4-4 考试界面图
4.

图4-5 考试结果界面图
5.

图4-6 管理员登录界面图
6.

图4-7 管理界面图
7.

图4-8 管理科目界面图
8.

图4-9 管理记录界面图
9.

图4-10 管理试题界面图

结论
计算机考试系统经过系统功能分析,可行性研究,需求分析三个阶段,基本了解了该系统的功能要求及设计的可行性。通过总体设计、详细设计、编码三个阶段,基本实现了考试系统远程注册,考试,系统管理等预定要求,最后将所有模块组装成一个完整的系统。经过测试,系统实现了需求分析中的所有要求,运行正常,操作界面简洁。

           结束语

经过近三个月的毕业课题的设计,我从其中学到许多在真正实际的软件开发过程中才能够涉及到的各种各样简单的也有复杂的问题。
在这次毕业课题的设计过程中,我不仅仅只是单纯的拓宽了我的专业知识面,更重要的是它提高了我各方面的能力。当我在进行程序设计时,忽然涉及到了我从来都不了解的问题,甚至是根本就没有听说过的新概念或者是新技术,这时我必须去图书馆或是一些相关的电子书店查找与这个问题相关的图书资料,也会通过国际互联网查找我所需要的内容。在这一过程中,慢慢的锻炼了我在多如大海的各种类型的资料中查询我所需要的材料的能力。在以前学习课程的时间里,我很少会这样体验如何去查找自己需要的资料,如今才知道在浩瀚的书海里要想找到我真正需要的东西也并非是一件易事。
本系统的设计是我真正独自负责了一个实际项目从需求分析、设计到系统完成测试、编写论文的整个软件开发过程;
在毕业课题的设计过程中,我得到了院里许多老师的关心和支持,还有同学们的大力帮助,在此,我要特别感谢在我的整个课题设计中给予我悉心指导的指导老师——某某老师。最后,对所有关心过我的老师及同学们表示衷心的感谢!

参考文献
【1】 |美| Eric A. Smith 著,韩军 马云 等译Active Server Pages宝典 电子工业出版社,2000,6
【2】 |美| Greg Buczek MCSD.MCT 编著 李博 于骞 译 科学出版社2000,9
【3】 萨师煊 王珊 数据库系统概论 高等教育出版社2000,3
【4】|美| R.Allen Wyke 著 闻道工作室 译 机械工业出版社 2001,6
【5】王姗 陈红 编著 《数据库系统原理教程》第一版 北京 清华大学出版社
【6】宣小平 但正刚 张文毅 编著 《ASP数据库系统开发实例导航》 第一版 北京 人民邮电出版社 2003.1
【7】杜煜 姚鸿 编著 《FrontPage 2000 实用技能》 第一版 北京 清华大学出版社 2000.1
【8】李四达 编著 《Dreamweaver 4.0 精彩网页设计教程》第一版 北京 人民邮电出版社 2001.3
【9】黄聪 编著 《Dreamweaver 4.0 基础 实例 技巧 》第一版 北京 海洋出版社 2001.11

你可能感兴趣的:(数据库)