1、计算机图书管理系统【摘要】图书管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。经过分析,使用 Microsoft公司的 Visual Basic6.0为开发工具,利用其提供的各种面向对象的可视化开发平台作为开发工具,采用面向对象技术,图形化的应用开发环境,尤其是它有一个功能极其强大的集成环境提供级开发人员,使得开发人员可通过菜单、界面、图形浏览工具、对话框以及嵌入的各种生成器来轻松地完成各种复杂的操作。开发过程中不断修正和改进,直到形成用户满意的可行系统。本案例开发的是“计算机图书管理系统”.关键字(Keywords):信息管理系统(
2、MIS)、数据库、Visual Basic6.0、面向对象(Object)、计算机图书管理系统图书馆管理系统是我国大部分院校或其它部门不可缺少的部分,书籍是人类精神食粮,尤其对一些学校,图书馆来说,非常重要。在软件开发中,以计算机图书为主,称“计算机图书管理系统”。 计算机图书管理系统能够为用户实现借阅图书、管理等,随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对图书资源信息进行管理,具有着手工管理所无法比拟的优点.例如:查阅迅速、安全性高、可靠性高、存储量大、保密性好、成本低等。
3、计算机图书管理系统能够单一定向计算机图书方面,具有实用,精简功能等效率,这些优点能够极大地提高图书馆管理的效率,也是企业、学校的科学化、正规化管理,与世界接轨的重要条件。因此,开发这样一套管理软件是很有必要. 本案例开发的是“计算机图书管理系统”.一、 数据库设计( mdb )(一) 数据的概念办公软件Office套件中,最为广大用户熟悉的是Word和Excel,因为它们功能强大且方便易用,更因为它们不仅可用于办公,还可用于个人写作和家庭记帐理财等。同为Office套件中一部分的Access,虽然有着同样强大的功能,但使用的人却相对少些,不像Word和Excel那样广泛。事实上,真正用过Acc
4、ess的用户,对其强大功能和灵活应用均称赞有加。 Access 数据库管理系统是Microsoft Office 套件的重要组成部分,适用于小型商务活动,用以存贮和管理商务活动所需要的数据。Access不仅是一个数据库,而且它具有强大的数据管理功能,它可以方便地利用各种数据源,生成窗体(表单),查询,报表和应用程序等。 有结构的数据集合,它与一般的数据文件不同,(其中的数据是无结构的)是一串文字或数字流。数据库中的数据可以是文字、图象、声音等。 Access一种关系式数据库,关系式数据库由一系列表组成,表又由一系列行和列组成,每一行是一个记录,每一列是一个字段,每个字段有一个字段名,字段名在一
5、个表中不能重复。图1是一个“产品”表的例子。“产品”表由10个记录组成,一个记录占一行,每一个记录由产品ID、产品名称、库存量、订货量、单价和折扣率6个字段组成。“产品ID”是字段名,其下面的1,2等是字段的值。 表与表之间可以建立关系(或称关联,连接),以便查询相关联的信息。Access数据库以文件形式保存,文件的扩展名是MDB。 Access 数据库由六种对象组成,它们是表、查询、窗体、报表、宏和模块。 1. 表(Table)表是数据库的基本对象,是创建其他5种对象的基础。表由记录组成,记录由字段组成,表用来存贮数据库的数据,故又称数据表。 2. 数据查询(Query)查询可以按索引快速查
6、找到需要的记录,按要求筛选记录并能连接若干个表的字段组成新表。 3. 数据窗体(Form)窗体提供了一种方便的浏览、输入及更改数据的窗口。还可以创建子窗体显示相关联的表的内容。窗体也称表单。 4. 数据报表(Report)报表的功能是将数据库中的数据分类汇总,然后打印出来,以便分析。5. 数据宏(Macro)宏相当于DOS中的批处理,用来自动执行一系列操作。Access列出了一些常用的操作供用户选择,使用起来十分方便。 6. 数据模块(Module)模块的功能与宏类似,但它定义的操作比宏更精细和复杂,用户可以根据自己的需要编写程序。模块使用Visual Basic编程(二)计算机管图书管理系统
7、数据库 计算机管理系统图书管理系统数据库模式定义了数据库的结构、表、关系、域和业务规则。 数据库模式是一种设计,数据库和应用正是建立在此基础上的。域是一列可能拥有的值的集合。必须为每一个表的每一列确定域。除了数据的物理必填字段外,还需要确定是否有些域对表来说是唯一的。计算机管理系统图书管理系统数据库模式的最后一个要素是业务规则,它是对需要反映在数据库和数据库应用程序中的业务活动的允许空字符串。业务规则是模式的一个重要部分,因为他们指定了无论什么数据变化到达DBMS引擎,允许的数据值必须满足的允许空字符串。不管无效的数据变化请求是来自窗体的用户、查询/修改请求还是应用程序DBMS都应该拒绝。遗憾
8、的是,不同的DBMS产品用不同的方法实施业务规则。在某些情况下,DBMS产品不具备实施必要业务规则的能力,必须以代码形式把它们编入应用程序(三)利用DATA控件访问数据库该软件是利用ACCESS数据库,操作方便,简单。在ACCESS数据库中不需要创建数据连接,因为它是VB中默认的数据库形式。这里的数据库采用Access,用ADO作为连接数据对象。以归纳为以下几步:1. 建立Access 数据库启动Access,建立一个空的数据库ComputerBookmanage,如图8所示。使用程序设计器建立系统需要的表图书表:读者表用户借书表:用户表:2、连接数据在Visual Basic环境下,选择“工
9、程”“引用”命令,在随后出现的对话框中选择“Microsoft ActiveX Data Objects 2.0 Library”,然后单击“确定”按钮,如图:3.0引用ADO连接数据库在程序设计的公共模块中,先定义ADO连接对象。语句如下:Public conn As New ADODB.Connection 标记连接对象然后在子程序中,用如下的语句即可打开数据库:Dim connectionstring As Stringconnectionstring = provider=Microsoft.Jet.oledb.4.0; &_data source= ComputerBookmanag
10、e .mdbconn.Open connectionstring4.0 设置ODBCVB的ADO对象是通过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。打开控制面板中的“管理工具”“数据源”(ODBC),出现如图所示的对话框。图17 ODBC对话框单击“添加”按钮,出现“创建新数据源”对话框,如图18所示。5.0创建新数据源”对话框选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现如图19所示对话框。设置连接数据源 在“数据源名”文本框中添加一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。(
11、四)MDB数据流程图以及数据表 1.基本表:书籍 book字段类型字段大小必填字段允许空字符串管理人员文本50否是图书编号文本12是否图书名称文本16否是作者文本8否是出版社文本20否是库存量数字小数是是入库时间日期/时间自动否无2.基本表:用户表 user_table字段类型字段大小必填字段允许空字符串登录名文本16否是密码文本16否是身份文本50否是权限数字1否是3.基本表:读者表字段类型字段大小必填字段允许空字符串读者姓名文本8是主键读者编号数字50是否性别文本2否是读者类别文本50否是工作单位文本50否是家庭地址文本50否否电话号码文本50自动自动登记日期日期/时间自动自动自动已借书数
12、量数字自动自动自动4.基本表:职工信息 worker字段类型字段大小必填字段允许空字符串管理人员文本50否是工号数字50是否姓名文本8否是性别文本2否是电话数字13否是住址5.基本表:借阅信息 reader字段类型字段大小必填字段允许空字符串序号自动编号(长整型)主键工号文本250图书编号文本250借阅时间日期/时间长日期ADO中的数据对象通常保存的是查询结果。Record Set是ADO中最复杂的对象,有许多属性和方法。Record Set保存的是一行行的记录,并标有一个当前记录。以下是创建方法:可以直接利用DATA控件直接绑定,在DATA控件的属性中的RECORDSOURCE对数据表进行连
13、接。Set Record Set=DB.Openrecordset(sqtStr)这条语句创建并打开了对象Record Set,其中db是先前创建的链接对象,sqtStr是一个字串,代表一条标准的SQL语句。例如: sqlStr=“SELECT * FROM table1”Set Record Set=DB.Openrecordset(sqtStr),执行后,对象Record Set中就保存了表table1中的所有记录。二、 计算机图书管理系统数据(一) 数据库与VB的连接当数据设置好后就应用VB当中去,步骤:新建一个模块命名“ Database “在Database 添加代码, 数据库与VB
14、的连接代码(由于代码很长见光盘code目录下 “ database.txt”)(二)关闭数据对象和链接对象在使用了ADO对象之后要关闭它,因为它使用了一定的服务器资源。通过调用方法close实现关闭,然后再释放它。Record Set.closeSet Record Set=Nothing/关闭创建的数据对象mConn.closeSet mConn=Nothing/关闭创建的链接对象(三)显示数据库中的内容利用MSFLEGRID控件来显示数据库中的内容,可以直接通过DATA控件来实现操作,也可以利用代码来完成相关的操作。 sql = select * from book where 图书信息
15、= & Text1(0).Text & If sql Then Set rs = db.OpenRecordset(sql)(四)计算机图书管理系统数据流程图三、开发图书管理系统2008(一)开发计算机图书管理系统的目的计算机图书馆管理系统是我国大部分院校或其它部门不可缺少的部分,书籍是人类精神食粮,尤其对一些学校,图书馆来说,非常重要。图书馆管理系统能够为用户实现借阅图书、期刊、试卷合订本等,随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对图书资源信息进行管理,具有着手工管理所无
16、法比拟的优点.例如:查阅迅速、安全性高、可靠性高、存储量大、保密性好、成本低等。这些优点能够极大地提高图书馆管理的效率,也是企业、学校的科学化、正规化管理,与世界接轨的重要条件,因此,开发这样一套管理软件是很有必要。 (二)开发计算机图书管理系统的思路单从这一方面,开发图书管理系统需要从以下几个构思方面着手。1. 遐想遐想。即大胆地思维想象,在脑海形成一个框架,怎样去开发,如何去开发,开发有什么好处即影响。开发会遇到什么问题,怎样去解决.2. 绘图即将遐想的,用图象勾画出来,呈现模拟系统的功能.3准备材料准备事先制作好材料。如软件中所需要的图片。代码,软件图标(Ico)页面图片(bmp,jpg
17、).4. 开发“粮草好了,就动兵马” 意思是现实开发系统(如新建窗体,模块等).四、计算机图书管理系统模块设计(一)界面设计规范以及流程图(详细见页面)主界面:菜单栏、工具条、工作区(本系统采用SSTab页框)、状态栏等。(二)系统窗体汇总 窗体名称窗体类型简要说明FrmLogIn启动窗体系统登陆Form1MDI主窗体系统主窗体Form2模式窗体图书信息录入Form3MDI子窗体职工信息录入Form4模式窗体借书管理Form5模式窗体还书管理Form6模式窗体使用帮助Frm_sys_set模式窗体账号管理frmAbout模式窗体关于软件frmMsgMDI子窗体友情提示名称类型模块说明Datab
18、ase数据类型数据连接xp_canvas窗体窗体移动Xpcmdbutton按钮个性按钮Xphelp系统系统帮助Xptopbuttons系统最大化,最小化,关闭xpcmdbutton1按钮借书Xpcmdbutton2按钮还书Xpcmdbutton3按钮图书录入Xpcmdbutton4按钮职工录入Xpcmdbutton5按钮图书查询Xpcmdbutton6按钮借阅查询.(三)主窗体界面设计 主界面的设计采用标准无标题主窗口样式,自上而下依次为:菜单栏、工具条、工作区(本系统采用SSTab页框)、状态栏等。所有系统用户拥有相似的主界面。主界面包含基本的或共享的功能,如书目浏览与检索,基本统计等。代码
19、见code目录下:main.txt主界面如代码所示:Option Explicit定义查询字段的窗体级变量定义查询的字段窗体变量Dim sfield As String 查询的关键词Dim seachtext As String 查询函数定义 1、桉书号查询则采用具体查询办法 2、按书名查询则采用模糊查询办法Function open_seach(table_name As String, sfield As String, seachtext As String) As IntegerDim sqlstr As StringDim str As String 建立数据库连接 Set con
20、= New ADODB.Connection Set rst = New ADODB.Recordset con.CursorLocation = adUseClient sqlstr = Provider=Microsoft.Jet.OLEDB.4.0; + Data Source= + App.Path + dataComputerBookmanage.mdb + ;Persist Security Info=False con.Open sqlstr 查询办法选择 If Option1.Value = True Then str = select * from & table_name
21、& where & sfield & = & seachtext & Else str = select * from & table_name & where & sfield & like & Trim( % & Text1.Text & %) & End If If Option3.Value = True Then str = select * from & table_name & where & sfield & = & seachtext & Else str = select * from & table_name & where & sfield & like & Trim(
22、 % & Text1.Text & %) & End If rst.Open str, con, adOpenDynamic, adLockOptimistic rst.Requery If rst.RecordCount 0 Then open_seach = 1 返回一个值1,代表有查询结果 Else open_seach = 0 返回一个值0,代表没有查询结果 End If End FunctionPrivate Sub Check4_Click()选择查询的字段Select Case TabStrip1.SelectedItem Case 图书信息浏览: sfield = 出版社End
23、 SelectEnd SubPrivate Sub Command1_Click()If rst.BOF = True ThenfrmMsg.ShowfrmMsg.info.Visible = True frmMsg.Text1.Text = 已经到达第一条记录了!Exit SubElserst.MovePreviousEnd IfEnd SubPrivate Sub Command2_Click() 后一记录If rst.EOF = True ThenfrmMsg.ShowfrmMsg.info.Visible = True frmMsg.Text1.Text = 已经到达最后一条记录了!E
24、xit SubElserst.MoveNextEnd IfEnd SubPrivate Sub DataGrid2_Click()Call connect_dbopen_connection (book) 连接book表 tablename = book If privilege = 1 Then 如果只是普通用户,无法查询员工信息 frmMsg.Show frmMsg.error.Visible = True frmMsg.Text1.Text = 对不起,您没有查阅的权限! Exit Sub End If open_connection (worker) 连接worker表 tablena
25、me = worker open_connection (record) 连接record表 tablename = record Set DataGrid1.DataSource = rst End Sub Private Sub Command4_Click()Dim ret As IntegerIf Command4.Caption = 查 询 Then Command4.Caption = 确 定Else If Option1.Value = False And Option2.Value = False And Option3.Value = False And Option4.Va
26、lue = False Then frmMsg.Show frmMsg.notice.Visible = True frmMsg.Text1.Text = 请选择查询项! Exit Sub End If If Text1.Text = Then frmMsg.Show frmMsg.notice.Visible = True frmMsg.Text1.Text = 请输入查询内容! Text1.SetFocus Exit Sub End If seachtext = Trim(Text1.Text) ret = open_seach(tablename, sfield, seachtext)
27、If ret = 0 Then frmMsg.Show frmMsg.error.Visible = True frmMsg.Text1.Text = 对不起,没有你要的记录! Option1.Value = False Option2.Value = False Text1.Text = rst.Close Set rst = Nothing Set DataGrid1.DataSource = rst Command1.Enabled = False 上一条,下一条按钮为灰 Command2.Enabled = False Command4.Caption = 查 询 Exit Sub E
28、nd If Command1.Enabled = True Command2.Enabled = True Set DataGrid1.DataSource = rst Text1.Text = Option1.Value = False Option2.Value = False Command4.Caption = 查 询End If End SubPrivate Sub DataGrid1_Click()Call connect_dbopen_connection (book) 连接book表 tablename = book If privilege = 1 Then 如果只是普通用户
29、,无法查询员工信息 frmMsg.Show frmMsg.error.Visible = True frmMsg.Text1.Text = 对不起,您没有查阅的权限! Exit Sub End If open_connection (worker) 连接worker表 tablename = worker open_connection (record) 连接record表 tablename = record Set DataGrid1.DataSource = rstEnd SubPrivate Sub Form_Load()Option1.Caption = 书号Option2.Capt
30、ion = 书名Option3.Caption = 出版社Option4.Caption = 作者Label2.Caption = frmLogin.Text1.TextTimer1.Interval = 1000tablename = bookCall connect_dbopen_connection (book)Set DataGrid1.DataSource = rstTabStrip1.Tabs.Item(1) = 图书信息浏览TabStrip1.Tabs.Item(2) = 员工信息浏览TabStrip1.Tabs.Item(3) = 图书借阅情况浏览Text1.Text = op
31、en_connection (book)Set DataGrid1.DataSource = rstfrmLogin.ShowEnd SubPrivate Sub Image1_Click()End SubPrivate Sub Option1_Click()Select Case TabStrip1.SelectedItem Case 图书信息浏览: sfield = 图书编码 Case 员工信息浏览: sfield = 工号 Case 图书借阅情况浏览: sfield = 图书编码End SelectEnd SubPrivate Sub Option2_Click()选择查询的字段Sele
32、ct Case TabStrip1.SelectedItem Case 图书信息浏览: sfield = 图书名称 Case 员工信息浏览: sfield = 姓名 Case 图书借阅情况浏览: sfield = 工号End SelectEnd SubPrivate Sub Option3_Click()选择查询的字段Select Case TabStrip1.SelectedItem Case 图书信息浏览: sfield = 出版社End SelectEnd SubPrivate Sub Option4_Click()选择查询的字段Select Case TabStrip1.Selecte
33、dItem Case 图书信息浏览: sfield = 作者End SelectEnd SubPrivate Sub Text2_Change()Text1.Text = TimeEnd SubPrivate Sub TabStrip1_Click()Call connect_dbSelect Case TabStrip1.SelectedItem Case 图书信息浏览: open_connection (book) 连接book表 tablename = book Option1.Caption = 书号 Option2.Caption = 书名 Set DataGrid1.DataSou
34、rce = rst Case 员工信息浏览: If privilege = 1 Then 如果只是普通用户,无法查询员工信息 frmMsg.Show frmMsg.error.Visible = True frmMsg.Text1.Text = 对不起,您没有查阅的权限! Exit Sub End If open_connection (worker) 连接worker表 Option1.Caption = 工号 Option2.Caption = 姓名 tablename = worker Set DataGrid1.DataSource = rst Case 图书借阅情况浏览: open_
35、connection (record) 连接record表 Option1.Caption = 书号 Option2.Caption = 工号 tablename = record Set DataGrid1.DataSource = rstEnd SelectEnd SubPrivate Sub Timer1_Timer()Label3.Caption = NowEnd SubPrivate Sub xpcmdbutton1_Click()Form4.ShowEnd SubPrivate Sub xpcmdbutton12_Click()Form6.ShowEnd SubPrivate Su
36、b xpcmdbutton13_Click()frmAbout.ShowEnd SubPrivate Sub xpcmdbutton14_Click()Unload MefrmLogin.ShowEnd SubPrivate Sub xpcmdbutton15_Click()open_connection readertablename = readerSet DataGrid1.DataSource = rstEnd SubPrivate Sub xpcmdbutton2_Click()Form5.ShowEnd SubPrivate Sub xpcmdbutton3_Click()Form
37、2.ShowEnd SubPrivate Sub xpcmdbutton4_Click()Form3.ShowEnd SubPrivate Sub xpcmdbutton5_Click()open_connection (book)tablename = recordSet DataGrid1.DataSource = rstEnd SubPrivate Sub xpcmdbutton6_Click()open_connection (record)tablename = recordSet DataGrid1.DataSource = rstEnd SubPrivate Sub xpcmdb
38、utton7_Click()open_connection (worker)tablename = workerSet DataGrid1.DataSource = rstEnd SubPrivate Sub xpcmdbutton8_Click()Frm_sys_set.ShowEnd SubPrivate Sub xpmin_Click()Me.WindowState = 1End SubPrivate Sub xpclose_Click()Unload MefrmLogin.ShowEnd SubPrivate Sub xptopbuttons1_Click()Unload MeEnd
39、SubPrivate Sub xptopbuttons2_Click()Me.WindowState = 1End Sub1. 用户登陆 该窗体主要完成用户管理登陆功能,也是进入系统的一个重要的门槛,该门槛是有权限限制,根据不同的用户帐号,功能也截然不同,这就是本系统的一个关键点。(默然读者帐号;reader 密码;008)代码见code目录下:login.txtPrivate Sub Form_Load() 连接用户表Call open_connection(user_table)xpcmdbutton1.Caption = 登陆xpcmdbutton2.Caption = 注销End Su
40、bPrivate Sub Image1_Click()End SubPrivate Sub xpcmdbutton1_Click() 登录系统Dim sql As StringIf Trim(Text1.Text) = Then 如果文本框为空,则给出提示 frmMsg.Show frmMsg.notice.Visible = True frmMsg.Text1.Text = 请输入用户登录账号! Exit SubElse sql = select * from user_table where 登录名= & Trim(Text1.Text) & 查找用户登录名 rst.Close rst.O
41、pen sql, con, adOpenDynamic, adLockOptimistic If rst.RecordCount = 0 Then frmMsg.Show frmMsg.error.Visible = True frmMsg.Text1.Text = 用户名不存在! Exit Sub End If 用户合法性检测并赋予一定的权限级别 If LCase(Trim(rst!登录名) = LCase(Trim(Text1.Text) Then If Trim(rst!密码) = Trim(Text2.Text) Then privilege = rst!权限 Call check_privage(privilege) 权限分配 Else frmMsg.Show frmMsg.error.Visible = True frmMsg.Text1.Text = 密码错误,请重新输入!