计算机系毕业论文(2)

学人智库 时间:2018-02-10 我要投稿
【meiwen.anslib.com - 学人智库】

  另外,数据表设计时一般都应该有一些标志字段,标志字段可以定义成CHAR(1)或BIT型。建议实际应用中定义成CHAR(1)字段可以存储多种可能的状态,在最初设计时,可能我们没有考虑到的一些情况,在程序后来的开发中,可以通过设计标志字段为不同的 值来解决,这样就避免了修改数据库结构。

  数据库初期设计时一定要谨慎,把所有可能的情况都考虑进去,即使当时没有用到,也要将它留在数据库中作为备用字段以便将来扩充。

  程序一旦开始编码,就应该尽量避免再修改数据库。因为如果数据库结构一旦改变,

  所有与修改的数据表相关的业务都有可能受到影响,而某些影响还很难看到,这样就容易形成一个恶性循环。错误越改越多,越改越乱,最终导致程序的失败。PB的数据窗口与其他语言的数据控件不一样,它的很多东西是预编译的。即使你一个模块已经调试无误,但只要数据库结构改动。相应的模块就一定要重新修改,否则一定会出问题。

  图书借阅管理系统数据库中各个表的设计结果如下面几个表格所示。每个表格表示为数据库中的一个表。

  一、 图书基本信息表(book)

  列名 数据类型 长度 允许为空

  图书编号 decimal 9 Not null

  ISBN varchar 50 Not null

  载体形式 tinyint 1 Not null

  图书名称 varchar 40 Not null

  图书语言 tinyint 1 Not null

  图书类别 int 4 Not null

  图书状态 tinyint 1 Not null

  操作员 varchar 10 Not null

  存放位置 int 4

  读者 int 4

  借出日期 smalldatetime 4

  归还日期 smalldatetime 4

  图书作者1 varchar 20

  图书作者2 varchar 20

  出版社名称 varchar 50

  出版日期 smalldatetime 4

  页数 int 4

  关键词 varchar 40

  简介 varchar 255

  等级日期 smalldatetime 4

  封面 image 16

  备注 varchar 255

  2、读者基本信息表(people)

  列名 数据类型 长度 允许为空

  编号 int 4 Not null

  姓名 varchar 10 Not null

  密码 varchar 10 Not null

  类别 int 4 Not null

  允许借书量 int 4 Not null

  已借书量 int 4 Not null

  性别 tinyint 1

  工作单位 varchar 40

  住址 varchar 40

  电话 varchar 15

  登记日期 smalldatetime 4

  照片 image 16

  备注 varchar 255

  3、图书形式基本信息表(form)

  列名 数据类型 长度 允许为空

  编号 tinyint 1 Not null

  值 varchar 10 Not null4、图书类别基本信息表(kind)

  列名 数据类型 长度 允许为空

  编号 int 4 Not null

  值 varchar 10 Not null5、图书语言基本信息表(lang)

  列名 数据类型 长度 允许为空

  编号 tinyint 1 Not null

  值 varchar 10 Not null6、图书管理员基本信息表(librarian)

  列名 数据类型 长度 允许为空

  登录名 varchar 10 Not null

  密码 varchar 10 Not null

  权限 tinyint 1 Not null

  姓名 varchar 10 Not null

  性别 tinyint 1

  出生日期 smalldatetime 4

  职务 varchar 10

  照片 image 16

  备注 varchar 255 7、图书馆地点基本信息表(place)

  列名 数据类型 长度 允许为空

  编号 int 4 Not null

  值 varchar 10 Not null8、读者种类基本信息表(readerkind)

  列名 数据类型 长度 允许为空

  编号 int 4 Not null

  值 vrchar 10 Not null

  允许借书量 int 4 Not null

  借阅天数 int 4 Not null9、图书状态基本信息表(state)

  列名 数据类型 长度 允许为空

  编号 tinyint 1 Not null

  值 varchar 10 Not null(1)规划有效的索引

  1.在组合表的列中创建索引,包括主关键字和外部关键字所在的列。

  2.在列或类组合中创建唯一的索引能增强唯一性。

  3.浏览索引并卸载不使用的索引。索引需要一定硬盘空间和时间来维护。具有较高数据插入操作频率的数据库最好不要索引。有较高读操作频率的数据库应该有更多的索引。

  4.避免在簇索引中包括不必要的列。在可能的情况下,使用较小的数据类型,例如用varchar替代char。

  5.考虑使用簇索引来支持排序和范围化查询。在为数据检索优化表时,簇索引必须支持数据的分组索引。为簇关键字选择列或列组,簇关键字以经常需要的顺序排序数据或以必须被一起访问的记录而分组记录。

  6.创建支持一般查询的查找参数索引。具有高选择性的列是索引的最好候选列。具有高密度的列是索引糟糕的候选列。

  (2)使用约束实现数据的完整性

  PRIMARY KEY约束在表中定义了主关键字,它是行唯一的标识符,它可以强制实体完整性。在使用PRIMARY KEY约束时考虑以下事实:

  1.每个表只能有一个PRIMARY KEY约束。

  2.键入的值必须是唯一的。

  3.不允许有空值。

  4.PRIMARY KEY约束在指定的列创建唯一的索引,可以指定簇索引和非

  索引(如果 非簇索引先前并不存在,簇索引是默认的)。

  UNIQUE约束指定,在一列中的两行不能有相同的值。该约束使用唯一的索引来强制实体的完整性。在已有一个主关键字时UNIQUE约束很有用,例如雇员号,但是必须保证其他标识符(例如,雇员驾驶证号)也是唯一的。在使用UNIQUE约束时,考虑以下事实;

  1.允许有空值。

  2.在一个表中可以设置多个UNIQUE约束。

  3.可以将UNIQUE约束运用于具有唯一值的单列或多列,但不能用于表的主关键字。

  4.通过在指定的列或列组中创建唯一的索引,可以使UNIQUE索引得到强制

  第五章 图书管理系统的具体实施

  第一节 PowerBuilder开发工具简介

  数据库应用是当前计算机应用的一个非常重要的方面,而在目前的数据库应用技术中普遍采用的就是客户机/服务器体系结构,在这种体系结构中,所有的数据和数据库管理系统都在服务器上,客户机通过采用标准的SQL语句等方式来访问服务器上数据库中的数据。由于这种体系结构把数据和对数据的管理都统一放在了服务器上。就保证了数据的安全性和完整性,同时也可以充分利用服务器高性能的特点。正因为客户机/服务器体系结构的这些优点,因而得到了非常广泛的应用。

  PowerBuilder是完全按照客户机/服务器体系结构研制设计,在客户机/服务器结构中,它使用在客户机中,作为数据库应用程序的开发工具而存在。由于PowerBuilder采用了面向对象和可视化技术,提供可视化的应用开发环境,使得我们利用PowerBuilder,可以方便快捷地开发出利用后台服务器中的数据和数据库管理系统的数据库应用程序。

  在当前,网络技术迅速发展,随之发展的还有OLE,OCX,跨平台等技术,而在PowerBuilder的最新版PowerBuilder 9.0中提供了对这些技术的全面支持。总之在数据库开发工具领域,PowerBuilder是其中非常优秀的一个,利用它我们可以开发出功能强大的数据库应用程序。

  第二节 SQL Server后台数据库管理系统

  本系统的开发选择了SQL数据库。SQL是MS SQL Server的简述,是世界上及国内比较流行的关系数据库管理系统。它适用于中小型事物处理及客户端/服务端结构的应用系统。它功能强大操作简便,日益为广大数据库用户所喜爱。越来越多的开发工具提供了与SQL Server的接口。SQL Server 是一个关系数据库管理系统,它最初是由Microsoft、Sybase 和Ashton-Tate三家公司共同开发的。于1988 年推出了第一个OS/2 版本,在Windows NT 推出后,Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server 移植到Windows NT系统上,专注于开发推广SQL Server 的Windows NT 版本。

  SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本,该版本继承了SQL Server 7.0 版本的优点,同时又比它增加了许多更先进的功能、具有使用方便、可伸缩性好与相关软件集成程度高等优点。可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用。MS SQL Server不但可以应用于大中型数据库管理中,建立分布式关系数据库,并且也可以开发桌面数据库。事实上,SQL Server数据库处理的基本结构,采取关系型数据库模式,尽管如此,相信大家都可以轻易的发现,在SQL Server的数据库处理方式,则是使用面向对象的操作方式与精神,也就是说,SQL Server的所有功能,都可以基于系统已经建立好的一些对象来达成,是相当OO(面向对象)的一个系统结构。

  SQL Server 企业管理器是 SQL Server 的主要管理工具,它提供了一个遵从 MMC 标准的用户界面,使用户得以:

  定义 SQL Server 实例组。

  将个别服务器注册到组中。

  为每个已注册的服务器配置所有 SQL Server 选项。

  在每个已注册的服务器中创建并管理所有 SQL Server 数据库、对象、登录、用户和权限。

  在每个已注册的服务器上定义并执行所有 SQL Server 管理任务。

  通过唤醒调用 SQL 查询分析器,交互地设计并测试 SQL 语句、批处理和脚本。它支持中小型数据库,多用户的高性能和事物处理,支持分布式数据库和分布处理,能够实现安全性和完整性控制,具有可移植性、可兼容性和可联结性,它具有良好的数据管理能力和良好的开发性。

  第三节 Powerbuilder 9应用程序开发的基本步骤

  我们要开发应用程序时,首先要对它进行分析。无论哪种、哪方面的应用程序,都要先建立一个应用对象。下面我们介绍以下PowerBuilder 9应用程序开发的基本步骤:

  (1)首先要建立应用对象。

  (2)创建窗口。在窗口里放置各种控件和编写事件响应的脚本。

  (3)创建菜单。窗口里的菜单可包括菜单条,下拉式菜单,级联菜单和弹出式菜单为菜单编写事件响应的脚本。

  (4)创建用户对象。如果想要重复使用某个控件的功能,可以把窗口上经常放置的控件定义为用户对象。

  (5)创建数据窗口。数据窗口可以检索数据库中的数据,可以建立各种报或统计表,可以修改数据库。

  (6)创建函数、结构、事件。为了能够更好地支持脚本,编写自定义的函数,定义结构类型变量,也可以为对象和控件定义自己的事件。

  (7)运行与调试。可以在开发环境中随时运行应用程序,发现错误后,可以用调试工具进行调试。

  (8)当应用程序开发完毕后,可以把它编译成可执行的文件,让用户比较容易地建立应用系统的运行环境。

  第四节 编码规范

  在软件开发过程中 ,为了减少在软件开发过程中的错误,应该遵守一定标准。

  给对象命名要有一定的规范,部件名称可以达到40个字符,窗口的命名:W_功能代码_功能描述。数据窗口的命名:DW_功能代码_功能描述。菜单命名:W_功能代码_功能描述。

  标识符命名时,应该使标识符有一定的字面含义,有助于程序的调试和脚本的可读性的提高。本系统中使用的命名规范为:变量作用域+变量类型+”_”+具有一定字面含义的名称。例如:li_selectrow反映出的含义:”l”代表是本地变量,是local的缩写,”i”代表是integer类型的变量,selectrow表示该变量是用来记录一个行号的计数器。

  第五节 创建祖先窗口和全局函数

  为充分利用PB的面向对象的特性。程序开发时一般创建几个模板窗口。将功能窗口上的某些常用功能封装在模板窗口中。然后将这些模板窗口作为祖先窗口。所有的子孙窗口都可以通过继承的方法来生成。这样就减少了代码的书写量。使得整个程序界面保持整齐。当修改祖先窗口时,所有的子孙窗口都会自动修改。所以,祖先窗口的确定要十分谨慎。

  全局函数与局部函数的作用类似。唯一不同的是全局函数的作用域是整个程序周期。不论你在任何一个模块的代码中都可以调用它。所以我们可以把某些常用功能写成全局函数。在程序的其他地方反复调用。

  一、 函数setmenu(character lev)

  功能介绍:通过传入的gi_right值,将某些菜单项设为“非使能”,以限制某些功能的使用。gi_right值即不同职责的权限(读者-1、普通图书管理员1、高级图书管理员 2、 超级管理员3)。

  二、 函数countday

  countday (date date1,date date2)

  功能介绍:通过传入的date1(起始日期)值与date2(结束日期)值,计算出中间相差的天数,返回值为integer型。

  代码分析:

  int day

  day=(integer(year(date2)) - integer(year(date1)))*365 +&

  (integer(month(date2)) - integer(month(date1)))*30 +&

  (integer(day(date2)) - integer(day(date1)))*1

  return day

  第六节 应用程序对象 App_librarain

  功能介绍:PB程序由一个应用程序开始,即每个PB程序在开始运行时,先执行应用程序对象的Open事件。在Open事件中连接数据库,并打开登陆窗口w_login。

  代码分析:

  SQLCA.DBMS = "MSS Microsoft SQL Server"

  SQLCA.Database = "ch4ckgl"

  SQLCA.LogPass =ProfileString(".\data.dat",&

  "SQLCA","LogPass","super1234") //从参数文件得到登录密码

  SQLCA.ServerName = ProfileString(".\data.dat",&

  "SQLCA","ServerName","localhost") //从参数文件得到数据库服务器名

  SQLCA.LogId ="sa"

  SQLCA.AutoCommit = False

  SQLCA.DBParm = ""

  connect;

  open(w_login)

  第六章 具体窗口的实现

  第一节 登录窗口

  图6.1 登陆窗口

  功能介绍:本窗口主要是检查操作员输入的用户名及密码是否正确,如果正确,允许登录。如果错误,显示出错误提示。

  操作方法:填写“用户名”与“密码”后,点击“登录”按钮进行验证,点击“取消”退出。

  第二节 主窗口

  功能介绍:本窗口作为菜单及其他子窗口的容器。

  窗口设置;本窗口为容器窗口。表示本窗口为多文档界面,可以有菜单、工具栏与状态栏。

  图6.2 主窗口界面

  第三节 新书入库窗口

  图6.3 新书入库

  功能介绍:增加信息。

  操作方法:

  点击“出库入库”按钮,填写图书信息,完成后点击“保存”按钮

  代码分析:

  “保存”按扭事件:

  long ll_id,ll_i

  //得到最大的图书编号

  select max(图书编号) into :ll_id from book;

  if sqlca.sqlcode=0 then //成功

  il_amount=dw_2.getitemnumber( 1,"图书编号")

  dw_2.setredraw( false) //不自动刷新数据窗口

  for ll_i=1 to il_amount

  ll_id=ll_id+1

  dw_2.setitem( 1,"图书编号", ll_id)

  //必须对数据窗口的状态进行设置才能多次插入数据

  //只有将行设置为NewModified!才能插入,设置列列不行的

  dw_2.setitemstatus( 1,0, Primary!,NewModified!)

  if dw_2.update( )<>1 then

  messagebox("错误","插入图书记录失败!",stopsign!)

  rollback;

  return //退出

  end if

  commit;

  next

  dw_2.setitem( 1,"图书编号",il_amount)

  dw_2.setredraw( true)

  else

  messagebox("错误","查找最大的图书编号时出现错误!",stopsign!)

  end if

  il_startid=(ll_id - il_amount)+1 //如果没有出现错误,则得到起始编号

  messagebox("成功","图书入库成功!")

  cb_refresh.triggerevent( clicked!)

  this.enabled=false

  第四节 旧书出库窗口

  图6.4 图书出库窗口

  功能介绍:删除图书信息。

  操作方法:首先通过图书编号检索出图书信息,然后点击“出库”按钮注销图书。

  第五节读者类型管理窗口

  图6.5 读者类型管理窗口

  功能介绍:管理读者类型信息。

  操作方法:可以通过”添加”、“删除“、“保存”等按扭对读者类型做相应的操作。

  代码分析:

  “删除”按扭事件:

  integer li_row,li_re

  string ls_name

  li_row=dw_1.getrow( )

  ls_name=dw_1.getitemstring( li_row, "值")

  li_re=messagebox("提示","是否删除用户类型:"+ls_name+"?",Question!,YesNO!)

  if li_re=1 then

  dw_1.deleterow( li_row)

  li_re=dw_1.update( )

  if li_re=1 then

  commit;

  else

  messagebox("提示","删除用户类型:"+ls_name+"失败!")

  rollback;

  end if

  end if

  第六节 借阅人管理窗口

  图6.6 读者维护管理窗口

  功能介绍:增加、查询、删除、修改借阅人等信息

  操作方法:其中添加按扭类同“新书入库窗口”的入库按扭,其它都是对图书做简单的修改、查询和删除按扭。详细代码在此不一一列举。

  第七节 图书维护窗口

  图6.7图书维护窗口

  功能介绍:查询、添加、修改、删除图书基本信息。

  操作方法:类同其它信息添加、修改和删除功能。