图书管理系统数据库设计与实现

图书管理系统

内容摘要(登陆用户:    密码:)

图书管理系统是采用Visual Basic6.0开发的一个数据库管理系统。开发本系统的基本步骤:需求分析、系统概念设计、系统逻辑和物理设计、系统实现和维护。在系统分析中先后用数据字典、数据流程、系统的功能结构图、ER图分析了系统所需的各种数据。在系统的设计过程中,我们采用了模块独立设计法,比较详细的展现了各个模块的功能。在库和表的设计当中, 我们力求层次清晰,设计简单实用。在系统具体实行阶段中,我们精心细致的画出了各个窗体并给出了相应的事件和代码,以实现各个窗体的作用。

开发环境:本图书管理开发系统是在Pentyum IV 以上机型的计算机上进行开发并获得通过的,同时方便系统开发,减少开发过程的难度,我们是基于以下的软件环境。

·以Windows XP为操作系统

·以Visual Basic6.0为开发工具

·以Access 2000作为后台数据库

功能概述:该系统界面友好,操作简便,能完成添加图书信息,修改图书信息,查询图书信息,添加读者类别,修改读者类别,查询读者信息,修改读者信息等一系列图书管理功能,开发本系统的总体任务是实现图书管理的系统化和自动化,帮助管理人员更好更高效地完成图书管理工作。本着实用性和介绍性的原则,整个系统由四大模块组成,每个大的模块又包括三至四个小的模块。

一、  图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。

二、  读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改等操作。

三、  借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。

四、  系统管理部分:包括修改系统用户密码和增加新用户两项功能。 

系统具有高效、易操作、易维护等特点,并且系统结构清晰、界面友好,功能较为齐全,能有效地协助管理人员进行图书管工作。如果想真正把它用到图书馆的图书自动化管理中,还需要读者对该系统进行一步的完善工作。

需求分析

需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。

2.1.系统的数据字典

本系统的主要数据元素的数据字典卡片:

名字:读者信息查询报表

别名:读者信息表

描述:读者基本情况查询结果的信息表

定义:读者信息查询报表=读者编号+读者姓名+性别+类别+单位+住址+电话+登记日期+已借书数量

位置:输出到打印机

名字:图书信息查询报表

别名:图书信息表

描述:各种书籍查询基本信息表

定义:图书信息查询报表=图书编号+书名+类别+作者+出版社+出版日期+登记日期+是否被借出

位置:输出到打印机

2.2.  数据流程图

数据流程图(Data Flow DFD)是描述实际业务管理系统工作流程的一种图形表示法。它描绘系统的逻辑模型图,其中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。因为数据流图是逻辑系统的图形表示,即使不是专业的计算机技术人员也容易理解,所以是极好的通信工具。此外,设计数据流图只需考虑系统必须完成的基本逻辑功能,完全不需要考虑如何具体地实现这些功能,所以它也是软件设计的很好的出发点。《图书管理系统》主要是为了对图书、读者基本信息等进行计算机管理。下面就是对各个功能模块的流程分析:

1 图书类别管理基本信息流程图 

                     

                                    

                

流程图分析:图书类别基本信息的流动首先是以图书类别的编号为依据,来达到添加、修改、查询图书类别记录。同时,也对数据库中的图书类别表的编号进行检查。

2 图书信息管理基本信息流程图 

 

流程图分析:图书基本信息的流动首先是以图书编号为流动方向的依据,来达到添加、修改、记录、删除图书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如有则不能进行添加。

 

3 读者类别管理基本信息流程图

 

 

流程图分析:读者类别基本信息的流动首先是以读者类别编号为流动方向的依据,来达到添加、修改、记录读者类别记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。

 

4 读者信息管理基本信息流程图

流程图分析:读者基本信息的流动首先是以读者的编号为依据,来达到添加、修改、查询、删除读者信息的记录。同时,也对数据库中的读者信息表的编号进行检查。

5借书管理基本信息流程图

流程图分析:借书管理基本信息的流动首先是以借阅编号为流动方向的依据,来达到添加、查询借书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。

6 还书管理基本信息流程图

流程图分析:借阅管理部分是实现对各部分数据内容的添加和查询操作,在借阅信息中包括借阅编号、读者编号、读者姓名、书籍名称、出借日期和还书日期。并通过添加功能来达到借阅信息表的数据的更新,通过查询可使管理员很快地了解借阅信息,从而避免书籍的丢失现象产生。

通过上面对各个模块流程的分析,那么我们就不难对整个系统的大致流程有一个全面的认识。设计时采用了常用的自顶向下的瀑布式结构化设计方法。各子系统具有独立的数据库结构,同时又具有相关的关键字,这样系统做起来后就便于用户操作。综合上面各个模块的流程分析,其总体流程图如下:

 

 

 

2.3.系统的概念设计

概念设计阶段主要任务和目标是根据需求分析的结果,包括一般联系实体,画出对应的ER图。对于复杂的系统,通常首先要对它的各功能模进行分析,然后再把它的功能结构图画出来,便是设计和优 化。功能分析之后,再根据各个岗位、各个用户对数据和使用权限的不同要求作出局部ER图,然后再把各个局部ER图综合起来形成统一的整体ER图。 

3.1模块功能分析

图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。各管理部分的明细如下:

(1)图书信息管理:包括图书信息的添加、图书信息的修改、图书信息的查询和图书的信息删除4部分。其中,图书信息包括图书编号、书名、图书类别、作者、出版社、出版日期、登记日期以及是否已被借出。

(2)图书类别管理:包括图书类别的添加、图书类别的修改、图书类别的删除3部分功能。其中,图书类别包括类别名称和类别编号两部分。

借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。各管理部分的明细如下:

(1)借书管理:包括添加借书信息和查询借书信息2部分功能。其中,借阅信息包括借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。

(2)还书管理:实现添加还书信息功能。其中,还书信息与借阅信息部分明细相同。

读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改、删除等操作。各管理部分的明细如下:

(1)读者信息管理:包括读者信的添加、读者信息的修改、读者信息的查询和读者信息的删除4部分功能。其中,读者信息包括读者姓名、读者编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量。

(2)读者类别管理:包括读者类别的添加、读者类别的修改、读者类别的删除3部分功能。其中,读者类别包括各种类名称、借书期限和有效期限4部分。

系统管理部分:包括修改系统用户密码、增加新用户和退出系统三项功能。系统初始设置一个超级用户名和密码,操作人员可以利用这个超级用户名和密码登录,之后,可以设置其他的超级用户名称,也可以设置权限用户,同时也设置了这个用户可以使用的权限。 

 

3.2系统功能结构图

  

3.3系统ER图的设计

数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。设计数据库系统时应该首先充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。

针对图书管理系统的需求,通过对图书管理系统流程分析,设计此系统需要如下面所示的数据项和数据结构:

图书信息:包括的数据项有:图书编号、书名、图书类别、作者出版社、出版日期、登记日期

读者信息:包括的数据项有:读者姓名、编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量

图书借阅信息:包括的数据项有:借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。

在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。然后再把概念模式转换成逻辑模式。将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。

利用ER方法进行数据库的概念设计,可分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局模式,最后对全局ER模式进行优化,得到最终的模式,即概念模式。   

ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。

所有局部ER模式都设计好了后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部ER模式,而且必须合理地表示一个完整、一致的数据库概念结构。

1)确定公共实体类型

    为了给多个局部ER模式的合并提供开始合并的基础,首先要确定各局部结构中的公共实体类型。在这一步中我们仅根据实体类型名和键来认定公共实体类型。一般把同名实体类型作为公共实体类型的一类候选,把具有相同键的实体类型作为公共实体类型的另一类候选。

2)局部ER模式的合并

    合并的原则是:首先进行两两合并;先和合并那些现实世界中有联系的局部结构;合并从公共实体类型开始,最后再加入独立的局部结构。

3)消除冲突

    冲突分为三类:属性冲突、结构冲突、命名冲突。设计全局ER模式的目的不在于把若干局部ER模式形式上合并为一个ER模式,而在于消除冲突,使之成为能够被所有用户共同理解和接受的同一的概念模型。

3)全局ER模式的优化

    在得到全局ER模式后,为了提高数据库系统的效率,还应进一步依据处理需求对ER模式进行优化。一个好的全局ER模式,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体类型的个数要尽可能的少;实体类型所含属性个数尽可能少;实体类型间联系无冗余。

根据上述所示得出本系统的全局ER图如下:

 

2.3. 系统逻辑和物理设计

2.3.1数据库的设计

根据上面的数据库ER图,现在需要将上面的数据库概念结构转化为SQL Server2000数据库系统所支持的实际数据模型,也就是数据库的逻辑结构。在上面的实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。图书管理信息系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。

1.图书类别表

字段名

数据类型

说明

类别名称

文本

必添字段“是”,允许空字符为“否”

类别编号

文本

必添字段“是”,允许空字符为“否”

2.图书信息表

字段名

数据类型

说明

图书编号

文本

必添字段“是”,允许空字符为“否”

书名

文本

必添字段“是”,允许空字符为“否”

类别

文本

字段大小50

作者

文本

字段大小50

出版社

文本

字段大小50

出版日期

日期/时间

登记日期

日期/时间

是否借出

文本

字段大小2

3.借阅信息表

字段名

数据类型

说明

借阅编号

自动编号

读者编号

文本

字段大小50

读者姓名

文本

字段大小50

图书编号

文本

字段大小50

图书名称

文本

字段大小50

出借日期

日期/时间

4.读者信息表

字段名

数据类型

说明

读者姓名

文本

必添字段“是”,允许空字符为“否”

读者编号

文本

必添字段“是”,允许空字符为“否”

性别

文本

字段大小2

读者类别

文本

字段大小50

工作单位

文本

字段大小50

家庭住址

文本

字段大小50

电话号码

文本

字段大小50

登记日期

日期/时间

已借数量

数字

5.读者类别表                                                                                                                   

字段名

数据类型

说明

种类名称

文本

必添字段“是”,允许空字符为“否”

借书数量

数字

借书期限

数字

有限期限

数字

2.3.2数据库的维护

  由于应用环境不断变化,数据库运行过和中物理存储也会不断变化,对数据库设计进行调整,修改等维护工作是设计工作的继续和提高。对数据库经常性的维护工作主要包括:

1.    数据库的转储和恢复

针对不同的应用要求制定不同的转储计划,保证一旦发生故障能尽快将数据库恢复到某种一致的状态,尽可能减少对数据库的破坏。

2.    数据库的安全性、完整性控制

在数据库运行过程中由于应用环境的变化,对安全性的要求也会发生变化,如原来机密的数据现在可以公开查询了,新加入的数据又可能是机密的了。系统中用户的密级改变。这都需要根据实际情况修改原有的安全性控制,可以设置数据库密码及用户权限。同样,数据库的完整性的约束条件也会变化,需要DBA不断修正。

3.    数据库性能的监督、分析和改造

利用Microsoft SQL Server2000提供的检测系统性能参数的工具,在数据库运行过程中,监督数据进行分析,找出改进系统性能的方法,并做适当调整。

4.    数据库的重组及重构造

数据库运行一段时间后,由于记录不断增、删、改,增添、修改的数据不能为空,否则不能保存到数据库中。使数据库的物理存储情况变坏,降低了数据的存取效率,数据库性能下降,这时DBA要对数据库进行重组织,或部分重组织(只对频繁增、删的表进行重组织),可以利用Microsoft SQL Server2000专门提供的数据重组织实用程序操作,按原设计要求重新安排存储位置、回收垃圾、减少指针链等,提高系统性能。

有些情况,如由于数据库应用环境发生变化,增加了新的应用或新的实体,取消了某些应用,有的实体与实体间的联系发生变化,则需要调整数据库的模式及内模式。

4.3功能模块的实现

数据库设计

  这里的数据库采用Access,用ADO作为连接数据对象。

1、建立Access 数据库

  启动Access,建立一个空的数据库book.mdb,如图3所示。

  使用程序设计器建立系统需要的表格如下。

图书登记表,如图4所示。

  图3建立数据库book.mdb             图4 图书登记表

  图书借阅表,如图5所示。

图5 图书借阅表

  图书资料表,如图6所示。系统管理表,如图7所示。

  图6 图书资料表 

图7 系统管理表

    。

2、连接数据

  在Visual Basic环境下,选择“工程”→“引用”命令,在随后出现的对话框中选择“Microsoft ActiveX Data Objects 2.0 Library”,然后单击“确定”按钮,如图8所示。

  图8用ADO连接数据库

  在程序设计的公共模块中,先定义ADO连接对象。语句如下:

Public conn As New ADODB.Connection ’ 标记连接对象

  然后在子程序中,用如下的语句即可打开数据库:

Dim connectionstring As String

connectionstring = "provider=Microsoft.Jet.oledb.4.0;" &_

"data source=book.mdb"

conn.Open connectionstring

3、设置ODBC

VB的ADO对象是通过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。

打开控制面板中的“管理工具”→“数据源”(ODBC),出现如图9所示的对话框。 

  图9DBC对话框

  单击“添加”按钮,出现“创建新数据源”对话框,如图10。

  图10创建新数据源”对话框

  选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现如图11对话框。

  图11置连接数据源

  在“数据源名”文本框中添加一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。

界面设计

  设计好的界面如图12所示。

图12 图书管理系统界面

  这是一个多文档界面(MDI)应用程序,可以同时显示多个文档,每个文档显示在各自的窗体中。MDI 应用程序中常有包含子菜单的“窗体”选项,用于在窗体或文档之间进行切换。

  菜单应用程序中,有5个菜单选项,每个选项对应着E-R图的一个子项目。

1、创建主窗体  首先创建一个工程,命名为图书管理系统,选择“工程”→“添加MDI窗体”命令,则在项目中添加了主窗体。该窗体的一些属性如表1所示。

  表1 主窗体的属性

属 

性值

Caption

图书管理系统

Name

Main

Menu

Mainmenu1

Windowstate

Maxsize

Windowstate的值为Maxsize,即程序启动之后自动最大化。

  将“菜单”组件从“工具箱”拖到窗体上。创建一个 Text 属性设置为“文件”的顶级菜单项,且带有名为“关闭”的子菜单项。类似地创建一些菜单项,如表2所示。

  表2 菜 单 项 表

菜 单 名 称

Text属性

功 能 描 述

MenuItem1

图书管理

顶级菜单,包含子菜单

MenuItem2

图书类别

调出图书登记窗体

MenuItem3

图书信息

调出图书借阅窗体

MenuItem4

图书资料

顶级菜单,包含子菜单

MenuItem5

查询输出

调出查询输出窗体

MenuItem6

系统管理

顶级菜单,包含子菜单

MenuItem7

增加用户

调出用户窗体

MenuItem8

修改密码

调出密码窗体

MenuItem9

退出

系统退出

2、创建各子窗体

  选择“工程”→“添加窗体”命令,添加子窗体。

  在新建Visual Basic工程时自带的窗体中,将其属性MIDChild改成True,则这个窗体成为MID窗体的子窗体。

  在这个项目中,要创建的子窗体如表3所示。

  表3 所有子窗体

子 窗 体 名

Text

图书登记

frmdengji

图书借阅

frmjieyue

增加新用户

frmadduser

查询输出

frmfind

登录系统

frmlogin

修改密码

frmchangepwd

  下面分别给出这些子窗体,以及它们所使用的控件。

(1) 图书登记子窗体控件如表4所示。

表4 图书登记子窗体控件

控 件 类 别

控件Name

控件Text

Label

Label1

编号

Label2

书名

Label3

类型

Label4

购买日期

Label5

TextBox

Text1

(空)

Text2

(空)

Text3

(空)

Text4

(空)

Text5

(空)

CommandButton

Command1

Command2

ADO

DataAdodc1

(空)

DataGrid

DataGrid1

(空)

  图书借阅和图书赔偿子窗体分别,因为它们的控件与图书登记子窗体的雷同,在此不作介绍。

(2) 增加用户子窗体如图13所示,其控件如表5所示。

图13 增加用户子窗体

表5 增加用户子窗体控件

控 件 类 别

控件Name

控件Text

Label

Label1

输入用户名

Label2

输入密码

Label3

确认密码

TextBox

Text1

(空)

Text2

(空)

Text3

(空)

ComboBox

Comb1

选择权限

CommandButton

Commandl

确定

Command2

取消

(3) 修改密码子窗体如图14所示。

图14 修改密码子窗体

(4) 用户登录子窗体如图15所示。 

图15 用户登录子窗体 

(5) 添加读者类别如图16,其控件如表9所示。

  图16

建立公共模块

1、显示目录

  建立公共模块可以提高代码的效率,同时使得修改和维护代码都很方便。

  创建公共模块的步骤如下:

(1) 在菜单中选择“工程”→“添加模块”命令,则出现模块对话框,如图18所示。

(2) 选择模块图标后,单击“打开”按钮,则模块已经添加到项目中了。默认情况下名为Module1。

  图17 模块对话框

(3) 在模块中定义整个项目的公共变量。

Public conn As New ADODB.Connection ’ 标记连接对象

Public userID As String ’ 标记当前用户ID

Public userpow As String ’ 标记用户权限

Public find As Boolean ’ 标记查询

Public sqlfind As String ’ 查询语句

Public rs_data1 As New ADODB.Recordset

Public findok As Boolean

Public frmdata As Boolean

Public Const keyenter = 13 ’ enter键的ASCII码

  在主窗体添加完菜单之后,就要为各个子菜单创建事件处理程序。

主窗体代码

  在本项目中,子菜单事件都是Click事件,这里先给出主窗体部分的代码。

  下面是响应“增加用户”子菜单Click事件,调出增加用户窗体代码。

Private Sub add_admin_Click()

frmadduser.Show

End Sub

Private Sub add_back_book_Click()

frmbackbookinfo.Show

End Sub

Private Sub add_book_info_Click()

frmaddbookinfo.Show

End Sub

Private Sub add_book_style_Click()

frmaddbookstyle.Show

End Sub

Private Sub add_lend_book_Click()

frmfindbook.Show

End Sub

Private Sub add_reader_info_Click()

frmaddreaderinfo.Show

End Sub

Private Sub add_reader_style_Click()

frmaddreaderstyle.Show

End Sub

Private Sub change_pwd_Click()

frmchangepwd.Show

End Sub

Private Sub del_book_info_Click()

frmmodifybookinfo.Show

End Sub

Private Sub del_book_style_Click()

frmmodifybookstyle.Show

End Sub

Private Sub del_reader_info_Click()

frmreaderinfo.Show

End Sub

Private Sub del_reader_style_Click()

frmmodifyreaderstyle.Show

End Sub

Private Sub exit_sys_Click()

End

End Sub

Private Sub find_book_info_Click()

frmfindbook.Show

End Sub

Private Sub find_lend_book_Click()

frmfindborrowinfo.Show

End Sub

Private Sub find_reader_info_Click()

frmfindreader.Show

End Sub

Private Sub Form_Load()

End Sub

Private Sub modify_book_info_Click()

frmmodifybookinfo.Show

End Sub

Private Sub modify_book_style_Click()

frmmodifybookstyle.Show

End Sub

Private Sub modify_reader_info_Click()

frmreaderinfo.Show

End Sub

Private Sub modify_reader_style_Click()

frmmodifyreaderstyle.Show

End Sub

2、各子窗体的代码

(1) 图书登记子窗体代码

  本窗体用来填写图书登记的信息,用ADO来连接数据库,是本窗体的重点。采用MDI的子程序,所以运行后,它出现在主程序的界面下,如图18所示。

  图18 图书登记子窗体

  按钮控件要求先填写基本信息,然后与数据库信息比较。

Option Explicit

Private Sub Command1_Click()

Dim rs_addbook As New ADODB.Recordset

Dim sql As String

If Trim(Combo1.Text) = "" Then

   MsgBox "请选择图书种类", vbOKOnly + vbExclamation, ""

   Combo1.SetFocus

   Exit Sub

End If

If Trim(Text1.Text) = "" Then

   MsgBox "图书编号不能为空", vbOKOnly + vbExclamation, ""

   Text1.SetFocus

   Exit Sub

End If

If Trim(Text2.Text) = "" Then

   MsgBox "书名不能为空", vbOKOnly + vbExclamation, ""

   Text2.SetFocus

   Exit Sub

End If

   If Not IsDate(Text5.Text) Then

      MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""

      Text5.SetFocus

      Exit Sub

   End If

   If Not IsDate(Text6.Text) Then

      MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""

      Text6.SetFocus

      Exit Sub

   End If

sql = "select * from 书籍信息 where 书籍编号='" & Text1.Text & "'"

rs_addbook.Open sql, conn, adOpenKeyset, adLockPessimistic

If rs_addbook.EOF Then

   rs_addbook.AddNew

   rs_addbook.Fields(0) = Trim(Text1.Text)

   rs_addbook.Fields(1) = Trim(Text2.Text)

   rs_addbook.Fields(2) = Trim(Combo1.Text)

   rs_addbook.Fields(3) = Trim(Text3.Text)

   rs_addbook.Fields(4) = Trim(Text4.Text)

   rs_addbook.Fields(5) = Trim(Text5.Text)

   rs_addbook.Fields(6) = Trim(Text6.Text)

   rs_addbook.Fields(7) = "否"

   rs_addbook.Update

   MsgBox "添加书籍信息成功!", vbOKOnly, ""

   rs_addbook.Close

Else

   MsgBox "图书编号重复!", vbOKOnly + vbExclamation, ""

   Text1.SetFocus

   Text1.Text = ""

   rs_addbook.Close

   Exit Sub

End If

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim rs_leibie As New ADODB.Recordset

Dim sql As String

sql = "select * from 图书类别"

rs_leibie.Open sql, conn, adOpenKeyset, adLockPessimistic

rs_leibie.MoveFirst

Do While Not rs_leibie.EOF

  Combo1.AddItem rs_leibie.Fields(0)

  rs_leibie.MoveNext

Loop

rs_leibie.Close

End Sub

Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)

End Sub  图书借阅子窗体运行后如图19所示,因为它们的代码和图书登记子窗体的代码雷同,在此不做重复。

  图19 图书借阅子窗体运行效果  

(2) 增加用户子窗体代码

  增加用户子窗体是用来增加用户的用户名、密码和权限的。

  单击“确定”按钮后,还要返回一个信息框,提示成功信息,如图20所示。

  图20 增加用户子窗体运行效果                             

信息框

  窗体部分代码的思路是,收集输入的表中的字符串,然后与数据库中的系统的用户数据比较,如果不存在,则允许添加。

Private Sub Command1_Click()

Dim sql As String

Dim rs_add As New ADODB.Recordset

If Trim(Text1.Text) = "" Then

   MsgBox "用户名不能为空", vbOKOnly + vbExclamation, ""

   Exit Sub

   Text1.SetFocus

Else

   sql = "select * from 系统管理"

  rs_add.Open sql, conn, adOpenKeyset, adLockPessimistic

   While (rs_add.EOF = False)

        If Trim(rs_add.Fields(0)) = Trim(Text1.Text) Then

           MsgBox "已有这个用户", vbOKOnly + vbExclamation, ""

           Text1.SetFocus

           Text1.Text = ""

           Text2.Text = ""

           Text3.Text = ""

           Combo1.Text = ""

           Exit Sub

         Else

           rs_add.MoveNext

         End If

    Wend

    If Trim(Text2.Text) <> Trim(Text3.Text) Then

       MsgBox "两次密码不一致", vbOKOnly + vbExclamation, ""

       Text2.SetFocus

       Text2.Text = ""

       Text3.Text = ""

       Exit Sub

    ElseIf Trim(Combo1.Text) <> "system" And Trim(Combo1.Text) <> "guest" Then

       MsgBox "请选择正确的用户权限", vbOKOnly + vbExclamation, ""

       Combo1.SetFocus

       Combo1.Text = ""

       Exit Sub

    Else

       rs_add.AddNew

       rs_add.Fields(0) = Text1.Text

       rs_add.Fields(1) = Text2.Text

       rs_add.Fields(2) = Combo1.Text

       rs_add.Update

       rs_add.Close

       MsgBox "添加用户成功", vbOKOnly + vbExclamation, ""

       Unload Me

    End If

End If

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Form_Load()

Combo1.AddItem "system"

Combo1.AddItem "guest"

End Sub

(3) 修改密码子窗体代码

  修改密码子窗体是用来修改用户密码的。

  图21修改密码子窗体运行效果

  在“确定”按钮的Click事件中添加如下代码:

Private Sub Command1_Click()

Dim rs_chang As New ADODB.Recordset

Dim sql As String

If Trim(Text1.Text) <> Trim(Text2.Text) Then

MsgBox "密码不一致!", vbOKOnly + vbExclamation, ""

Text1.SetFocus

Text1.Text = ""

Text2.Text = ""

Else

sql = "select * from 系统管理 where 用户名=’" & userID & "’"

rs_chang.Open sql, conn, adOpenKeyset, adLockPessimistic

rs_chang.Fields(1) = Text1.Text

rs_chang.Update

rs_chang.Close

MsgBox "密码修改成功", vbOKOnly + vbExclamation, ""

Unload Me

End If

End Sub

图22

  在上述代码中,首先比较两个表中的数据是否一致,然后用rs_chang.Fields(1) = Text1.Text语句把代码输入到数据库中。最后,用MsgBox "密码修改成功", vbOKOnly + vbExclamation,""语句弹出一个信息框,告诉修改成功,如图22所示。

(4) 查询子窗体代码

  查询子窗体是用来查询库房中图书资料明细的。其运行效果如图23所示。

  图23 查询子窗体运行效果

Option Explicit

Dim panduan As String

Private Sub Command1_Click()

Dim rs_findbook As New ADODB.Recordset

Dim sql As String

If Check1.Value = vbChecked Then

   sql = "书名='" & Trim(Text1.Text & " ") & "'"

End If

If Check2.Value = vbChecked Then

   If Trim(sql) = "" Then

      sql = "类别='" & Trim(Combo1.Text & " ") & "'"

   Else

      sql = sql & "and 书名='" & Trim(Combo1.Text & " ") & "'"

   End If

End If

If Check3.Value = vbChecked Then

   If Trim(sql) = "" Then

      sql = "作者='" & Trim(Text2.Text & " ") & "'"

   Else

      sql = sql & "and  作者='" & Trim(Text2.Text & " ") & "'"

   End If

End If

If Check4.Value = vbChecked Then

   If Trim(sql) = "" Then

      sql = "出版社='" & Trim(Text3.Text & " ") & "'"

   Else

      sql = sql & "and  出版社='" & Trim(Text3.Text & " ") & "'"

   End If

End If

If Check5.Value = vbChecked Then

   If Trim(sql) = "" Then

sql = "书籍编号='" & Trim(Text4.Text & " ") & "'"

   Else

      sql = sql & "and  书籍编号='" & Trim(Text4.Text & " ") & "'"

   End If

End If

If Trim(sql) = "" Then

   MsgBox "请选择查询方式!", vbOKOnly + vbExclamation

   Exit Sub

End If

sql = "select * from 书籍信息 where " & sql

rs_findbook.CursorLocation = adUseClient

rs_findbook.Open sql, conn, adOpenKeyset, adLockPessimistic

DataGrid1.AllowAddNew = False

DataGrid1.AllowDelete = False

DataGrid1.AllowUpdate = False

Set DataGrid1.DataSource = rs_findbook

'rs_findbook.Close

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Command3_Click()

If Trim(book_num) = "" Then

   MsgBox "请选择要借阅的图书!", vbOKOnly + vbExclamation

   Exit Sub

End If

If panduan = "是" Then

   MsgBox "此书已被借出!", vbOKOnly + vbExclamation

   Exit Sub

End If

frmborrowbook.Show

End Sub

Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)

book_num = DataGrid1.Columns(0).CellValue(DataGrid1.Bookmark)

panduan = DataGrid1.Columns(7).CellValue(DataGrid1.Bookmark)

End Sub

Private Sub Form_Load()

Dim rs_find As New ADODB.Recordset

Dim sql As String

sql = "select * from 图书类别"

rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic

rs_find.MoveFirst

If Not rs_find.EOF Then

   Do While Not rs_find.EOF

      Combo1.AddItem rs_find.Fields(0)

      rs_find.MoveNext

   Loop

   Combo1.ListIndex = 0

End If

rs_find.Close

End Sub

查询完毕后,输出查询结果,如图24所示。

  显示目录

(6) 用户登录子窗体代码

    在本项目中,用户登录子窗体是运行的第一个界面,它的作用是检查用户名和密码是否正确。由于用户的资料是存放在数据库中,所以在启动该子窗体时,就已经连接了数据库。其代码如下:

Private Sub Form_Load()

Dim connectionstring As String

connectionstring = "provider=Microsoft.Jet.oledb.4.0;" & _

"data source=book.mdb"

conn.Open connectionstring

cnt = 0

End Sub

“确定”按钮的作用是检查输入的数据是否与数据库中的数据一致。

Private Sub Command1_Click()

Dim sql As String

Dim rs_login As New ADODB.Recordset

If Trim(txtuser.Text) = "" Then ’ 判断输入的用户名是否为空

MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""

txtuser.SetFocus

Else

sql = "select * from 系统管理 where 用户名=’" & txtuser.Text & "’"

rs_login.Open sql, conn, adOpenKeyset, adLockPessimistic

If rs_login.EOF = True Then

MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""

txtuser.SetFocus

Else ’ 检验密码是否正确

  用户名和密码通过后,要关闭本窗体并打开主窗体。

If Trim(rs_login.Fields(1)) = Trim(txtpwd.Text) Then

userID = txtuser.Text

userpow = rs_login.Fields(2)

rs_login.Close

Unload Me

MDIForm1.Show

Else

MsgBox "密码不正确", vbOKOnly + vbExclamation, ""

txtpwd.SetFocus

End If

End If

End If

’ 只能输入3次

cnt = cnt + 1

If cnt = 3 Then

Unload Me

End If

Exit Sub

End Sub

(7)查询借书信息如图25

如图27

代码如下:

Option Explicit

Private Sub Command1_Click()

Dim sql As String

Dim rs_find As New ADODB.Recordset

If Option1.Value = True Then

   sql = "select * from 书籍信息 where 是否被借出='是'"

End If

If Option2.Value = True Then

   sql = "select * from 书籍信息 where 是否被借出='否'"

End If

If Option3.Value = True Then

   sql = "select * from 借阅信息 where 读者姓名='" & Text1.Text & "'"

End If

   rs_find.CursorLocation = adUseClient

   rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic

   DataGrid1.AllowAddNew = False

   DataGrid1.AllowDelete = False

   DataGrid1.AllowUpdate = False

   Set DataGrid1.DataSource = rs_find

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Frame2_DragDrop(Source As Control, X As Single, Y As Single)

End Sub

此板块,可以查询已经借出的书,没有借出的书,也可以按读者姓名查询!!!

(8)还书信息如图26

如图26

代码如下:

Option Explicit

Dim findform As Boolean

Private Sub Combo1_Click()

Combo2.ListIndex = Combo1.ListIndex

End Sub

Private Sub Combo2_Click()

Combo1.ListIndex = Combo2.ListIndex

End Sub

Private Sub Combo3_Click()

Combo4.ListIndex = Combo3.ListIndex

End Sub

Private Sub Combo4_Click()

Combo3.ListIndex = Combo4.ListIndex

End Sub

Private Sub Command1_Click()

Dim rs_reader As New ADODB.Recordset

Dim sql As String

findform = True

sql = "select * from 借阅信息 where 读者姓名='" & Combo2.Text & "'"

rs_reader.CursorLocation = adUseClient

rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic

Set DataGrid1.DataSource = rs_reader

DataGrid1.AllowAddNew = False

DataGrid1.AllowDelete = False

DataGrid1.AllowUpdate = False

End Sub

Private Sub Command2_Click()

Dim rs_book As New ADODB.Recordset

Dim sql As String

findform = False

sql = "select * from 借阅信息 where 书籍编号='" & Combo3.Text & "'"

rs_book.CursorLocation = adUseClient

rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic

Set DataGrid1.DataSource = rs_book

DataGrid1.AllowAddNew = False

DataGrid1.AllowDelete = False

DataGrid1.AllowUpdate = False

End Sub

Private Sub Command3_Click()

Dim book_num As String

Dim reader_num As String

Dim answer As String

Dim rs_back As New ADODB.Recordset

Dim sql As String

On Error GoTo delerror

book_num = DataGrid1.Columns(3).CellValue(DataGrid1.Bookmark)

reader_num = DataGrid1.Columns(1).CellValue(DataGrid1.Bookmark)

answer = MsgBox("确定要还这本书吗?", vbYesNo, "")

If answer = vbYes Then

   sql = "select * from 借阅信息 where 书籍编号='" & book_num & "'"

   rs_back.CursorLocation = adUseClient

   rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic

   rs_back.Delete

   rs_back.Update

   rs_back.Close

   sql = "select * from 书籍信息 where 书籍编号='" & book_num & "'"

   rs_back.CursorLocation = adUseClient

   rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic

   rs_back.Fields(7) = "否"

rs_back.Update

   rs_back.Close

   sql = "select * from 读者信息 where 读者编号='" & reader_num & "'"

   rs_back.CursorLocation = adUseClient

   rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic

   rs_back.Fields(8) = rs_back.Fields(8) - 1

   rs_back.Update

   rs_back.Close

   If findform = True Then

      Command1_Click

   Else

      Command2_Click

   End If

   MsgBox "成功删除!", vbOKOnly + vbExclamation, ""

   DataGrid1.AllowDelete = False

Else

   Exit Sub

End If

delerror:

If Err.Number <> 0 Then

   MsgBox Err.Description

End If

End Sub

Private Sub Command4_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim rs_reader As New ADODB.Recordset

Dim rs_book As New ADODB.Recordset

Dim sql As String

sql = "select * from 读者信息"

rs_reader.CursorLocation = adUseClient

rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic

If Not rs_reader.EOF Then

   Do While Not rs_reader.EOF

      Combo1.AddItem rs_reader.Fields(1)

      Combo2.AddItem rs_reader.Fields(0)

      rs_reader.MoveNext

   Loop

End If

rs_reader.Close

sql = "select * from 借阅信息"

rs_book.CursorLocation = adUseClient

rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic

If Not rs_book.EOF Then

   Do While Not rs_book.EOF

      Combo3.AddItem rs_book.Fields(3)

图书管理系统

内容摘要(登陆用户:    密码:)

图书管理系统是采用Visual Basic6.0开发的一个数据库管理系统。开发本系统的基本步骤:需求分析、系统概念设计、系统逻辑和物理设计、系统实现和维护。在系统分析中先后用数据字典、数据流程、系统的功能结构图、ER图分析了系统所需的各种数据。在系统的设计过程中,我们采用了模块独立设计法,比较详细的展现了各个模块的功能。在库和表的设计当中, 我们力求层次清晰,设计简单实用。在系统具体实行阶段中,我们精心细致的画出了各个窗体并给出了相应的事件和代码,以实现各个窗体的作用。

开发环境:本图书管理开发系统是在Pentyum IV 以上机型的计算机上进行开发并获得通过的,同时方便系统开发,减少开发过程的难度,我们是基于以下的软件环境。

·以Windows XP为操作系统

·以Visual Basic6.0为开发工具

·以Access 2000作为后台数据库

功能概述:该系统界面友好,操作简便,能完成添加图书信息,修改图书信息,查询图书信息,添加读者类别,修改读者类别,查询读者信息,修改读者信息等一系列图书管理功能,开发本系统的总体任务是实现图书管理的系统化和自动化,帮助管理人员更好更高效地完成图书管理工作。本着实用性和介绍性的原则,整个系统由四大模块组成,每个大的模块又包括三至四个小的模块。

一、  图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。

二、  读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改等操作。

三、  借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。

四、  系统管理部分:包括修改系统用户密码和增加新用户两项功能。 

系统具有高效、易操作、易维护等特点,并且系统结构清晰、界面友好,功能较为齐全,能有效地协助管理人员进行图书管工作。如果想真正把它用到图书馆的图书自动化管理中,还需要读者对该系统进行一步的完善工作。

需求分析

需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。

2.1.系统的数据字典

本系统的主要数据元素的数据字典卡片:

名字:读者信息查询报表

别名:读者信息表

描述:读者基本情况查询结果的信息表

定义:读者信息查询报表=读者编号+读者姓名+性别+类别+单位+住址+电话+登记日期+已借书数量

位置:输出到打印机

名字:图书信息查询报表

别名:图书信息表

描述:各种书籍查询基本信息表

定义:图书信息查询报表=图书编号+书名+类别+作者+出版社+出版日期+登记日期+是否被借出

位置:输出到打印机

2.2.  数据流程图

数据流程图(Data Flow DFD)是描述实际业务管理系统工作流程的一种图形表示法。它描绘系统的逻辑模型图,其中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。因为数据流图是逻辑系统的图形表示,即使不是专业的计算机技术人员也容易理解,所以是极好的通信工具。此外,设计数据流图只需考虑系统必须完成的基本逻辑功能,完全不需要考虑如何具体地实现这些功能,所以它也是软件设计的很好的出发点。《图书管理系统》主要是为了对图书、读者基本信息等进行计算机管理。下面就是对各个功能模块的流程分析:

1 图书类别管理基本信息流程图 

                     

                                    

                

流程图分析:图书类别基本信息的流动首先是以图书类别的编号为依据,来达到添加、修改、查询图书类别记录。同时,也对数据库中的图书类别表的编号进行检查。

2 图书信息管理基本信息流程图 

 

流程图分析:图书基本信息的流动首先是以图书编号为流动方向的依据,来达到添加、修改、记录、删除图书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如有则不能进行添加。

 

3 读者类别管理基本信息流程图

 

 

流程图分析:读者类别基本信息的流动首先是以读者类别编号为流动方向的依据,来达到添加、修改、记录读者类别记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。

 

4 读者信息管理基本信息流程图

流程图分析:读者基本信息的流动首先是以读者的编号为依据,来达到添加、修改、查询、删除读者信息的记录。同时,也对数据库中的读者信息表的编号进行检查。

5借书管理基本信息流程图

流程图分析:借书管理基本信息的流动首先是以借阅编号为流动方向的依据,来达到添加、查询借书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。

6 还书管理基本信息流程图

流程图分析:借阅管理部分是实现对各部分数据内容的添加和查询操作,在借阅信息中包括借阅编号、读者编号、读者姓名、书籍名称、出借日期和还书日期。并通过添加功能来达到借阅信息表的数据的更新,通过查询可使管理员很快地了解借阅信息,从而避免书籍的丢失现象产生。

通过上面对各个模块流程的分析,那么我们就不难对整个系统的大致流程有一个全面的认识。设计时采用了常用的自顶向下的瀑布式结构化设计方法。各子系统具有独立的数据库结构,同时又具有相关的关键字,这样系统做起来后就便于用户操作。综合上面各个模块的流程分析,其总体流程图如下:

 

 

 

2.3.系统的概念设计

概念设计阶段主要任务和目标是根据需求分析的结果,包括一般联系实体,画出对应的ER图。对于复杂的系统,通常首先要对它的各功能模进行分析,然后再把它的功能结构图画出来,便是设计和优 化。功能分析之后,再根据各个岗位、各个用户对数据和使用权限的不同要求作出局部ER图,然后再把各个局部ER图综合起来形成统一的整体ER图。 

3.1模块功能分析

图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。各管理部分的明细如下:

(1)图书信息管理:包括图书信息的添加、图书信息的修改、图书信息的查询和图书的信息删除4部分。其中,图书信息包括图书编号、书名、图书类别、作者、出版社、出版日期、登记日期以及是否已被借出。

(2)图书类别管理:包括图书类别的添加、图书类别的修改、图书类别的删除3部分功能。其中,图书类别包括类别名称和类别编号两部分。

借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。各管理部分的明细如下:

(1)借书管理:包括添加借书信息和查询借书信息2部分功能。其中,借阅信息包括借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。

(2)还书管理:实现添加还书信息功能。其中,还书信息与借阅信息部分明细相同。

读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改、删除等操作。各管理部分的明细如下:

(1)读者信息管理:包括读者信的添加、读者信息的修改、读者信息的查询和读者信息的删除4部分功能。其中,读者信息包括读者姓名、读者编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量。

(2)读者类别管理:包括读者类别的添加、读者类别的修改、读者类别的删除3部分功能。其中,读者类别包括各种类名称、借书期限和有效期限4部分。

系统管理部分:包括修改系统用户密码、增加新用户和退出系统三项功能。系统初始设置一个超级用户名和密码,操作人员可以利用这个超级用户名和密码登录,之后,可以设置其他的超级用户名称,也可以设置权限用户,同时也设置了这个用户可以使用的权限。 

 

3.2系统功能结构图

  

3.3系统ER图的设计

数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。设计数据库系统时应该首先充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。

针对图书管理系统的需求,通过对图书管理系统流程分析,设计此系统需要如下面所示的数据项和数据结构:

图书信息:包括的数据项有:图书编号、书名、图书类别、作者出版社、出版日期、登记日期

读者信息:包括的数据项有:读者姓名、编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量

图书借阅信息:包括的数据项有:借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。

在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。然后再把概念模式转换成逻辑模式。将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。

利用ER方法进行数据库的概念设计,可分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局模式,最后对全局ER模式进行优化,得到最终的模式,即概念模式。   

ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。

所有局部ER模式都设计好了后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部ER模式,而且必须合理地表示一个完整、一致的数据库概念结构。

1)确定公共实体类型

    为了给多个局部ER模式的合并提供开始合并的基础,首先要确定各局部结构中的公共实体类型。在这一步中我们仅根据实体类型名和键来认定公共实体类型。一般把同名实体类型作为公共实体类型的一类候选,把具有相同键的实体类型作为公共实体类型的另一类候选。

2)局部ER模式的合并

    合并的原则是:首先进行两两合并;先和合并那些现实世界中有联系的局部结构;合并从公共实体类型开始,最后再加入独立的局部结构。

3)消除冲突

    冲突分为三类:属性冲突、结构冲突、命名冲突。设计全局ER模式的目的不在于把若干局部ER模式形式上合并为一个ER模式,而在于消除冲突,使之成为能够被所有用户共同理解和接受的同一的概念模型。

3)全局ER模式的优化

    在得到全局ER模式后,为了提高数据库系统的效率,还应进一步依据处理需求对ER模式进行优化。一个好的全局ER模式,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体类型的个数要尽可能的少;实体类型所含属性个数尽可能少;实体类型间联系无冗余。

根据上述所示得出本系统的全局ER图如下:

 

2.3. 系统逻辑和物理设计

2.3.1数据库的设计

根据上面的数据库ER图,现在需要将上面的数据库概念结构转化为SQL Server2000数据库系统所支持的实际数据模型,也就是数据库的逻辑结构。在上面的实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。图书管理信息系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。

1.图书类别表

字段名

数据类型

说明

类别名称

文本

必添字段“是”,允许空字符为“否”

类别编号

文本

必添字段“是”,允许空字符为“否”

2.图书信息表

字段名

数据类型

说明

图书编号

文本

必添字段“是”,允许空字符为“否”

书名

文本

必添字段“是”,允许空字符为“否”

类别

文本

字段大小50

作者

文本

字段大小50

出版社

文本

字段大小50

出版日期

日期/时间

登记日期

日期/时间

是否借出

文本

字段大小2

3.借阅信息表

字段名

数据类型

说明

借阅编号

自动编号

读者编号

文本

字段大小50

读者姓名

文本

字段大小50

图书编号

文本

字段大小50

图书名称

文本

字段大小50

出借日期

日期/时间

4.读者信息表

字段名

数据类型

说明

读者姓名

文本

必添字段“是”,允许空字符为“否”

读者编号

文本

必添字段“是”,允许空字符为“否”

性别

文本

字段大小2

读者类别

文本

字段大小50

工作单位

文本

字段大小50

家庭住址

文本

字段大小50

电话号码

文本

字段大小50

登记日期

日期/时间

已借数量

数字

5.读者类别表                                                                                                                   

字段名

数据类型

说明

种类名称

文本

必添字段“是”,允许空字符为“否”

借书数量

数字

借书期限

数字

有限期限

数字

2.3.2数据库的维护

  由于应用环境不断变化,数据库运行过和中物理存储也会不断变化,对数据库设计进行调整,修改等维护工作是设计工作的继续和提高。对数据库经常性的维护工作主要包括:

1.    数据库的转储和恢复

针对不同的应用要求制定不同的转储计划,保证一旦发生故障能尽快将数据库恢复到某种一致的状态,尽可能减少对数据库的破坏。

2.    数据库的安全性、完整性控制

在数据库运行过程中由于应用环境的变化,对安全性的要求也会发生变化,如原来机密的数据现在可以公开查询了,新加入的数据又可能是机密的了。系统中用户的密级改变。这都需要根据实际情况修改原有的安全性控制,可以设置数据库密码及用户权限。同样,数据库的完整性的约束条件也会变化,需要DBA不断修正。

3.    数据库性能的监督、分析和改造

利用Microsoft SQL Server2000提供的检测系统性能参数的工具,在数据库运行过程中,监督数据进行分析,找出改进系统性能的方法,并做适当调整。

4.    数据库的重组及重构造

数据库运行一段时间后,由于记录不断增、删、改,增添、修改的数据不能为空,否则不能保存到数据库中。使数据库的物理存储情况变坏,降低了数据的存取效率,数据库性能下降,这时DBA要对数据库进行重组织,或部分重组织(只对频繁增、删的表进行重组织),可以利用Microsoft SQL Server2000专门提供的数据重组织实用程序操作,按原设计要求重新安排存储位置、回收垃圾、减少指针链等,提高系统性能。

有些情况,如由于数据库应用环境发生变化,增加了新的应用或新的实体,取消了某些应用,有的实体与实体间的联系发生变化,则需要调整数据库的模式及内模式。

4.3功能模块的实现

数据库设计

  这里的数据库采用Access,用ADO作为连接数据对象。

1、建立Access 数据库

  启动Access,建立一个空的数据库book.mdb,如图3所示。

  使用程序设计器建立系统需要的表格如下。

图书登记表,如图4所示。

  图3建立数据库book.mdb             图4 图书登记表

  图书借阅表,如图5所示。

图5 图书借阅表

  图书资料表,如图6所示。系统管理表,如图7所示。

  图6 图书资料表 

图7 系统管理表

    。

2、连接数据

  在Visual Basic环境下,选择“工程”→“引用”命令,在随后出现的对话框中选择“Microsoft ActiveX Data Objects 2.0 Library”,然后单击“确定”按钮,如图8所示。

  图8用ADO连接数据库

  在程序设计的公共模块中,先定义ADO连接对象。语句如下:

Public conn As New ADODB.Connection ’ 标记连接对象

  然后在子程序中,用如下的语句即可打开数据库:

Dim connectionstring As String

connectionstring = "provider=Microsoft.Jet.oledb.4.0;" &_

"data source=book.mdb"

conn.Open connectionstring

3、设置ODBC

VB的ADO对象是通过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。

打开控制面板中的“管理工具”→“数据源”(ODBC),出现如图9所示的对话框。 

  图9DBC对话框

  单击“添加”按钮,出现“创建新数据源”对话框,如图10。

  图10创建新数据源”对话框

  选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现如图11对话框。

  图11置连接数据源

  在“数据源名”文本框中添加一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。

界面设计

  设计好的界面如图12所示。

图12 图书管理系统界面

  这是一个多文档界面(MDI)应用程序,可以同时显示多个文档,每个文档显示在各自的窗体中。MDI 应用程序中常有包含子菜单的“窗体”选项,用于在窗体或文档之间进行切换。

  菜单应用程序中,有5个菜单选项,每个选项对应着E-R图的一个子项目。

1、创建主窗体  首先创建一个工程,命名为图书管理系统,选择“工程”→“添加MDI窗体”命令,则在项目中添加了主窗体。该窗体的一些属性如表1所示。

  表1 主窗体的属性

属 

性值

Caption

图书管理系统

Name

Main

Menu

Mainmenu1

Windowstate

Maxsize

Windowstate的值为Maxsize,即程序启动之后自动最大化。

  将“菜单”组件从“工具箱”拖到窗体上。创建一个 Text 属性设置为“文件”的顶级菜单项,且带有名为“关闭”的子菜单项。类似地创建一些菜单项,如表2所示。

  表2 菜 单 项 表

菜 单 名 称

Text属性

功 能 描 述

MenuItem1

图书管理

顶级菜单,包含子菜单

MenuItem2

图书类别

调出图书登记窗体

MenuItem3

图书信息

调出图书借阅窗体

MenuItem4

图书资料

顶级菜单,包含子菜单

MenuItem5

查询输出

调出查询输出窗体

MenuItem6

系统管理

顶级菜单,包含子菜单

MenuItem7

增加用户

调出用户窗体

MenuItem8

修改密码

调出密码窗体

MenuItem9

退出

系统退出

2、创建各子窗体

  选择“工程”→“添加窗体”命令,添加子窗体。

  在新建Visual Basic工程时自带的窗体中,将其属性MIDChild改成True,则这个窗体成为MID窗体的子窗体。

  在这个项目中,要创建的子窗体如表3所示。

  表3 所有子窗体

子 窗 体 名

Text

图书登记

frmdengji

图书借阅

frmjieyue

增加新用户

frmadduser

查询输出

frmfind

登录系统

frmlogin

修改密码

frmchangepwd

  下面分别给出这些子窗体,以及它们所使用的控件。

(1) 图书登记子窗体控件如表4所示。

表4 图书登记子窗体控件

控 件 类 别

控件Name

控件Text

Label

Label1

编号

Label2

书名

Label3

类型

Label4

购买日期

Label5

TextBox

Text1

(空)

Text2

(空)

Text3

(空)

Text4

(空)

Text5

(空)

CommandButton

Command1

Command2

ADO

DataAdodc1

(空)

DataGrid

DataGrid1

(空)

  图书借阅和图书赔偿子窗体分别,因为它们的控件与图书登记子窗体的雷同,在此不作介绍。

(2) 增加用户子窗体如图13所示,其控件如表5所示。

图13 增加用户子窗体

表5 增加用户子窗体控件

控 件 类 别

控件Name

控件Text

Label

Label1

输入用户名

Label2

输入密码

Label3

确认密码

TextBox

Text1

(空)

Text2

(空)

Text3

(空)

ComboBox

Comb1

选择权限

CommandButton

Commandl

确定

Command2

取消

(3) 修改密码子窗体如图14所示。

图14 修改密码子窗体

(4) 用户登录子窗体如图15所示。 

图15 用户登录子窗体 

(5) 添加读者类别如图16,其控件如表9所示。

  图16

建立公共模块

1、显示目录

  建立公共模块可以提高代码的效率,同时使得修改和维护代码都很方便。

  创建公共模块的步骤如下:

(1) 在菜单中选择“工程”→“添加模块”命令,则出现模块对话框,如图18所示。

(2) 选择模块图标后,单击“打开”按钮,则模块已经添加到项目中了。默认情况下名为Module1。

  图17 模块对话框

(3) 在模块中定义整个项目的公共变量。

Public conn As New ADODB.Connection ’ 标记连接对象

Public userID As String ’ 标记当前用户ID

Public userpow As String ’ 标记用户权限

Public find As Boolean ’ 标记查询

Public sqlfind As String ’ 查询语句

Public rs_data1 As New ADODB.Recordset

Public findok As Boolean

Public frmdata As Boolean

Public Const keyenter = 13 ’ enter键的ASCII码

  在主窗体添加完菜单之后,就要为各个子菜单创建事件处理程序。

主窗体代码

  在本项目中,子菜单事件都是Click事件,这里先给出主窗体部分的代码。

  下面是响应“增加用户”子菜单Click事件,调出增加用户窗体代码。

Private Sub add_admin_Click()

frmadduser.Show

End Sub

Private Sub add_back_book_Click()

frmbackbookinfo.Show

End Sub

Private Sub add_book_info_Click()

frmaddbookinfo.Show

End Sub

Private Sub add_book_style_Click()

frmaddbookstyle.Show

End Sub

Private Sub add_lend_book_Click()

frmfindbook.Show

End Sub

Private Sub add_reader_info_Click()

frmaddreaderinfo.Show

End Sub

Private Sub add_reader_style_Click()

frmaddreaderstyle.Show

End Sub

Private Sub change_pwd_Click()

frmchangepwd.Show

End Sub

Private Sub del_book_info_Click()

frmmodifybookinfo.Show

End Sub

Private Sub del_book_style_Click()

frmmodifybookstyle.Show

End Sub

Private Sub del_reader_info_Click()

frmreaderinfo.Show

End Sub

Private Sub del_reader_style_Click()

frmmodifyreaderstyle.Show

End Sub

Private Sub exit_sys_Click()

End

End Sub

Private Sub find_book_info_Click()

frmfindbook.Show

End Sub

Private Sub find_lend_book_Click()

frmfindborrowinfo.Show

End Sub

Private Sub find_reader_info_Click()

frmfindreader.Show

End Sub

Private Sub Form_Load()

End Sub

Private Sub modify_book_info_Click()

frmmodifybookinfo.Show

End Sub

Private Sub modify_book_style_Click()

frmmodifybookstyle.Show

End Sub

Private Sub modify_reader_info_Click()

frmreaderinfo.Show

End Sub

Private Sub modify_reader_style_Click()

frmmodifyreaderstyle.Show

End Sub

2、各子窗体的代码

(1) 图书登记子窗体代码

  本窗体用来填写图书登记的信息,用ADO来连接数据库,是本窗体的重点。采用MDI的子程序,所以运行后,它出现在主程序的界面下,如图18所示。

  图18 图书登记子窗体

  按钮控件要求先填写基本信息,然后与数据库信息比较。

Option Explicit

Private Sub Command1_Click()

Dim rs_addbook As New ADODB.Recordset

Dim sql As String

If Trim(Combo1.Text) = "" Then

   MsgBox "请选择图书种类", vbOKOnly + vbExclamation, ""

   Combo1.SetFocus

   Exit Sub

End If

If Trim(Text1.Text) = "" Then

   MsgBox "图书编号不能为空", vbOKOnly + vbExclamation, ""

   Text1.SetFocus

   Exit Sub

End If

If Trim(Text2.Text) = "" Then

   MsgBox "书名不能为空", vbOKOnly + vbExclamation, ""

   Text2.SetFocus

   Exit Sub

End If

   If Not IsDate(Text5.Text) Then

      MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""

      Text5.SetFocus

      Exit Sub

   End If

   If Not IsDate(Text6.Text) Then

      MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""

      Text6.SetFocus

      Exit Sub

   End If

sql = "select * from 书籍信息 where 书籍编号='" & Text1.Text & "'"

rs_addbook.Open sql, conn, adOpenKeyset, adLockPessimistic

If rs_addbook.EOF Then

   rs_addbook.AddNew

   rs_addbook.Fields(0) = Trim(Text1.Text)

   rs_addbook.Fields(1) = Trim(Text2.Text)

   rs_addbook.Fields(2) = Trim(Combo1.Text)

   rs_addbook.Fields(3) = Trim(Text3.Text)

   rs_addbook.Fields(4) = Trim(Text4.Text)

   rs_addbook.Fields(5) = Trim(Text5.Text)

   rs_addbook.Fields(6) = Trim(Text6.Text)

   rs_addbook.Fields(7) = "否"

   rs_addbook.Update

   MsgBox "添加书籍信息成功!", vbOKOnly, ""

   rs_addbook.Close

Else

   MsgBox "图书编号重复!", vbOKOnly + vbExclamation, ""

   Text1.SetFocus

   Text1.Text = ""

   rs_addbook.Close

   Exit Sub

End If

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim rs_leibie As New ADODB.Recordset

Dim sql As String

sql = "select * from 图书类别"

rs_leibie.Open sql, conn, adOpenKeyset, adLockPessimistic

rs_leibie.MoveFirst

Do While Not rs_leibie.EOF

  Combo1.AddItem rs_leibie.Fields(0)

  rs_leibie.MoveNext

Loop

rs_leibie.Close

End Sub

Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)

End Sub  图书借阅子窗体运行后如图19所示,因为它们的代码和图书登记子窗体的代码雷同,在此不做重复。

  图19 图书借阅子窗体运行效果  

(2) 增加用户子窗体代码

  增加用户子窗体是用来增加用户的用户名、密码和权限的。

  单击“确定”按钮后,还要返回一个信息框,提示成功信息,如图20所示。

  图20 增加用户子窗体运行效果                             

信息框

  窗体部分代码的思路是,收集输入的表中的字符串,然后与数据库中的系统的用户数据比较,如果不存在,则允许添加。

Private Sub Command1_Click()

Dim sql As String

Dim rs_add As New ADODB.Recordset

If Trim(Text1.Text) = "" Then

   MsgBox "用户名不能为空", vbOKOnly + vbExclamation, ""

   Exit Sub

   Text1.SetFocus

Else

   sql = "select * from 系统管理"

  rs_add.Open sql, conn, adOpenKeyset, adLockPessimistic

   While (rs_add.EOF = False)

        If Trim(rs_add.Fields(0)) = Trim(Text1.Text) Then

           MsgBox "已有这个用户", vbOKOnly + vbExclamation, ""

           Text1.SetFocus

           Text1.Text = ""

           Text2.Text = ""

           Text3.Text = ""

           Combo1.Text = ""

           Exit Sub

         Else

           rs_add.MoveNext

         End If

    Wend

    If Trim(Text2.Text) <> Trim(Text3.Text) Then

       MsgBox "两次密码不一致", vbOKOnly + vbExclamation, ""

       Text2.SetFocus

       Text2.Text = ""

       Text3.Text = ""

       Exit Sub

    ElseIf Trim(Combo1.Text) <> "system" And Trim(Combo1.Text) <> "guest" Then

       MsgBox "请选择正确的用户权限", vbOKOnly + vbExclamation, ""

       Combo1.SetFocus

       Combo1.Text = ""

       Exit Sub

    Else

       rs_add.AddNew

       rs_add.Fields(0) = Text1.Text

       rs_add.Fields(1) = Text2.Text

       rs_add.Fields(2) = Combo1.Text

       rs_add.Update

       rs_add.Close

       MsgBox "添加用户成功", vbOKOnly + vbExclamation, ""

       Unload Me

    End If

End If

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Form_Load()

Combo1.AddItem "system"

Combo1.AddItem "guest"

End Sub

(3) 修改密码子窗体代码

  修改密码子窗体是用来修改用户密码的。

  图21修改密码子窗体运行效果

  在“确定”按钮的Click事件中添加如下代码:

Private Sub Command1_Click()

Dim rs_chang As New ADODB.Recordset

Dim sql As String

If Trim(Text1.Text) <> Trim(Text2.Text) Then

MsgBox "密码不一致!", vbOKOnly + vbExclamation, ""

Text1.SetFocus

Text1.Text = ""

Text2.Text = ""

Else

sql = "select * from 系统管理 where 用户名=’" & userID & "’"

rs_chang.Open sql, conn, adOpenKeyset, adLockPessimistic

rs_chang.Fields(1) = Text1.Text

rs_chang.Update

rs_chang.Close

MsgBox "密码修改成功", vbOKOnly + vbExclamation, ""

Unload Me

End If

End Sub

图22

  在上述代码中,首先比较两个表中的数据是否一致,然后用rs_chang.Fields(1) = Text1.Text语句把代码输入到数据库中。最后,用MsgBox "密码修改成功", vbOKOnly + vbExclamation,""语句弹出一个信息框,告诉修改成功,如图22所示。

(4) 查询子窗体代码

  查询子窗体是用来查询库房中图书资料明细的。其运行效果如图23所示。

  图23 查询子窗体运行效果

Option Explicit

Dim panduan As String

Private Sub Command1_Click()

Dim rs_findbook As New ADODB.Recordset

Dim sql As String

If Check1.Value = vbChecked Then

   sql = "书名='" & Trim(Text1.Text & " ") & "'"

End If

If Check2.Value = vbChecked Then

   If Trim(sql) = "" Then

      sql = "类别='" & Trim(Combo1.Text & " ") & "'"

   Else

      sql = sql & "and 书名='" & Trim(Combo1.Text & " ") & "'"

   End If

End If

If Check3.Value = vbChecked Then

   If Trim(sql) = "" Then

      sql = "作者='" & Trim(Text2.Text & " ") & "'"

   Else

      sql = sql & "and  作者='" & Trim(Text2.Text & " ") & "'"

   End If

End If

If Check4.Value = vbChecked Then

   If Trim(sql) = "" Then

      sql = "出版社='" & Trim(Text3.Text & " ") & "'"

   Else

      sql = sql & "and  出版社='" & Trim(Text3.Text & " ") & "'"

   End If

End If

If Check5.Value = vbChecked Then

   If Trim(sql) = "" Then

sql = "书籍编号='" & Trim(Text4.Text & " ") & "'"

   Else

      sql = sql & "and  书籍编号='" & Trim(Text4.Text & " ") & "'"

   End If

End If

If Trim(sql) = "" Then

   MsgBox "请选择查询方式!", vbOKOnly + vbExclamation

   Exit Sub

End If

sql = "select * from 书籍信息 where " & sql

rs_findbook.CursorLocation = adUseClient

rs_findbook.Open sql, conn, adOpenKeyset, adLockPessimistic

DataGrid1.AllowAddNew = False

DataGrid1.AllowDelete = False

DataGrid1.AllowUpdate = False

Set DataGrid1.DataSource = rs_findbook

'rs_findbook.Close

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Command3_Click()

If Trim(book_num) = "" Then

   MsgBox "请选择要借阅的图书!", vbOKOnly + vbExclamation

   Exit Sub

End If

If panduan = "是" Then

   MsgBox "此书已被借出!", vbOKOnly + vbExclamation

   Exit Sub

End If

frmborrowbook.Show

End Sub

Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)

book_num = DataGrid1.Columns(0).CellValue(DataGrid1.Bookmark)

panduan = DataGrid1.Columns(7).CellValue(DataGrid1.Bookmark)

End Sub

Private Sub Form_Load()

Dim rs_find As New ADODB.Recordset

Dim sql As String

sql = "select * from 图书类别"

rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic

rs_find.MoveFirst

If Not rs_find.EOF Then

   Do While Not rs_find.EOF

      Combo1.AddItem rs_find.Fields(0)

      rs_find.MoveNext

   Loop

   Combo1.ListIndex = 0

End If

rs_find.Close

End Sub

查询完毕后,输出查询结果,如图24所示。

  显示目录

(6) 用户登录子窗体代码

    在本项目中,用户登录子窗体是运行的第一个界面,它的作用是检查用户名和密码是否正确。由于用户的资料是存放在数据库中,所以在启动该子窗体时,就已经连接了数据库。其代码如下:

Private Sub Form_Load()

Dim connectionstring As String

connectionstring = "provider=Microsoft.Jet.oledb.4.0;" & _

"data source=book.mdb"

conn.Open connectionstring

cnt = 0

End Sub

“确定”按钮的作用是检查输入的数据是否与数据库中的数据一致。

Private Sub Command1_Click()

Dim sql As String

Dim rs_login As New ADODB.Recordset

If Trim(txtuser.Text) = "" Then ’ 判断输入的用户名是否为空

MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""

txtuser.SetFocus

Else

sql = "select * from 系统管理 where 用户名=’" & txtuser.Text & "’"

rs_login.Open sql, conn, adOpenKeyset, adLockPessimistic

If rs_login.EOF = True Then

MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""

txtuser.SetFocus

Else ’ 检验密码是否正确

  用户名和密码通过后,要关闭本窗体并打开主窗体。

If Trim(rs_login.Fields(1)) = Trim(txtpwd.Text) Then

userID = txtuser.Text

userpow = rs_login.Fields(2)

rs_login.Close

Unload Me

MDIForm1.Show

Else

MsgBox "密码不正确", vbOKOnly + vbExclamation, ""

txtpwd.SetFocus

End If

End If

End If

’ 只能输入3次

cnt = cnt + 1

If cnt = 3 Then

Unload Me

End If

Exit Sub

End Sub

(7)查询借书信息如图25

如图27

代码如下:

Option Explicit

Private Sub Command1_Click()

Dim sql As String

Dim rs_find As New ADODB.Recordset

If Option1.Value = True Then

   sql = "select * from 书籍信息 where 是否被借出='是'"

End If

If Option2.Value = True Then

   sql = "select * from 书籍信息 where 是否被借出='否'"

End If

If Option3.Value = True Then

   sql = "select * from 借阅信息 where 读者姓名='" & Text1.Text & "'"

End If

   rs_find.CursorLocation = adUseClient

   rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic

   DataGrid1.AllowAddNew = False

   DataGrid1.AllowDelete = False

   DataGrid1.AllowUpdate = False

   Set DataGrid1.DataSource = rs_find

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Frame2_DragDrop(Source As Control, X As Single, Y As Single)

End Sub

此板块,可以查询已经借出的书,没有借出的书,也可以按读者姓名查询!!!

(8)还书信息如图26

如图26

代码如下:

Option Explicit

Dim findform As Boolean

Private Sub Combo1_Click()

Combo2.ListIndex = Combo1.ListIndex

End Sub

Private Sub Combo2_Click()

Combo1.ListIndex = Combo2.ListIndex

End Sub

Private Sub Combo3_Click()

Combo4.ListIndex = Combo3.ListIndex

End Sub

Private Sub Combo4_Click()

Combo3.ListIndex = Combo4.ListIndex

End Sub

Private Sub Command1_Click()

Dim rs_reader As New ADODB.Recordset

Dim sql As String

findform = True

sql = "select * from 借阅信息 where 读者姓名='" & Combo2.Text & "'"

rs_reader.CursorLocation = adUseClient

rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic

Set DataGrid1.DataSource = rs_reader

DataGrid1.AllowAddNew = False

DataGrid1.AllowDelete = False

DataGrid1.AllowUpdate = False

End Sub

Private Sub Command2_Click()

Dim rs_book As New ADODB.Recordset

Dim sql As String

findform = False

sql = "select * from 借阅信息 where 书籍编号='" & Combo3.Text & "'"

rs_book.CursorLocation = adUseClient

rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic

Set DataGrid1.DataSource = rs_book

DataGrid1.AllowAddNew = False

DataGrid1.AllowDelete = False

DataGrid1.AllowUpdate = False

End Sub

Private Sub Command3_Click()

Dim book_num As String

Dim reader_num As String

Dim answer As String

Dim rs_back As New ADODB.Recordset

Dim sql As String

On Error GoTo delerror

book_num = DataGrid1.Columns(3).CellValue(DataGrid1.Bookmark)

reader_num = DataGrid1.Columns(1).CellValue(DataGrid1.Bookmark)

answer = MsgBox("确定要还这本书吗?", vbYesNo, "")

If answer = vbYes Then

   sql = "select * from 借阅信息 where 书籍编号='" & book_num & "'"

   rs_back.CursorLocation = adUseClient

   rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic

   rs_back.Delete

   rs_back.Update

   rs_back.Close

   sql = "select * from 书籍信息 where 书籍编号='" & book_num & "'"

   rs_back.CursorLocation = adUseClient

   rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic

   rs_back.Fields(7) = "否"

rs_back.Update

   rs_back.Close

   sql = "select * from 读者信息 where 读者编号='" & reader_num & "'"

   rs_back.CursorLocation = adUseClient

   rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic

   rs_back.Fields(8) = rs_back.Fields(8) - 1

   rs_back.Update

   rs_back.Close

   If findform = True Then

      Command1_Click

   Else

      Command2_Click

   End If

   MsgBox "成功删除!", vbOKOnly + vbExclamation, ""

   DataGrid1.AllowDelete = False

Else

   Exit Sub

End If

delerror:

If Err.Number <> 0 Then

   MsgBox Err.Description

End If

End Sub

Private Sub Command4_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim rs_reader As New ADODB.Recordset

Dim rs_book As New ADODB.Recordset

Dim sql As String

sql = "select * from 读者信息"

rs_reader.CursorLocation = adUseClient

rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic

If Not rs_reader.EOF Then

   Do While Not rs_reader.EOF

      Combo1.AddItem rs_reader.Fields(1)

      Combo2.AddItem rs_reader.Fields(0)

      rs_reader.MoveNext

   Loop

End If

rs_reader.Close

sql = "select * from 借阅信息"

rs_book.CursorLocation = adUseClient

rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic

If Not rs_book.EOF Then

   Do While Not rs_book.EOF

      Combo3.AddItem rs_book.Fields(3)

      Combo4.AddItem rs_book.Fields(4)

      rs_book.MoveNext

   Loop

End If

rs_book.Close

End Sub

      Combo4.AddItem rs_book.Fields(4)

      rs_book.MoveNext

   Loop

End If

rs_book.Close

End Sub

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,关于图书销售管理系统数据库设计/实现,我可以给您提供一些思路和指导。 首先,我们需要确定系统的需求和功能,然后才能进行数据库设计。以下是一个简单的图书销售管理系统的功能: 1. 图书信息管理:包括图书的基本信息、库存信息、价格信息等。 2. 订单管理:记录订单信息,包括订单号、购买图书信息、购买数量、总价等。 3. 会员管理:记录会员信息,包括会员编号、姓名、联系方式、积分等。 4. 支付管理:记录支付信息,包括支付方式、支付金额、支付时间等。 5. 报表统计:统计销售数据,包括销售量、销售额、库存情况等。 根据以上功能,我们可以设计以下数据库表: 1. 图书信息表(book):包括图书编号、书名、作者、出版社、ISBN、价格、库存等字段。 2. 订单信息表(order):包括订单号、会员编号、订单时间、总价等字段。 3. 订单明细表(order_detail):包括订单号、图书编号、购买数量、单价等字段。 4. 会员信息表(member):包括会员编号、姓名、联系方式、积分等字段。 5. 支付信息表(payment):包括订单号、支付方式、支付金额、支付时间等字段。 以上是一个简单的数据库设计,您可以根据实际需求进行调整和改进。同时,在实现时,我们需要考虑到数据安全性、数据完整性、数据准确性等问题,可以采用数据库事务、数据备份等方式进行保护。 希望以上内容能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值