网上选课系统需求分析 网上选课系统

导读:爱华网网友为您分享以下“网上选课系统”的资讯,希望对您有所帮助,感谢您对aIhUaU.com的支持!

第1章 绪 论

1.1 课题背景

在信息全球化、网络化的今天,校园网已成为每所高校必备的信息基础设施,也成为学校提高教学管理水平的重要手段。为了更好地实现管理的科学化、现代化,进一步提高教学质量和管理水平,各种依托于校园网的管理信息系统应运而生。网上选课系统就是这些信息系统中不可或缺的一员。以往的选课方法是随堂报名。这种方法虽然直接,但是存在很多弊病,如造成选课的盲目性,去不同的课堂报名的学生人数天壤之别,浪费学生的时间和体力,使教学资源不能得到合理的充分利用。这些都是因为传统的选课方法没有预见性,大家没有事先协调好。这就需要有一个网上选课系统来改变这种现状,在课程开始之前就安排好各个学生要上的课程,合理充分地利用好教学资源。

1.2 课题研究的目的和意义

课题研究的意义:

(1) 给出解决传统选课方式浪费时间和精力的问题的方法,讨论实现一个网上选课系统的可行性,使在网上进行选课成为可能;

(2) 对一个基于B/S结构的网上选课系统进行设计并具体实现,做出一个可以完成基本选课功能及学生信息管理、教师信息管理和课程信息管理功能的MIS系统。

1.3 国内外概况

网上选课系统已经出现很长时间了,实现该系统的方法也多种多样,主要有JSP+MySql+Tomcat,PHP+MySql+Apache,ASP+SQL Server+IIS和ASP.NET+SQL Server+IIS等。这些实现方法中前三种的开发语言都是HTML设计代码和后台编程代码不分离的,造成代码不容易读懂和不利于后期维护。ASP.NET是微软推出的新一代开发工具,实现了HTML设计代码与后台编程代码的分离。该系统中使用ASP.NET+SQL Server+IIS,主要考虑到同学们选课主要使用Windows系统,对ASP.NET支持良好,而且ASP.NET代码更易于维护。对于数据库存取操作,多数系统直接将SQL语句写在代码里进行数据库查询,在该系统中,绝大部分功能都使用存储过程来完成数据库访问的工作。

1.4 Browser/Server结构

Browser/Server(B/S)结构是一种以Web技术为基础的新型的MIS系统平台模式。他把传统的 C/S结构中的服务器部分分解为一个数据服务器与一个或多个应用服务器(web服务器),从而构成一个三层结构的客户服务器体系如图1.1所示。

图1.1 三层B/S结构

采用这种服务器端,客户端的运行模式,主要的数据计算操作都在服务器端进行,应用程序也在服务器端安装,客户端不用安装应用程序,所有操作均通过浏览器来完成。与传统的C/S结构相比,它具备以下的优点:

(1)简化了客户端,客户端软件仅需安装浏览器,客户端硬件配置要求较低。

(2)使用户的操作变得更简单,用户只需了解浏览器的使用,就可访问不同的应用,获取所需的信息。

(3)特别适用于网上信息发布与获取,使得传统的MIS的功能有所扩展。

鉴于B/S结构的诸多优点与本系统的实际需求,最终决定采用 B/S结构。

1.5 ASP.NET和ADO.NET

Visual Studio.NET是Microsoft公司推出的可视化编程工具,ASP.NET作为Visual Studio.NET 的组成部分之一,已经成为Internet中Web应用程序的新一代开发工具,并逐渐被广大程序员普遍采用。

在微软的.NET战略中,ASP.NET是非常重要的一环,它相对于以前的ASP有了相当大的改进。相对于其他的Web应用开发模型来讲,ASP.NET具有更大的优势,其主要特点包括:

ASP.NET与其前版ASP不同,它是在服务器上运行的编译好的公用语言运行时代码,可以更好地提高程序运行性能。

ASP.NET与语言无关,它可以采用C#、VB.NET以及Jscript等支持.NET框架的语言来进行开发,开发者可以根据自己的情况进行选择。在这个系统中使用的是C#作为开发语言。C#是一门崭新的语言,学过C++的很容易掌握它,而且它和Java也有

很多相似之处。它具有开发效率高,应用范围广等特点,成为当前程序开发领域的一大

热门。

ASP.NET支持开发Web服务,它对XML技术提供了很好的支持,使得Web应用程序的开发更具可扩展性和跨平台性。

ASP.NET提供了很多功能强大的服务器端控件,使得程序的开发更趋于简单化。同时,它还提供了HTML设计代码和后台编程代码分离的技术,并在后台代码开发中提供强大的智能化支持,使得开发工具更具有条理性。

采用ASP.NET技术开发的系统在性能上有了很大的改善,其主要表现在以下几方面:

(1)由于ASP页面每次打开都必须经过先编译后解释的过程,所以页面在反复打开时速度没有任何提升,而ASP.NET页面只需要一次编译后不需要再重新编译,直到该页面被修改或 Web应用程序重新启动。这使得在多次访问时速度有了极大的提升。尤其在这种访问量很大,很多人同时并发访问的情况下,访问速度的提升更加明显。

(2)由于ASP没有提供任何输出数据为内容的元件,所以在使用ASP撰写数据库页面时只能借助ADO的RecordSet对象逐笔读取记录,而ASP.NET 通过ADO.NET提供的DataGrid等数据库元件可以直接和数据库联系。在这个选课系统中就是用DataGrid绑定查询结果来展示课程信息,并在DataGrid的列里绑定按钮进行相应的删除和编辑等操作。

(3)ASP.NET支持应用程序的实时更新。管理员不必关掉网络服务器或者甚至不用停止应用程序的运行就可以更新应用文件。应用程序文件永远不会被加锁,因此甚至在程序运行时文件就可以被覆盖。当文件更新后,系统会温和地转换到新的版本。

(4)ASP.NET采取”code—behind”方式编写代码,使得代码更易于编写,结构更清晰,降低了系统的开发与维护的复杂度和费用。

ADO.NET用来访问数据库。与数据库相连,ADO.NET提供了如下3种方式:通过ODBC相连;通过OLEDB相连;直接与SQL Server相连。3种方式由于应用层次的差异,使得效率由低到高,独立性由高到低。在这个系统中,使用SQL Server作为数据库,保证了系统的高效。

传统的应用程序是通过先建立到数据库的连接,在程序的整个运行过程中维护连接的方式来设计的。ASP.NET采取了断开连接方式的数据结构。当浏览器向Web服务器请求网页时,服务器处理这个请求,并将所请求的网页发送给浏览器,然后连接就被断开,直到浏览器发出下一个请求。

ADO.NET的另一个创新是引人了数据集(Dataset)。一个数据集是内存中提供数据关系图的高速缓冲区。数据集对数据源一无所知,它们可以由程序或通过从数据仓库中调入数据而被生成、填充。不论数据从何处获取,数据集都是通过使用同样的程序模板而被操作的,并且它使用相同的潜在的数据缓冲区。

1.6 本文的工作

本文以 Visual Studio.NET为开发工具,使用ASP.NET(C#)为开发语言,以SQL Server 2000为后台数据库,在需求分析的基础上,提出了系统的设计,并最终实现了网上选课系统.。系统的主要功能有: 课程信息的管理,教师信息的管理,学生信息的管理和学生网上选课的管理。

第1章介绍了当前选课系统的发展现状,开发工具和一些背景知识。

第2章对该系统进行了需求分析。

第3至4章介绍了系统设计与系统的具体实现。

第5章是对本文的研究进行总结与展望。

摘 要

该B/S结构的系统在Windows XP系统和VS.NET平台下开发完成,使用C#作为ASP.NET的开发语言,SQL Server 2000作为数据库。系统有较高的安全性和较好的性能。其中连接数据库的字符串可以随时在web.config里修改,并经过编码加密,增加了灵活性,保护了数据库的安全。代码中通过使用进程中的Session、尽量使用存储过程和尽量减少数据库连接的打开时间等手段来提高性能。

通过分析B/S结构的特点并结合我校选课的实际情况,提出了基于B/S结构网上选课系统的基本设计思想,简要介绍了系统各功能模块及数据库的设计,着重讨论了用 ASP.NET技术和SQL Server 2000开发网上选课系统时的数据库访问技术和动态网页制作技术,并给出了部分实现代码。使用该系统学生可以方便地在校园网上进行网上选课。

关键词:网上选课;浏览器/服务器结构;数据库管理系统;存储过程

Abstract

This B/S structure system is developed under VS.NET platform in Windows XP operating system, using C# as ASP.NET development language and SQL Server 2000 as the database. This system is of higher security and better performance. The character string, which is used to connecting to the database, can be modified at any time in the file “ web.config”. The string is encoded and encrypted, increasing flexibility of the system and security of the database. In code, through using the Session in process, making use of stored procedure and minimizing the database opening time to improve performance of the system.

This paper gives the basic design idea of the B/S—based online course elect system by analyzing the characteristic of the B/S structure and combining with the actual public elective courses conditions of our school.It introduces the function module and database design briefly,followed by a discussion on database accessing technology and the active page technology of the course elect system based on ASP.NET and SQL Server 2000.By using this system,students can elect courses online efficiently.

Keywords: online course elect, B/S structure, DBMS, stored procedure

目 录

摘 要 .............................................................................................................................................................. I Abstract ...................................................................................................................................................... II 目 录 ........................................................................................................................................................... III

第1章 绪 论 .......................................................................................................................................... 1

1.1 课题背景 ............................................................................................................................................. 1

1.2 课题研究的目的和意义 .................................................................................................................. 1

1.3 国内外概况 ........................................................................................................................................ 1

1.4 Browser/Server结构 ..................................................................................................................... 2

1.5 ASP.NET和ADO.NET ................................................................................................................... 2

1.6 本文的工作 ........................................................................................................................................ 4

第2章 需求分析 .................................................................................................................................. 5

2.1 系统简介 ............................................................................................................................................. 5

2.2 系统运行环境 .................................................................................................................................... 5

2.2.1 硬件平台 ...................................................................................................................................... 5

2.2.2 操作系统 ...................................................................................................................................... 5

2.2.3 应用软件及开发平台 ............................................................................................................... 5

2.3 系统的功能需求................................................................................................................................ 5

2.4 系统的数据需求................................................................................................................................ 6

第3章 系统设计 .................................................................................................................................. 7

3.1 系统的数据库设计 ........................................................................................................................... 7

3.1.1 数据流图 ..................................................................................................................................... 7

3.1.2 数据字典 ...................................................................................................................................... 8

3.1.3 系统的主要E-R图 .............................................................................................................. 10

3.1.4 模式图(shema diagram) ................................................................................................... 11

3.1.5 表的设计 .................................................................................................................................... 11

3.1.6 数据库模式所达到的范式分析 ........................................................................................... 14

3.1.7 触发器的设计........................................................................................................................... 15

3.1.8 存储过程的设计 ........................................................................................................................ 16

3.1.9 数据库备份与还原 ................................................................................................................... 21

3.2 系统功能设计 .................................................................................................................................... 21

3.2.1 学生模块 ...................................................................................................................................... 22

3.2.2 管理员模块 ................................................................................................................................. 22

3.3 输入输出与报表设计 .................................................................................................................... 23

3.3.1学生用户界面.............................................................................................................................. 23

3.3.2 管理员界面 ................................................................................................................................. 23

第4章 系统实现 ................................................................................................................................ 25

4.1 网页设计 ........................................................................................................................................... 25

4.1.1 学生页面设计........................................................................................................................... 25

4.1.2 管理员页面设计 ...................................................................................................................... 27

4.1.3 网页身份认证设计 ................................................................................................................. 28

4.2 连接数据库的相关设计 ................................................................................................................ 31

4.2.1 连接字符串相关问题 ............................................................................................................. 31

4.2.2 绑定数据库数据的相关设计 ............................................................................................... 33

4.3 优化性能的相关设计 .................................................................................................................... 36

4.3.1 使用存储在进程中的Session ................................................................................................ 36

4.3.2 数据库连接打开的时间尽可能短 ...................................................................................... 37

4.3.3 使用带有参数的SQL命令 .................................................................................................. 37

4.3.4 使用SQL Server存储过程 ................................................................................................... 37 总 结 ........................................................................................................................................................... 38 致 谢 ........................................................................................................................................................... 40 参考文献...................................................................................................................................................... 41

第2章 需求分析

2.1 系统简介

这是一个在Visual Studio.NET集成环境中使用C#开发出来的系统,可以在任何安装有IIS(Internet Information Services)和Microsoft.net framework的windows系统下安装服务器端,数据库可以放在本地,也可以放在网络上的任意位置。但是服务器和数据库连接的网络带宽要足够大,从而保证数据存取的快速有效。在任何装有浏览器并可以上网的电脑上都可以访问该系统。

2.2 系统运行环境

2.2.1 硬件平台

Intel或AMD平台,CPU 1G以上,内存128M以上,硬盘10G以上。 2.2.2 操作系统

服务器在Windows操作系统中,数据库在服务器可以访问的网络中,浏览器可以在Windows或Unix,Linux系统下。 2.2.3 应用软件及开发平台

服务器所在的电脑上应安装Windows操作系统,要安装IIS(Internet Information Services)和Microsoft.net framework。开发系统的电脑中要安装Visual Studio.NET开发环境和IIS及SQL Server2000,以便于调试。开发平台为Windows操作系统下的VS.NET平台,使用C#作为开发语言。数据库语言为T-SQL,可以编写存储过程(Stored procedure)和触发器(Trigger)。

2.3 系统的功能需求

系统需要完成以下功能:

(1)课程信息的管理,包括课程的录入,修改,删除等。 (2)教师信息的管理,包括教师信息的录入和修改,删除等。

(3)学生信息的管理,包括学生信息的录入,修改和删除,学生登录密码初始化等。 (4)学生网上选课的管理,包括学生通过浏览器进行选课,取消选课,查询选课及修改登录密码等。

这个系统有两种用户,一是学生用户,二是网络管理员,都通过浏览器访问系统。学生用户在这个系统中可以进行的操作不是很多,包括选课,取消选课,查询选课和修

改登录密码等。但是因为学生用户很多,而且很可能同时选课,因此要增强系统的并发性,提高性能。网络管理员要进行课程信息、学生信息和教师信息的录入及维护,可以进行的操作比较多,而且有比较大的风险性,因为对一些敏感操作要提醒进行确认;同时由于管理员比较少,不用太多考虑并发性。

2.4 系统的数据需求

系统需要数据库支持,该系统使用的是SQL Server 2000作为数据库。学生信息,教师信息和课程信息的录入由管理员完成。因为选课系统的数据不是十分海量,所以选用了对系统要求不是很高而且比较易用的SQL Server 2000,同时可以使用ADO.NET更方便地编写程序。在SQL Server 2000中新建一个名为WorkWF的数据库专门存放该系统所要用到的数据,并新添加一个名为WorkWF的用户只能访问这个数据库,从而减少数据库的风险。

第3章 系统设计

3.1 系统的数据库设计

数据库的设计是一个MIS系统中至关重要的部分,良好的数据库设计是一个系统成功设计并实现的先决条件。如果数据库设计得不好,系统可能会不稳定,而数据库的修改可能会造成整个系统都要推倒重新编写。可见数据库的设计是至关重要的。一般要求数据库中的关系模式都达到第三范式(3NF)。而存储过程、触发器也是一个基于SQL Server 2000的数据库中不可缺少的部分。 3.1.1 数据流图

数据流图是一种图形化技术,它描绘信息流和数据从输入移动到输出过程中所经受的变换。在数据流图中没有任何具体的物理元素,它只是描绘信息在软件中流动和被处理的情况。因为数据流图是系统逻辑功能的图形表示,即使不是专业的计算机技术人员也容易理解它,所以是分析员与用户之间极好的通信工具。

本系统的主要数据流图如图3.1和图3.2。

图3.1 学生相关的数据流图

图3.2 管理员相关的数据流图

3.1.2 数据字典

为了使各数据流,数据处理过程,存储过程能反映其中的数据层,数据项目,数据特性,所以用数据字典来对数据流图中的各成份进行具体的定义,为系统的分析,设计及以后的实现提供有关元素一致性定义和详细的描述。数据字典是为了描述在结构化分析过程中定义的对象内容而使用的一种半形式化的工具,是描述数据的信息的集合,是对系统中使用的所有数据元素的定义的集合。

该系统的主要数据字典如表3.1、表3.2及表3.3所示:

表3.1 系统的数据流说明

表3.2 系统的数据流构成

注:一个汉字相当于两个字符。还有其他数据项在后面的表设计中详细说明。 3.1.3 系统的主要E-R图

实体—关系(E-R)数据模型基于对现实世界的这样一种认识:现实世界由一组称为实体的基本对象以及这些对象间的联系构成。实体是现实世界中可区别于其他对象的一个“事件”或一个“物体”。

该数据库的主要E-R图如图3.3所示。

图3.3 数据库设计的主要E-R图

为了节省篇幅,实体与属性的关系没有用图形表示,每个实体定义的属性如下: 院系:{ 院系简写,院系名称,院系负责人,院系办公电话} 学生:{ 学号,学生姓名,性别,年龄,登录密码}

教师:{ 教师编号,教师姓名,教师职称,教师性别,教师年龄}

课程:{ 课程编号,课程名称,学时,课程容量,已选人数,开课周次,上课时间,上课教室,备注信息}

因为每个课程只有一个确定的任课老师,所以把任课老师作为课程的一个属性来存储,也不会出现冗余的现象,而且比较简单,查询信息的时候也避免了大量的自然连接操作,可以提高系统的性能。可是这样的话老师和课程的关系就隐含在属性中,不是那么明显。从数据库模式设计上来说,更好的方法是把课程和任课教师的联系作为一个新的关系模式,而不是把教师作为课程的属性,这样即使一个课程有多个老师也可以表示,但是由于要多一个表,会多使用一定的存储空间。在这里使用了比较简单的方法。

3.1.4 模式图(shema diagram)

一个含有主码和外码依赖的数据库模式可以用模式图来表示,可以直观地展示出数据库各个表之间的外码依赖。该数据库的模式图如图3.4。

Student

SCCourse

图3.4 数据库设计模式图

3.1.5 表的设计

表的设计又是数据库设计中最重要的部分,因为它决定了数据库的关系模式能达到哪个范式,是否会出现数据冗余的现象,是否存在数据不一致的风险,是否能达到实体完整性、数据完整性和用户定义完整性的要求。

在这个系统中,最重要的是表有4个,包括学生信息表,教师信息表,课程信息表和选课信息表。其中选课信息表是最经常存取的表,因为学生要选课、取消选课或查询自己的选课信息。学生信息表要包含学生的个人信息,还要包含登录选课系统的密码。教师信息表含有教师的信息。课程信息表包含了所有课程信息,而每个课程要有一个老师来上课(在本校的公选课里,每个公选课都有一个课程编号,对应一个任课老师,不同时间的相同课程的课程编号也不一样。所以可以认为每个课程编号只对应一个教师。而且通常情况下,课程编号不同的名称相同的课程也是由同一个老师来上的),所以这个表里有一个属性是教师编号,而教师编号是教师表的主码。选课表保存学生的选课信息。还有一个管理员表和院系信息表,其中管理员表用来记录管理员的基本信息及登录密码,院系信息表用来存储院系信息,而学生和教师都只属于某个特定院系,所以学生表和教师表都有一个“院系编号”的属性,而“院系编号”是院系信息表的主码。

各个表的具体设计如下:

(1) 院系信息表(Department):这个表用来保存全校各个院系的信息,包括院系简写(dno),院系名称(dname),院系负责人(dmaster)和院系办公室电话(dtel)。一般情况下,每个院系有一个负责人,有一个办公电话。所以简单地这样设计这个表,当然实际情况中还应该有更多的属性。这个系统中只是为了说明学生和教师所在院系才引入这个表的。这个表的各属性详细信息如表3.4。

表3.4 表Department的详细说明

(2)学生信息表(Student):这个表用来保存所有学生的信息,包括学生学号(sno),学生姓名(sname),学生所在院系(sdept),学生性别(ssex),学生年龄(sage)和学生登录密码(spwd)。学生学号是主码,唯一标识一个学生。学生性别只能为m(male)或f(female),学生年龄要在10岁和40岁之间。为了实际需要,所有项均不可以为空;学生登录密码初始为“8888”,可由学生以后自行更改。学生所在院系(sdept)为外码,引用表Department的dno属性。这个表的各属性详细信息如表3.5。

(3)教师信息表(Teacher);这个表用来保存全校教师的信息,包括教师编号(tno),教师姓名(tname),教师所在院系(tdept),教师职称(ttitle),教师性别(tsex)和教师年龄(tage)。教师编号是主码,唯一标识一个教师。教师职称为“教授”、“副教授”、“讲师”等有实际意义的字符串,教师性别只能为m(male)或f(female),教师年龄要在

20岁和80岁之间。为了实际需要,所有项均不可以为空。教师所在院系(sdept)为外码,引用表Department的dno属性。这个表的各属性详细信息如表3.6。

表3.6 表Teacher的详细说明

(4)课程信息表(Course):这个表保存着所有课程的信息,包括课程编号(cno),课程名称(cname),任课老师编号(ctno),课程学时(cperiod),课堂容量(ccapacity),课程的已报名人数(cnumber),课程的开课周次(cweeks),课程的开课时间(ctime),课程所在教室(croom),课程信息备注(cremark)。课程编号是主码,唯一标识一个课程,同一个名称的课可以有不同的课程编号,认为是不同的课。课程学时为课程所对应的课堂节数,而16个学时对应一个课程学分。因为一般来说课程只有1学分,1.5学分,2学分和4学分这四种,所以学时只能在16和64之间,学分只能在1和4之间。而控制课程学时只能出现16,24,32和64这四种则需要在程序中进行限制(使用Dropdownlist控件而不是使用文本框TextBox,限制可以输入的内容)。输入课程信息时只用给出课程学时即可,学分在查询时自行算出。如果把学分当成这个表的一个属性,则学时决定学分,存在传递依赖,不符合第三范式。关于范式的具体论述见3.1.6节。

表3.7 表Course的详细说明

(5)选课信息表(SC):这个表存放所有的学生的选课信息,是这个系统中最常访问的表。该表包括学生学号(sno),课程编号(cno)和分数(mark)。其中学生学号和课程编号构成主码,也都是外码,分别引用了Student表的sno和Course表的cno。分数(mark)则标识该选课的得分,默认为-1。在学期结束的时候,会有相应的分数,最低为0,最高为100。通过分数可以判定课程是该学期选的还是以前就选了并且通过的。所有分数为-1的课程为该学期所选,并通过相应手段控制一个学期最多选2门。这个表的各属性详细信息如表3.8。

表3.8 表SC的详细说明

(6)管理员信息表(Admin):存放管理员信息,包括管理员编号(ano),管理员名称(aname),管理员电话(dtel),管理员密码(apwd)。其中管理员编号为主码,唯一标识一个管理员,管理员密码用来管理员登录时的身份验证。这个表的各属性详细信息如表3.9。

表3.9 表Admin的详细说明

3.1.6 数据库模式所达到的范式分析

一般而言,关系数据库设计的目标是生成一组关系模式,使之既不必存储不必要的重复信息,又可以方便地获取信息。所以要设计满足适当范式的模式。如果达到了第三范式(3NF),就可以比较好地实现无冗余并不会出现更新或删除错误,不容易出现数据不一致的情况。下面讨论一下本系统所设计的数据库达到了哪个范式。

先分析比较简单的Admin表和Department表,显然Admin表里管理员编号(ano)是主码,直接决定了其他三个属性管理员姓名(aname)、管理员电话(atel)和管理员

密码(apwd),没有部分函数依赖和传递函数依赖,符合第三范式;Department表和Admin表差不多,院系简写(dno)直接决定了其他三个属性院系名称(dname)、院系负责人(dmaster)和院系电话(dtel),符合第三范式。

表Student、表Teacher和表Course相对于先前分析的两个表来说,都多了一个外码。Student和Teacher的所在院系都为Department的主码,Course的任课老师为Teacher的主码。但是这三个表同样都是主码直接决定其他属性,不存在部分函数依赖和传递函数依赖,同样符合第三范式。表SC为选课信息表,它由学生学号sno和课程编号cno共同组成主码,而这两个又都是外码,主码能直接确定其他两个属性,不存在部分函数依赖和传递函数依赖,符合第三范式。

如果把学分设计成Course表的一个属性,则学时决定学分,存在传递函数依赖,不符合第三范式。故不把学分设计成Course表的属性,而是在查询数据库时通过学时把学分计算出来展示给用户。这样Course表中就不存传递函数依赖,符合第三范式。

综上,该数据库模式符合第三范式(3NF)。 3.1.7 触发器的设计

触发器是一系列SQL语句的集合,当对数据库作修改时,它自动被执行。数据库就像存储普通数据一样存储触发器,所以它们被永久保存,也可以被所有的数据库操作访问。一旦把一个触发器输入数据库,只要指定的事情发生,相应的条件被满足,数据库系统就有责任去执行它。

触发器可以帮助用户做许多很有用的事情,使用户要进行的操作更加简化,同时还可以避免某些数据不一致的情况。

在这个系统所用的数据库中,就是为了简化操作、避免数据不一致而使用了触发器。 在SC表中如果要插入一行的话,就表示某个学生选取了一门选课。那么这个时候对应的课程的已选人数(cnumber)会加一,留给其他学生的位置变少。这时考虑可以使用触发器实现这个功能:在SC表中建立一个触发器,每当插入一行的时候就触发,这个触发器的作用就是把SC表中增加的这行里对应的课程编号的已选人数(cnumber)在Course表中加一,这样简化了操作,只要在SC中插入一行即可,不用同时考虑Course表的相关动作。

下面是这个触发器的代码:

-- ==================================================== -- 建立触发器

-- ==================================================== Create Trigger DelSCTrigger On SC

After Delete As

Set nocount on Declare @cno char(7) Select @cno=cno From inserted Update Course

Set cnumber=cnumber+1 where cno=@cno go

这个触发器在从SC表中插入一行时被激发。它首先定义变量@cno,它的数据类型和长度必须与Course表的cno(课程编号)一致。然后它通过“Select @cno=cno From inserted”读入插入行的课程编号(cno)并存入已经定义好的变量@cno中备用。最后,它通过这个课程编号(@cno)找到Course表中的相应行,对它的已选人数(cnumber)进行加一操作。

这个触发器逻辑清楚,功能简单但是实用,在SC表中插入新行的时候,不用再考虑Course表的相应操作,使用简单,同时避免了潜在的数据不一致的情况,增加了系统的可靠性。

在从SC表中删除某一行的时候也会遇到类似问题,因此定义一个类似的触发器DelSCTrigger来完成在Course表中对应课程的已选人数(cnumber)减一的做操,因为与上面的触发器类似,在此不再赘述。

在数据库中,触发器有着很大的作用。这个系统中的数据库设计比较简单,只在这两个个地方使用了触发器。在复杂的数据库模式中,触发器的作用更加强大。可惜一些数据库管理系统不支持触发器,使得这个工具不能随时随地发挥作用。MS SQL Server 2000对触发器及存储过程的支持非常好,这也是选用它作为数据库的一个重要原因。 3.1.8 存储过程的设计

在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。

存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,完成某一个特定的功能,经编译后存储在数据库中。它就像是编程语言中的函数,事先定义好函

数以后,在需要使用的时候只要调用一下就能完成需要的工作。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程有许多优点:

(1) 存储过程允许标准组件式编程存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为应用程序源代码只包含存储过程的调用语句),从而极大地提高了程序的可移植性。

(2)存储过程能够实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。

(3) 存储过程能够减少网络流量。对于同一个针对数据库对象的操作(如查询、修改),如果这一操作所涉及到的Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条SQL 语句,可见存储过程可以有效提高网络性能。

(4) 存储过程可被作为一种安全机制来充分利用系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。

由于存储过程有以上诸多优点,所以在这个系统中,几乎所有的功能都是用存储过程来实现,在程序中直接调用存储过程并通过存储过程的返回值来确定执行后的状态。

大量使用存储过程是这个系统的一大特点。数据库设计中一共编写了16个存储过程,分别如下。

AddStudent:增加一个学生信息;

AddTeacher:增加一个教师信息;

AddCourse:增加课程信息;

AddSC:增加学生选课信息;

DeleteStudent:删除一个学生信息;

网上选课系统需求分析 网上选课系统

DeleteTeacher:删除一个教师信息;

DeleteCourse:删除课程信息;

DeleteSC:删除学生选课信息(取消选课);

EditStudent:编辑修改学生信息;

EditTeacher:编辑修改教师信息;

EditCourse:编辑修改课程信息;

StudentLogIn:学生登录时验证学生身份;

AdminLogIn:管理员登录时验证管理员身份;

ChangeStudentPwd:学生登录后修改登录密码;

ChangeAdminPwd:管理员登录后修改密码;

InitStudentPwd:管理员登录后对特定学生的密码进行初始化,用于学生忘记个人登录密码的情况。

以上的16个存储过程几乎完成了该系统中所有的功能。而且几乎每个存储过程都会验证作为参数输入的学号或教师编号或课程编号是否存在,并以特定的返回值来标识不存在的情况。所以这些存储过程同样可以用来判断学号等是否存在。

对于院系信息的输入和管理员信息的添加,因为系统要完成的功能中不包括对院系信息的管理,所以默认院系信息在数据库中已经存在。而管理员的信息应该由DBA在查询分析器中用SQL语句输入。

下面以AddSC和DeleteTeacher为例来说明一下存储过程的设计思想和运行逻辑: Create Procedure AddSC

@sno char(12),

@cno char(7)

AS

Declare @IsSnoExist int

Declare @IsCnoExist int

Declare @CourseNum int

Declare @IsSelected int

Select @IsSnoExist=Count(*)

From Student

Where sno=@sno

if(@IsSnoExist=0)

begin

print '学号不存在'

return 1

end

Select @IsCnoExist=Count(*)

From Course

Where cno=@cno

if(@IsCnoExist=0)

begin

print '课程编号不存在'

return 2

end

Select @IsSelected=Count(*)

From SC

Where sno=@sno and cno=@cno

if(@IsSelected=1)

begin

print '您已经选过该课程'

return 3

end

Select @CourseNum=Count(*)

From SC

where sno=@sno and IsPassed='n'

if(@CourseNum=2)

begin

print '您在该学期已经选了两门课程,最多只能选两门'

return 4

end

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Begin transaction

Select * From Course with(rowlock) Where cno=@cno

if((select cnumber from Course where cno=@cno)>=

(select ccapacity from Course where cno=@cno))

begin

print '该课程人数已满'

Rollback

return 5

end

else

begin

insert into SC(sno,cno) values (@sno,@cno)

-- 增加延时用于测试

-- waitfor delay '00:00:10'

Commit transaction

return 0

end

go

要增加学生选课信息,首先要先验证学生学号是否存在,再验证课程编号是否存在,再验证该学生是否修了这门课,接着验证该学生是否已经选了两门课(按规定一个学期最多只能选两门课),最后验证该课程是否人数已满。如果都符合则把该课程作为该学生的课程写入SC表,有一个不符合则通过返回值返回出错的地方。这个存储过程条理清楚,逻辑明了。尽管学号不存在和课程编号不存在的可能性非常小(只有学生已经登录,然后管理员删除了该学生信息才可能出现学号不存在的情况),可是为了增强程序的健壮性,以防万一,还是把它写了进去。

这里还涉及到一个加锁的问题。这是一个并发系统,很有可能很多同学同一时间一起选课。为了防止读取数据的情况,在一个学生选某门课的时候,其他的不能读该课程的已选人数。只有该同学选课完毕,才释放该课程,其他同学可以查看和选课。否则可能会出现某门课只有一个名额了,而两个同学同时读到该课程还可以选择,同时选择则会出现数据不一致的情况。存储过程中的时延是为了测试加锁的效果。测试完毕后就将延时语句注释掉。

Create Procedure DeleteTeacher

@tno char(6)

AS

Declare @IsTnoExist int

Select @IsTnoExist=count(*)

From Teacher

Where tno=@tno

if(@IsTnoExist=0)

begin

print '该教师编号不存在,请查对!'

return 1 end else begin

delete from SC where cno in (select cno from Course where ctno=@tno) delete from Course where ctno=@tno delete from Teacher where tno=@tno print '成功删除教师信息' return 0 end go

删除教师信息的存储过程和前一个存储过程逻辑类似,不同的是因为Teacher的tno是Course的外码,而Course的cno是SC的外码,故删除教师信息之前要先删除与该教师有关的课程,而删除课程之前要先删除选课表中与该课程有关的选课。删除教师信息是一个非常危险的动作,所以在程序中,执行该动作前要经过确认。 3.1.9 数据库备份与还原

本来的想法是在浏览器上经过点击某个按钮来完成数据库的备份与还原,但是经过测试总是无法完成还原,因为数据库正在使用。因为要执行SQL语句就要连接数据库,不断开连接又不能执行还原。所以把备份和还原过程写成了两个脚本Backup Database.sql和Restore Database.sql,管理员只要在查询分析器中运行脚本即可。同时注意到只要有人连接到数据库就不能完成数据库还原的操作,所以要先将网站关闭才可以进行还原。

3.2 系统功能设计

系统共有两个大的模块,分别为学生使用的模块和管理员使用的模块。学生登录后可以进行选课、取消选课、查询已选课程和修改个人登录密码等操作。管理员登录后可以进行学生信息管理、教师信息管理、课程信息管理和密码管理等操作。对于管理员来说,每个管理员在同一时间只能登录一次,学生登录则不受此限制。系统的功能模块图如图3.5。

图3.5 系统功能模块图

3.2.1 学生模块

学生模块是学生登录后使用的模块,有4个功能,分别是选课操作,取消选课,查选选课信息和修改个人登录密码。选课操作是这个系统最经常进行的操作,是系统的瓶颈,最能体现对系统性能的要求,提高该部分的性能可以大大提高整个系统的性能。取消选课是将已经选上的课程取消,有些同学选错了课程可以用这个取消选课的功能来更正。当然这也会留下安全隐患,如有的同学在机房或网吧上网,离开电脑的时候忘了注销登录,则会给其他人留下可乘之机,如被其他人恶意取消选课(也许是那个人想选这个课,而这个课的人数已满),但是为了系统功能的完整还是把这个功能做了出来,希望使用该选课系统的同学能够注意离开的时候注销。修改密码可以修改用来登录的密码,初始密码都是“8888”,同学们上网以后要尽快修改密码,以防有人用自己的帐号登录后进行恶意操作。修改密码的时候需要输入原来的密码以确认身份,还要两次输入新密码,以防按键错误输错想要的密码。如果忘记了密码,可以凭学号和姓名让管理员将自己的密码恢复到初始设置。 3.2.2 管理员模块

管理员模块为管理员所使用,包含学生信息管理、教师信息管理、课程信息管理和

密码管理四个子模块,前三个字模块分别可以进行学生信息、教师信息和课程信息的增删改查,密码管理模块可以修改管理员自己的登录密码,也可以根据学生提供的学号和姓名来进行学生密码初始化,以应对学生忘记密码的情况。管理员在同一时间只能登录一次,离开时要注销登录才可以在下次正常登录。如果忘了注销登录而直接关闭了窗口,则要等20分钟后Session过了有效期才可以再次登录。不过管理员都是经过培训的,应该会知道各个要注意的地方。

3.3 输入输出与报表设计

3.3.1 学生用户界面

在这个选课系统中,学生用户的输入只是点击鼠标进行选课,取消选课等操作,只有登录和修改密码的时候需要用键盘输入,而学生看到的课程信息和已选课程信息都是由一个分页的DataGrid绑定按钮列来展示,并通过按钮可以选课或取消选课。在主页面上有可以到达各个功能页面的超级链接及提示信息,如图3.6所示。选课界面如图3.7所示。

图3.6 学生用户的主界面图 3.7 学生用户的选课界面

3.3.2 管理员界面

图3.8 管理员界面

由于管理员所能进行的操作比学生用户多得多,再用一个主页面上有多个超级链接来达到多个功能页面会显得很杂乱无章且逻辑混乱。于是想到要使用一个类似白云黄鹤的左边导航栏的效果,这样使界面漂亮整洁,逻辑清晰。这里使用一个frameset将网页分为左右两栏,左边存放作为导航用的树型目录,右边显示相应的页面。增加课程信息、学生信息或教师信息学要用键盘输入,输入空间多为Textbox和Dropdownlist,且尽量用Dropdownlist,以减少输入错误数据的可能性,同时对每个Textbox都添加一个验证控件,有的使用非空验证控件,有的使用正则式验证控件,进一步规范管理员的输入,减少出错可能。在查看课程信息、学生信息或教师信息的时候,同样采用绑定了按钮列的分页DataGrid来展示信息,并通过相应按钮进行编辑或删除等操作。在显示学生信息和显示教师信息的页面中,因为整个学校学生和老师都很多,所以通过一个Dropdownlist选择所要显示的学生或老师所在的学院,并且可以直接输入学号或教师编号查询,方便了操作。在点击“删除”按钮的同时,为了减少因为误操作带来的损失,此时会弹出一个对话框要求再次确认删除,只有再确认了才能删除,否则取消操作。管理员进入“学生密码初始化”功能后,只有同时提供学号和姓名才能对学生密码进行初始化,以防止有的人恶意冒充别人。

第4章 系统实现

整个系统使用ASP.NET(C#)作为编程语言,在一些必要的时候使用了少量Jscript来完成ASP.NET无法完成的功能。下面具体讲述一下整个系统的实现细节。

4.1 网页设计

这个系统的所有网页均在Visual Studio.NET集成环境中设计,没有使用DreamWaver等界面设计软件,主要考虑到该系统最重视的应该是性能,而不是外表,毕竟不同于商用系统要靠外表吸引用户,选课系统是固定用户一定会使用的,而且并发量很大,要首先考虑性能。以后要对如何把网页设计得更漂亮进行进一步学习,毕竟商用网站还是更常见一点。

该系统里网页的风格是简洁明朗,毕竟是个选课系统,只要能达到选课的目的,一眼能看出来该怎么选课就可以,没有太多华丽的装饰。整个系统只用了一个图片,还是本校的校徽,说明是本校的选课系统。太多的图片会使网页的打开速度过慢,影响性能。

4.1.1 学生页面设计

学生登录后能使用的功能只有4个,分别是选课、取消选课、查询选课信息和修改个人密码,功能页面不多,将连接到这4个功能页面的超级链接放在登陆后的主页面上一目了然,进入相应页面也很容易。学生登陆后的主页面在图3.6中已经给出,其上有提示信息,还在靠上的位置显示当前的学生用户的学号和姓名信息,给人带来亲切感。选课页面也由图3.7给出,其中课程信息从数据库查询出来后绑定在一个DataGrid上显示出来。具体如何绑定在4.2节讨论。同时这个DataGrid上绑定一列按钮列,通过点击按钮来对相应行进行选课操作,而选课操作是通过传递参数给存储过程并返回特定的值来完成的,通过返回值可以看出选课成功与否并再把选课结果通过弹出框的形式返回给用户。

按钮列的绑定过程如下:在DataGrid上点右键,选择“属性生成器”进入属性编辑页面,然后点左边的“列”按钮,在“列列表”的“可用列”里选中“按钮列”,点击向右的箭头添加到“选定的列”,选定新添加的项,填写各项属性,如图4.1。其中“页眉文本”是要显示在页眉中的文字,“文本”是显示在绑定列中的按钮文字,“命令名”则在对该按钮添加点击事件时来标识这个按钮。然后点击“确定”回到VS.NET设计页面,点DataGrid,在右下脚的属性栏点击闪电图标,调出各个事件属性,然后双击ItemCommand事件编辑即可,如图4.2。

图4.1 DataGrid属性生成器

图4.2 DataGrid属性

双击ItemCommand后会定位到函数DataGrid1_ItemCommand中,在其代码中输入if(e.CommandName=="SelectCourse"){??}即可,大括号里编写点击按钮要进行的相应操作即可,“SelectCourse”即为当时定义的命令名,如果有两列以上的按钮列,可以通过“命令名”来识别点击了哪个按钮列的按钮。如何具体将各参数传回用存储过程处理留待4.2节讨论。

4.1.2 管理员页面设计

因为管理员所要进行的操作较多,用一个树型导航栏来导航会使操作轻松并且条理清楚。管理员页面里的DataGrid绑定按钮列和在学生页面中的一样,在此不再赘述。不同的是有些DataGrid需要绑定两个按钮列,分别是编辑相应行和删除相应行的信息,这时需要给不同的列定义不同的“命令名”,在ItemCommand通过不同的命令名来识别不同按钮列的点击事件;同时,由于删除按钮是很危险的,容易误点,所以要加入一个要求用户确认删除的弹出对话框。只要在相应列的“文本”里输入如下内容:<div id="de" onclick="JavaScript:return confirm('确定删除该学生吗?')">删除</div> 即可实现删除的时候弹出提示框。这是一个JavaScript,在这里和ASP.NET结合很好的解决了问题。从这点可以看出,ASP.NET还是无法完成JavaScript的所有功能。

管理员页面的主要特点是使用了导航栏,这个树型导航栏是用了微软的TreeView控件。这个控件在该系统开发使用的VS2003中没有附带,需要到微软的网站去下载,然后安装后就可以了。具体安装过程可以到网上查找。安装好以后,新建一个Frameset,分为左右两边,左边名称为“Content”,右边名称为“Main”,其定义为:

<frameset cols="170,78%"> <frame name="contents" src="AdminMainxxx.aspx"> <frame name="main" src="AdminEditCourse.aspx">

然后把TreeView控件拖到一个空白页面AdminMainxxx.aspx中,在属性的“Nodes”中加入各个要导航的名称和要导航到的页面。导航的名称为树型导航栏显示的名称,要导航的页面链接(NavigateUrl)是要在右边显示的相应页面,Target是要显示这个页面的位置,写为“main”,因为这个frameset的右半边的名字就是“main”。如图4.3。

编辑完treeview的Nodes属性后,这个有frameset和树型导航栏的页面就做好了。效果如图3.8。确实感觉到VS.NET功能强大。

图4.3 TreeView的Nodes属性

4.1.3 网页身份认证设计

一个选课系统虽然其安全性没有其他商用系统重要,但是也不能太不重视其安全性造成任何人都很容易访问到不该他访问的资源。曾经看到一个报道说某商业网站把用户名称直接写到网页url的参数中,任何人都可以直接通过url访问任何用户的页面,造成了很大损失。在这个系统中,没有使用url中带参数的方法,也没有使用cookie,因为考虑到选课就那一次,不会像CSDN那样天天都去登录,做到cookie里会增加风险。所有的用户信息都存放在Session里,这样可以把用户信息保存在服务器上,比较安全。

因为这个系统都是通过超级链接从一个网页链接到另一个网页的,如果不通过前一个页面而直接输入要访问的页面url则可能会有问题,比如说不登录直接输入选课页面的url会如何?所以在每个页面都写了一个isPageValid()函数来判断该网页是不是正常合法进入的,合法进入的话Session中会保存用户的信息,否则相应的Session变量为空。在Page_Load

函数中执行该判断,如果是合法的就继续下面的工作,不合法就重定

向到登录页面让其登录。这样可以防止非法用户访问或修改数据。

在两种情况下,都会通过isPageValid()的判定将页面重定向到登录页面,分别是:

(1)直接输入不登录则不能访问的url。

(2)在页面中停留时间过长,又没有任何鼠标和键盘动作,Session在20分钟后过期,此时再刷新页面则会通过isPageValid()判定Session为空,认为是非法进入。

但是在管理员页面中,因为使用了FrameSet,页面分为左右两个,分别对应不同的aspx页面,而两个页面中又都会使用isPageValid()函数来判断用户是否合法,不合法的话就重定向到登录页面,则会出现登录页面在FrameSet的左右两部分中分别显示的情况,提醒登录的弹出对话框也会出现两次。解决这个问题的方法是在登录页面的HTML代码中加入JavaScript脚本,使登录页面不会出现在框架中,只要框架中的某一部分是登录页面则在整个窗口显示,不显示框架。其代码加在登录页面的<Head>和</Head>之间,具体代码如下:

<Script LANGUAGE="JavaScript">

//使页面不会出现在框架中 if(self!=top) { } top.location=self.location;

</Script>

在该系统中,管理员使用管理员编号和密码进行身份验证和登录。为了安全性起见,每个管理员编号在任意时刻只能登录一次,不能重复登录。具体解决方法是:

步骤1:在Application_Start事件中,加入下列代码,以建立一个应用程序级的登表。每个登录的管理员编号都保存在这个表中。

DataTable DT=new DataTable();

DT.Columns.Add("UID",typeof(string));

DataColumn[] PK=new DataColumn[1];

PK[0]=DT.Columns["UID"];

DT.PrimaryKey=PK;

Application["DT"]=DT;

步骤2:在用户登录页面中(也可以Session_Start事件中)加入下列代码,判断用户是否在线,如果在线就不允许登录,不在线就将用户ID写入登录表。如果登录表中为空,当前登录用户肯定不在线,直接允许登录,并把该管理员编号写入登陆表;如果登陆表非空,就要遍历登陆表,看当前要登录的管理员标号在不在登陆表中,在则弹出提示框,不允许登录,否则允许登录并把登录的管理员编号记录到登陆表中。

if((int)mySqlCommand.Parameters["@returnValue"].Value == 0) { //查看该管理员是否已经登录 if(((DataTable)Application["DT"]).Rows.Count>0) { if(((DataTable)Application["DT"]).Rows.Contains(TextBox1.Text.Trim()))

{

Response.Write("<script>alert('对不起,已登录!');</script>");

return;

}

else

{

Session["Ano"]=TextBox1.Text.ToString();

Application.Lock();

DataRow Row=((DataTable)Application["DT"]).NewRow();

Row["UID"]=(string)Session["ano"];

((DataTable)Application["DT"]).Rows.Add(Row);

Application.UnLock();

Response.Write("<script>alert('登录成

');window.navigate('AdminMain.htm')</script>");

}

}

else

{

Session["Ano"]=TextBox1.Text.ToString();

Application.Lock();

DataRow Row=((DataTable)Application["DT"]).NewRow();

Row["UID"]=(string)Session["ano"];

((DataTable)Application["DT"]).Rows.Add(Row);

Application.UnLock();

Response.Write("<script>alert('登录成

');window.navigate('AdminMain.htm')</script>");

}

}

功!功!

步骤3:在Session_End事件中,注销用户。当然Session_End事件是在会话结束时执行的,如果点击页面的注销按钮,则通过代码直接结束会话,否则如果通过关闭浏览器的方法关闭页面的话则会话不会马上结束,只有到Session超过了有效期会话才结束。在会话结束之前,相应的管理员是不能登录的,因为系统认为他在线,不能再次登录。

Application.Lock();

for(int i=0;i<((DataTable)Application["DT"]).Rows.Count;i++){

DataRow Row=((DataTable)Application["DT"]).Rows[i];

if(Row["UID"].ToString()==Session["uid"].ToString())

{

Row.Delete();

}

}

Application.UnLock();

该方法通过保存一个已登录用户的表来确定用户是否登录,并限制已登录的用户不可以再次登录。这也是实现在线统计的好方法,以后如果遇到要统计网站在线情况的问题可以用类似的方法实现。

通过以上努力,可以增加网站的安全性,保护网站资源不被非法用户浏览,保证用户的数据不被非法修改。

4.2 连接数据库的相关设计

连接数据库并进行数据读写是动态网页中一定会经常用到的操作,是整个系统的核心。这一部分介绍了如何存储连接字符串,如何访问数据库,如何将数据绑定到DataGrid并在网页中展示给用户等问题

4.2.1 连接字符串相关问题

要连接数据库,肯定要使用连接字符串。现在的问题是连接字符串放在哪里,要不要加密。

以前做简单的程序,连接字符串都直接放在程序里,那样的话很方便,但是每次连接数据库都要写一次连接字符串,很繁琐,而且如果数据库信息更改了则要改连接字符串,需要改源代码的每个连接字符串并重新编译,可见有多么麻烦。所以这个系统中根本没有使用这种方法。

有些书籍上讲述的是把连接字符串放在了Global.asax中,在Application_Strat(){}里记录连接字符串myConnStr,然后在页面中可以用(string)(Application[“myConnStr”])把连接字符串取出来。这样的做法虽然避免了多次记录连接字符串,但是对于数据库信

息改变的情况依然无法很好地应对,需要在源程序里改,而且要重新编译,因为Global.asax是不会和网页一起发布的,所以认为它应该算是源代码。

有些参考书中把连接字符串放在web.config里,既避免了多次记录,又可以随时更改随时使用,不用重新编译。但是这样如果明文存储,会泄漏数据库的用户名和密码,不是很安全。MD5编码虽然保密性好,但是效率不是很高。最后使用Base64对连接字符串进行编码,然后使用的时候进行解码即可。如果每次都解码,显然效率不会很高,而连接数据库又是非常频繁的动作,极大降低效率。所以在Global.asax的Application_Start里进行解码,然后储存在那里,在程序中直接使用(string)(Application[“sqlConnectionString”])。这样每次网站启动的时候对连接字符串进行解码,然后就一直可以使用,直到网站停止,下次启动再次解码。既有保密性,又比较高效。具体做法如下:

(1)在web.config中增加如下内容:

<appSettings>

<add key="sqlConnectionString" value="……"/> </appSettings>

其中value的内容就是经过base64编码的连接字符串。

(2)在Global.asax中的Application_Start函数里增加如下代码:

Application["sqlConnectionString"]=

Encoding.Unicode.GetString(Convert.FromBase64String

(System.Configuration.ConfigurationSettings.AppSettings["sqlConnectionString"]));

这样Application["sqlConnectionString"]存放的就是解码后的连接字符串。

(3)在程序中使用(string)(Application[“sqlConnectionString”])即可,这就是明文的连接字符串。

在这个系统中设计了一个页面“Generator.aspx”专门用来对字符串进行Base64编码(如图4.4),DBA可以使用这个页面将新的连接字符串进行Base64编码,然后复制到Web.config里即可。对字符串进行Base64编码的相关代码如下:

string str1 = "server="+TextBox1.Text+";uid="+TextBox3.Text

+";pwd="+TextBox4.Text+";database="+TextBox5.Text; byte[] bytes = Encoding.Unicode.GetBytes(str1); string str2 = Convert.ToBase64String(bytes); TextBox2.Text=str2;

对数据库连接字符串的加密,保护了数据库的安全性,而这也是在不怎么影响系统性能的前提下进行的。对用户密码没有进行加密,主要考虑到这不是商用系统,没有敏

感数据,加密反而会影响性能。以后如果要做商用系统,则一定要对用户密码进行加密。

图4.4 进行Base64编码的页面Generator.aspx

4.2.2 绑定数据库数据的相关设计

将数据库中的数据绑定到页面的DataGrid中展示出来,并通过用户点击绑定列的按钮执行相应的操作,是这个系统的核心功能。下面来说明一下如何将数据绑定到DataGrid,如何将参数通过存储过程传回数据库执行后通过返回值来反映执行的结果。

首先,页面中应该有一个DataGrid1,以学生选课的页面的DataGrid为例,通过下面的代码将数据库中的课程信息绑定到DataGrid1:

//读取学生学号信息

string sno = (string)Session["sno"];

//读取连接字符串

string ConnStr = (string)Application["sqlConnectionString"];

SqlConnection mySqlConnection = new SqlConnection(ConnStr);

//用来读取课程信息的mySqlCommand1

string mySelectQuery="select cno '课程代码',cname '课程名称',cperiod '总学时', “+

“'学分'= cast(cperiod/16.0 as numeric(2,1)) “

+

“, tname '任课教师',ccapacity '课堂容量',cnumber '已报名',cweeks '周次'”+

“,ctime '时间', croom '上课地点',cremark '备注' “+

“from Course,Teacher where Course.ctno=Teacher.tno";

SqlCommand mySqlCommand1 = new SqlCommand(mySelectQuery,mySqlConnection); //打开数据库连接 mySqlConnection.Open();

//读取课程信息,在页面的DataGrid中显示

SqlDataAdapter Adapter = new SqlDataAdapter(); Adapter.SelectCommand=mySqlCommand1; DataSet myDs = new DataSet(); Adapter.Fill(myDs,"Course");

//关闭数据库连接

mySqlConnection.Close();

//将读到的课程信息绑定到DataGrid1

DataGrid1.DataSource=myDs.Tables[0].DefaultView; DataGrid1.DataBind(); DataGrid1.DataKeyField="课程代码";

其中的学分在数据库的Course表中没有直接给出来,这是为了提高系统效率,也为了使数据库模式达到第三范式。在查询语句中直接通过学时把学分算出来。使用'学分'= cast(cperiod/16.0 as numeric(2,1))这个语句将学时除以16得到学分,因为学分是浮点数,所以除以16.0。cast()函数对小数进行格式化。DataGrid1.DataKeyField="课程代码";这句是为该DataGrid定义了一个类似主码的东西,以后要引用DataGrid的相关行,通过该“主码”来引用即可,方便了DataGrid的操作。

可见,将一个数据库查询结果绑定到一个Datagird的具体过程就是先进行查询,然后用SqlDataAdapter将查询结果填充到一个DataSet里,然后把DataGrid的DataSource设置为刚才的DataSet,再运行DataGrid的DataBind()方法即可完成绑定。

下面的代码介绍如何在相应的按钮事件下,完成某项操作。以学生选课页面的选课按钮为例,代码如下:

if(e.CommandName=="SelectCourse")

{

string ConnStr = (string)Application["sqlConnectionString"]; SqlConnection mySqlConnection = new SqlConnection(ConnStr); SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText =

"Execute @returnValue = AddSC @sno,@cno"; mySqlCommand.Parameters.Add("@returnValue",SqlDbType.Int); mySqlCommand.Parameters["@returnValue"].Direction = ParameterDirection.Output; mySqlCommand.Parameters.Add("@sno",SqlDbType.NChar,12); mySqlCommand.Parameters.Add("@cno",SqlDbType.NChar,7); mySqlCommand.Parameters["@sno"].Value = (string)Session["sno"]; mySqlCommand.Parameters["@cno"].Value = (string)DataGrid1.DataKeys[(int)e.Item.ItemIndex];

try { mySqlConnection.Open(); mySqlCommand.ExecuteNonQuery(); switch((int)mySqlCommand.Parameters["@returnValue"].Value) { case 1://学号不存在(这种情况发生的可能性极小) { } case 2://课程编号不存在(这种情况发生的可能性极小) { } case 3://已经选过这个课程,不可以重复选择 { } case 4://已经选够了本学期的两门课 { Response.Write("<script>alert('您已经选过该课程!');</script>"); break; Response.Write("<script>alert('课程编号不存在,请刷新页面!');</script>"); break; Response.Write("<script>alert('学号不存在!');</script>"); break;

Response.Write("<script>alert('您在该学期已经选了两门课程,最多只能选两门!');</script>"); break;

} } case 5://对应的课程人数已满 { } case 0://选课成功 { } Response.Write("<script>alert('选课成功!');</script>"); break; Response.Write("<script>alert('该课程人数已满!');</script>"); break; Response.Write("<script>window.location.href=window.location.href;</script>");

} } catch (SqlException ex) { } finally { mySqlConnection.Close(); Response.Write("<script>alert('"+ex.Message+"');</script>");

通过存储过程很容易地执行相应操作,而且可以由返回值看出执行结果,这个系统的主要功能都是由存储过程完成的。

4.3 优化性能的相关设计

应用程序的高性能一直是程序开发人员所追求的目标。虽然硬件价格越来越低,升级硬件成为提高系统性能最直接、方便的途径。但是紧紧依靠频繁升级硬件也无法获得满意的效果。如何利用现有资源更好地提高应用程序本身的性能就成为开发人员考虑的一个关键问题。

4.3.1 使用存储在进程中的Session

Session可以存放在进程中,可以存放在状态服务器中,还可以存放在SQL Server数据库中。

将状态信息存储在进程中,则会话信息将保存在Web服务器的内存中,而不能和其他系统进行共享。这种存储方式具有最佳的性能,速度最快,不需要和其他系统通信以取得会话信息。但是这种做法放弃了会话状态信息跨越多个服务器的能力。如果需要在多个Web服务器之间维护会话信息,将使用状态服务器来对其进行存储,这将引入额外的工作负载。对于机器重要的会话信息,应该使用SQL Server存储方式,这样即使状态服务器出现异常也不会丢失会话信息。

在本系统中,对性能的要求更高一点,而且服务器只有一个,不存在多个Web服务器进行信息传递的情况,所以选择使用存放在进程中的Session,尽可能地提高系统性能。

4.3.2 数据库连接打开的时间尽可能短

要操作数据库首先要创建数据库连接,然后在操作前打开连接,最后在操作结束后关闭连接。这一系列创建数据库连接、打开连接、关闭连接的过程是非常消耗资源的,需要多次与数据库交换信息以通过身份验证。因此,经常打开、关闭数据库连接会严重影响应用程序的性能。为了解决这个问题,ASP.NET提供了连接池对数据库连接进行操作,减少频繁打开、关闭数据库对性能的影响。当开发者创建数据库连接时,系统将为其创建连接池,从连接池中返回开发者要求的数据库连接;当开发者关闭这个连接时,系统收回连接,将其放回连接池,等待下一次对连接池的请求。

但是由于连接池的大小是有限的,如果达到连接池的最大限度后继续要求创建连接,将被迫等待连接池中的空间,必然会影响性能。因此,要尽量推迟打开数据库连接的时间,在数据操作完成之后及时关闭数据库连接,减少数据库连接打开的时间。

该系统的编码中,只在要进行数据库访问之前打开连接,访问完后立即关闭,连接被放到连接池里以便其他用户使用。

4.3.3 使用带有参数的SQL命令

如果是直接生成SQL语句字符串,SQL Server需要每次对其进行编译,在性能方面表现自然不好。使用带有参数的SQL命令,SQL Server就能够只对命令编译一次,对于不同的参数重复使用,提高了性能。而且使用带有参数的SQL语句可以提高安全性,防止用户输入意料之外的数据对服务器进行攻击。

4.3.4 使用SQL Server存储过程

使用存储过程不仅可以避免对命令的多次编译,而且可以独立于程序,便于修改,不需要重新编译程序。更重要的是,使用存储过程还可以减少网络中的数据传输,进一步提高性能。

通过以上4个方面的努力,可以有效提高系统的性能。

总 结

本文主要完成了如下工作:

(1)分析了设计并实现一个网上选课系统的必要性和重要性;

(2)从解决连接数据库并和数据库中的数据进行交互的基本问题入手,讨论了如何使用ASP.NET和SQL Server 2000构建一个选课系统。

(3)在解决了诸多具体实际问题的基础上,完成了这个网上选课系统,数据库模式较合理,性能较高。

通过该毕业设计,使自己在如下方面有了明显的进步:

(1)加深了对数据库模式设计步骤的理解,增强了设计出一个良好模式的数据库的能力。通过对数据库设计过程的进一步学习,更好地掌握了设计数据库的基本步骤,并通过实践来深化对理论的理解。在数据库的设计中,曾在Course表中存在传递函数依赖,没有达到第三范式,后来经过老师的提醒进行了改进,使数据库达到了第三范式,在这里对数据库所达到的范式有了更深一层的理解,对传递函数依赖的特点及判定有了实践性的经验。

(2)进一步加深了对SQL Server 2000的了解,增强了使用Transact-SQL进行代码编写的能力,了解了触发器和存储过程的作用、好处,并亲自编写和使用存储过程及触发器,对二者的认识从理论提升到应用的高度。本系统的最大特点就是使用大量的存储过程,通过这些存储过程的编写,提高了自己使用Transact-SQL的能力,并对触发器和存储过程的有点有了切身的体会。

(3)熟练掌握了使用ASP.NET进行网页编程的技术,在程序的编写过程中遇到很多问题,并通过各种途径寻找答案解决了这些问题。对在ASP.NET中使用控件、编写事件代码、连接数据库、展示数据、弹出提示对话框或确认对话框等技术有了一定了解,可以做出比较好的页面。

(4)对JavaScript有了一定的接触和了解,不过对它的学习有待加强,因为它的很多功能是ASP.NET无法完成的。

本课题的研究虽然取得了一定的收获,但在很多方面还有待于进一步的改进和完善。如数据库的模式中,教师和课程应该作为一个关系模式来建模更好,而不是把教师作为课程的属性,这个问题发现的太晚了,没有时间去做修改,等以后有机会做类似的项目一定注意这方面的问题;学生表有点粗糙,实际应用中应包含入学时间、班号、身份证号和生源所在地等信息,以后也要精益求精。还发现自己对JavaScript了解甚少,应该多学习Jscript,它在网页设计中的作用是不可忽视的。

在ASP.NET中,使用XML存放数据是很重要的技术,也是使用得越来越广泛的技术,

被很多论坛大量使用。该系统中没有使用这个技术,因为没有这个需求,以后做类似系统的时候要尝试一下使用XML。

以后的学习之路还很长,还有很多东西要自己努力去学习。通过毕业设计对自己的学习能力有了进一步的发掘,以后还要继续这样学习下去,掌握更多的知识、技术,不断提高自己的能力。

致 谢

在论文完成之际,首先要向我的导师xxxx老师表示最真挚的谢意。

在论文写作期间,xxx给了我很多很有用的建议。

我还要特别感谢CSDN的广大.net程序员和爱好者给予了我无私的帮助,正是在他们的鼓励和帮助之下,我得以顺利完成论文。

最后要向我父母致以最诚挚的感谢,因为他们的精心培养才有我的今天,感谢他们对我的养育之恩,感谢他们一直以来对我的支持!

由于本人学识有限,加之时间仓促,文中不免有错误和待改进之处,真诚欢迎各位师长、同学提出宝贵意见。

西安培华学院本科毕业论文(设计) 网上选课系统的设计与实现

参考文献

[1] 吴晨.《ASP.NET+SQL Server数据库开发与实例》清华大学出版社 2006.7

[2] 唐植华 郭兴峰.《Asp.net 2.0动态网站开发基础教程C#2005篇》清华大学出版社,2008.6

[3] 《SQL Server 2005从入门与精通(应用技术基础)》 清华大学出版社

[4] 李晓黎 张巍.《ASP+SQL Server网络应用系统开发与实例》人民邮电出版社,2004.3

[5] 闪四清.《SQL Server 2000实用教程》人民邮电出版社, 2000.12.

[6] 金旭亮 吴彬.《网站建设教程》高等教育出版社,2003

[7] 汪晓平.钟军编,《ASP网络开发技术(第二版)》人民邮电出版社, 2003

[8] 陈俊荣等.《Asp与网络数据库技术》 中国铁道出版社,2005.8

[9] 袁鹏飞.《SQLServer2000中文版设计实务》 人民邮电出版社/旗标出版社,2001.1

[10]梁嘉超.《ASP 后台数据库网站制作实例经典》 冶金工业出版社,2001.6

[11]石志国.《ASP动态网站编程》 清华大学出版社,2001.9

41


百度搜索“爱华网”,专业资料,生活学习,尽在爱华网  

爱华网本文地址 » http://www.aihuau.com/a/392451/733515549438.html

更多阅读

二、传统的需求分析方法 软件需求分析方法

结构化的分析方法是在20世纪70年代末提出的,30多年来被广泛应用,是最经典的需求分析方法。结构化的分析方法适用于数据处理类型软件的需求分析。它提供的工具包括:数据流图、数据字典、结构化英语、判定表和判定树。系统的分析模型必须

需求分析的写法 少年闰土写法 分析

需求分析的写法- -需求分析是软件定义时期的最后一个阶段,它的基本任务是准确地回答“系统必须做什么?”这个问题。需求分析所要做的工作是深入描述软件的功能和性能,确定软件设计的限制和软件同其它系统元素的接口细节,定义软件的其它

后勤管理系统需求分析 关于医院后勤管理若干问题的分析

     随着医院的不断发展,设备规模的扩大及群众需求的变化,后勤管理工作的开展也越来越有难度。因此,给后勤工作也提出了新的要求,促使后勤工作进行改革。近年来,医院的领导和后勤管理人员一直在研究和探索后勤改革,改革的尝试在深

声明:《网上选课系统需求分析 网上选课系统》为网友茶亼六玉川分享!如侵犯到您的合法权益请联系我们删除