图书馆管理系统
数据库设计报告
目录
一、 设计背景................................................................................... 1
二、 需求分析................................................................................... 1
2.1系统目标................................................................................ 1
2.2需求定义................................................................................ 1
2.3数据流图................................................................................ 2
2.4数据字典................................................................................ 3
三、 功能说明................................................................................. 10
四、 概念结构设计......................................................................... 11
4.1 分ER图.............................................................................. 12
4.2总ER图 ............................................................................. 12
五、 逻辑结构设计......................................................................... 13
六、 物理结构设计......................................................................... 14
七、 设计人员................................................................................. 16
正文
一、设计背景
随着我国市场经济的迅速发展和人们生活水平的不断提高,图书馆藏书的树木逐渐增大,这也挑战了图书管理方面的技术,以前的人工管理方式已经不再适应现在的环境,取而代之的是先进的图书管理系统,通过使用Access创建的图书管理系统可以让管理人员方便而快捷的进行管理、查询、借阅、录入等工作。
图书管理工作面对大量的可模块化处理的信息,是当今信息革命的一个重要阵地。我们小组开发图书管理信息系统就是采用现代化的信息管理方式代替手工管理方式,提高图书管理工作效率,作到信息的规范管理,科学统计和快速查询,让图书馆更好的为学校,社会服务。
二、需求分析
1.1 系统目标
图书管理信息系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强.数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。
系统开发的总体任务是实现各种信息的系统化,规范化和自动化。
1.2 需求定义
图书馆管理系统开发。系统开发的总的设计目标是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理。
本系统主要实现对图书馆信息的管理,主要功能为管理有关读者、图书、借阅、查询、删除和管理员的信息等。本系统结构分为读者信息管理、图书信息管理,读者管理可以浏览读者的信息,可以对读者信息进行维护。图书管理可以浏览图书的信息,可以对图书信息进行维护。借阅管理可以显示当前数据库中书籍借阅情况,可以对借阅信息进行维护。本系统主要解决的问题是利用关键字对数据库进行查询。
1.3 数据流图
1.3.1 总数据流图
1.3.2入库处理
1.3.3借书处理
1.3.4还书处理
1.2 数据字典
3.1数据项
数据项名: 借阅者姓名
数据项含义说明:借阅者姓名
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:借阅者姓名
数据项名: 借书卡号
数据项含义说明:借阅者借书卡号
别名:无
数据类型: 字符型
长度:10
取值范围:0000000000-9999999999
取值含义:借阅者借书卡号
数据项名: 班级
数据项含义说明:借阅者所属班级
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:借阅者所属班级名称
数据项名: 院系
数据项含义说明:借阅者所属院系
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:借阅者所属院系名称
数据项名: 管理员编号
数据项含义说明:管理员编号
别名:无
数据类型: 字符型
长度:10
取值范围:0000000000-9999999999
取值含义:管理员编号
数据项名: 管理员姓名
数据项含义说明:管理员姓名
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:管理员姓名
数据项名: 负责书库
数据项含义说明:管理员所负责书库
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:管理员所负责书库名称
数据项名: 图书编号
数据项含义说明: 图书编号
别名:借书编码
数据类型: 字符型
长度:10
取值范围:0000000000-9999999999
取值含义:图书编号
数据项名: 书名
数据项含义说明:书名
别名:无
数据类型: 字符型
长度:20
取值范围:任意字符
取值含义:图书名称
数据项名: 作者名称
数据项含义说明: 作者名称
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:作者名称
数据项名: 出版社
数据项含义说明: 出版社名称
别名:无
数据类型: 字符型
长度:20
取值范围:任意字符
取值含义:出版社名称
数据项名:出库日期
数据项含义说明: 图书出库日期
别名:借出日期
数据类型: 字符型
长度:8
取值范围:00000000-99999999
取值含义:YYYY-MM-DD
数据项名: 入库日期
数据项含义说明: 图书入库日期
别名:无
数据类型: 字符型
长度:8
取值范围:00000000-99999999
取值含义:YYYY-MM-DD
数据项名: 所存书库
数据项含义说明: 图书所存书库
别名:无
数据类型: 字符型
长度:10
取值范围:任意字符
取值含义:图书所存书库名
数据项名: 在库量
数据项含义说明: 图书在库量
别名:无
数据类型: 字符型
长度:5
取值范围:00000-99999
取值含义:图书在库数量
数据项名: 出版日期
数据项含义说明: 图书出版日期
别名:无
数据类型: 字符型
长度:8
取值范围:0000000-99999999
取值含义:YYYY-MM-DD
数据项名: 到期日期
数据项含义说明: 借阅到期日期
别名:无
数据类型: 字符型
长度:8
取值范围:00000000-99999999
取值含义:图书借阅到期日期
数据项名: 拖欠日期
数据项含义说明: 图书拖欠日期
别名:无
数据类型: 字符型
长度:5
取值范围:00000-99999
取值含义:图书拖欠天数
数据项名: 罚款数目
数据项含义说明: 罚款数目
别名:无
数据类型: 字符型
长度:5
取值范围:00000-99999
取值含义:图书拖欠罚款数目
数据项名: 销书数量
数据项含义说明: 销书数量
别名:无
数据类型: 字符型
长度:5
取值范围:00000-99999
取值含义:图书销毁数量
数据项名: 销书日期
数据项含义说明: 销书日期
别名:无
数据类型: 字符型
长度:8
取值范围:00000000-99999999
取值含义:YYYY-MM-DD
3.2数据结构
数据结构名:借阅者
含义说明:借阅者信息
组成:借阅者姓名,借书卡号,班级,院系
数据结构名: 管理员
含义说明: 管理员信息
组成: 管理员编号,管理员姓名,负责书库
数据结构名: 借书清单
含义说明: 借书信息
组成:借书卡号,借书编码,借出日期,到期日期,拖欠日期
数据结构名: 罚款清单
含义说明: 罚款信息
组成:管理员编号,借书卡号,借书编号,罚款数目
数据结构名: 图书
含义说明: 图书信息
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
数据结构名: 销书清单
含义说明: 销书信息
组成:图书编号,图书名称,日期,数量
3.3数据流
数据流名:借书卡
说明:借阅者信息
数据流来源:借阅者
数据流去向:借书处理
组成:借阅者姓名,借书卡号,班级,院系
平均流量:50
高峰期流量:100
数据流名:图书
说明:借阅图书信息
数据流来源:借书处理
数据流去向:借阅者
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
平均流量:50
高峰期流量:100
数据流名:还书
说明:借阅者还书
数据流来源:借阅者
数据流去向:还书处理
组成:借阅者姓名,借书卡号,班级,院系
平均流量:50
高峰期流量:100
数据流名:不合格的借书卡
说明:借书卡无法使用
数据流来源:借书处理
数据流去向:借阅者
组成:借阅者姓名,借书卡号,班级,院系
平均流量:50
高峰期流量:100
数据流名:借书清单
说明:借出书目信息
数据流来源:借书处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
平均流量:50
高峰期流量:100
数据流名:还书清单
说明:归还书目信息
数据流来源:还书处理
数据流去向:图书库存情况存档
组成:借书卡号,借书编码,借出日期,到期日期,拖欠日期
平均流量:50
高峰期流量:100
数据流名:入库新书清单
说明:入库新书信息
数据流来源:管理员
数据流去向:新书入库处理
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
平均流量:20
高峰期流量:50
数据流名:库存清单
说明:库存图书信息
数据流来源:新书入库处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
平均流量:20
高峰期流量:50
数据流名:销书计划
说明:销毁图书信息
数据流来源:管理员
数据流去向:销书处理
组成:图书编号,图书名称,日期,数量
平均流量:10
高峰期流量:25
数据流名:销书清单
说明:销毁图书目录
数据流来源:销书处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
平均流量:10
高峰期流量:25
三、 功能说明
本系统需要完成的功能主要有6部分:
(1)实现对图书信息的修改,包括定义、查询、更新、删除等操作
图书信息包括图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库。入库日期,出库日期等。
(2)实现对借阅者信息的修改,包括定义、查询、更新、删除等操作
借阅者信息包括借书卡号,姓名,班级,院系等。
(3) 实现借书功能。
1.借书信息的输入,包括借书卡号,图书编号,借出日期,到期日期,拖欠日期,罚款数目等。
2.借书信息的查询,修改,包括图书编号,借书卡号,借阅者姓名,图书名称,借出日期等。
(4) 实现还书功能
1.还书信息的输入,包括图书编号,借书卡号,借阅者姓名,图书名称,借出日期等。
2.还书信息的查询和修改,包括还书信息编号,读书编号,读者姓名,书籍编号,书籍名称,借书日期,还书日期,备注信息等。
(5)实现销书功能
对不符合要求的图书进行出库处理,包括图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库。入库日期,出库日期等。
(6)实现对管理员信息的修改,包括定义、查询、更新、删除等操作
管理员信息包括编号,姓名,负责书库等。
系统功能结构图
四、概念结构设计
4.1实体及其属性图
1、图书信息模块
2、借阅者信息模块
3、图书管理员信息模块
4、销书单模块
4.2实体及其联系图
4.3完整的E-R图
五、逻辑结构设计
从理论‘E-R模型’到理论‘关系模型’的整理转换,通过E-R模型到关系模型的转化,可以得到如下关系模式:
借阅者(借书卡号,姓名,班级,院系)
管理员(编号,姓名,负责书库)
图书(图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期)
借阅(借书卡号,图书编号,借出日期,到期日期,拖欠日期,罚款数目)
销书清单(管理员编号,图书编号,图书名称,销书日期,销书数量)
管理(管理员编号,借书卡号,图书编号)
六 物理结构设计
概念结构设计所得的E-R模型是对用户需求的一种抽象的表达形式,它独立于任何一种具体的数据模型,因而也不能为任何一个具体的DBMS所支持。为了能够建立起最终的物理系统,还需要将概念结构进一步转化为DBMS所支持的关系模型。这就是数据库逻辑设计所要完成的任务。
用sql2005建立数据库数据表。
(1)打开sql2005 在数据库上点击右键
(2)选择新建数据 数据库名取做db_TSGL
(3)在db_TSGL中“表”选项上右键选择新建表
进入表的字段设置
(4)表的字段设置如下图
借阅者基本信息表 管理员信息表
图书信息表
借阅信息表销书信息表
管理信息表
第二篇:数据库设计报告-图书管理系统
数据库课程设计
一、引言
1.设计目的
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。课程设计的目的:
1. 加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平;
2. 在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;
3. 学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;
4. 为毕业设计和以后工作打下必要基础。
2.设计要求
运用数据库基本理论与应用知识,在微机RDBMS(SQL Server)的环境上建立一个数据库应用系统。要求把现实世界的事物及事物之间的复杂关系抽象为信息世界的实体及实体之间联系的信息模型,再转换为机器世界的数据模型和数据文件,并对数据文件实施检索、更新和控制等操作。
1.用E-R图设计选定题目的信息模型;
2.软件定义:图书管理系统系统
图书馆管理系统
包括四大模块:
ü 图书的查询
ü 借书
ü 还书
ü 图书的预约
3、设计相应的关系模型,确定数据库结构;
图书(索书号,书名,分类,出版社,作者,年份,价格,藏书总数,现存数)
借书证(借书证号,姓名,单位,组别)
管理员(管理员ID,姓名,密码,联系方式)
借阅( 借书证号,索书号,借书时间,还书时间,操作员) 预约( 借书证号,索书号,预约时间,操作员)4、通过设计关系的主码约束、外码约束和使用CHECK实现完整性控制;
Book(book_ISBN,book_name,book_subject,book_author,book_year,book_price ,book_total_num ,book_stocked_num )
Card(card_num, name,unit,rank)
Admin(admin_id,admin_password,admin_name,admin_contact)
Borrow(card_num,book_ISBN,borrow_date,return_date,admin_id)
Order(card_num,book_ISBN,order_date,admin_id)
5.分析关系模式各属于第几范式,阐明理由;
图书 属于BCNF,因为其中的每个决定因素都包含了码
借书证 属于BCNF,因为其中的每个决定因素都包含了码
管理员 属于BCNF,因为其中的每个决定因素都包含了码
借阅 属于BCNF,因为其中的每个决定因素都包含了码
预约 属于BCNF,因为其中的每个决定因素都包含了码
6.开发环境:VC++,SQL Server 通过ODBC连接
二、详细设计
1、数据库设计;
建立admin表
CREATE TABLE [dbo].[admin](
[admin_id] [nchar](10) NOT NULL,
[admin_password] [nchar](10) NULL,
[admin_name] [nchar](10) NOT NULL,
[admin_contact] [nchar](15) NULL,
PRIMARY KEY CLUSTERED
([admin_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
建立book表
CREATE TABLE [dbo].[book](
[book_ISBN] [nchar](10) NOT NULL,
[book_subject] [nchar](10) NULL,
[book_title] [nchar](10) NULL,
[book_press] [nchar](10) NULL,
[book_year] [int] NULL,
[book_authors] [nchar](10) NULL,
[book_price] [numeric](5, 2) NULL,
[book_total_num] [int] NULL,
[book_stocked_num] [int] NULL,
PRIMARY KEY CLUSTERED
([book_ISBN] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
建立card表
CREATE TABLE [dbo].[card](
[card_num] [nchar](10) NOT NULL,
[name] [nchar](10) NOT NULL,
[unit] [nchar](15) NULL,
[rank] [nchar](10) NULL,
PRIMARY KEY CLUSTERED
([card_num] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
ALTER TABLE [dbo].[card] WITH CHECK ADD CONSTRAINT [c1] CHECK (([rank]='教师' OR [rank]='研究生' OR [rank]='本科生'))
ALTER TABLE [dbo].[card] CHECK CONSTRAINT [c1]
建立borrow表
CREATE TABLE [dbo].[borrow](
[card_num] [nchar](10) NOT NULL,
[book_ISBN] [nchar](10) NOT NULL,
[borrow_date] [date] NULL,
[return_date] [date] NULL,
[admin_id] [nchar](10) NULL,
FOREIGN KEY([admin_id])REFERENCES [dbo].[admin] ([admin_id])
FOREIGN KEY([admin_id])REFERENCES [dbo].[admin] ([admin_id])
FOREIGN KEY([book_ISBN])REFERENCES [dbo].[book] ([book_ISBN])
FOREIGN KEY([book_ISBN])REFERENCES [dbo].[book] ([book_ISBN])
FOREIGN KEY([card_num])REFERENCES [dbo].[card] ([card_num])
)
建立order表
CREATE TABLE [dbo].[order](
[card_num] [nchar](10) NOT NULL,
[book_ISBN] [nchar](10) NOT NULL,
[order_date] [date] NULL,
[admin_id] [nchar](10) NULL,
PRIMARY KEY CLUSTERED
([card_num] ASC,[book_ISBN] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
2、图书管理系统实现与截图
窗口界面
借书模块部分程序
void CBookBorrowDlg::OnOK()
{//将编辑框中的数据更新到成员变量m_strCardNum和m_strBookNum中
UpdateData();
if(m_strCardNum==""){AfxMessageBox("请输入借书证号!");return ; }
if(m_strBookNum==""){
AfxMessageBox("请输入索书号!");
return ;
}
//如果卡号不存在,则拒绝借书
if(! IsValidCard(m_strCardNum)){
// CDialog::OnOK();//调用基类CDialog的OnOK函数来关闭对话框
AfxMessageBox("读者未找到您的注册信息!");
return;
}
//如果有书到期,也返回
if(AnyBookExpired(m_strCardNum)){
// CDialog::OnOK();
return;
}
//如果要借的书没有库存,也返回
if(! AllowedToBorrow(m_strBookNum)){
// CDialog::OnOK();
return ;
}
//以上都没有问题,才能外借图书
if(BorrowBook(m_strCardNum,m_strBookNum)){
AfxMessageBox("借书成功");
}
else{
AfxMessageBox("借书失败");
}
CDialog::OnOK();
}
bool CBookBorrowDlg::IsValidCard(const CString &card_num)
{
//检查card表是否打开
if(! m_cardSet.IsOpen()){
m_cardSet.Open();
}
//指定查询条件card_num为用户卡号
m_cardSet.m_strFilter.Format("card_num='%s'",card_num);
m_cardSet.Requery();
//结果集如果为空则表示卡号不存在
if(m_cardSet.IsEOF()){
AfxMessageBox("该卡号不存在");
return false;
}
return true;
}
bool CBookBorrowDlg::AnyBookExpired(const CString &card_num)
{
if(!m_borrowSet.IsOpen()){
m_borrowSet.Open();
}
m_borrowSet.m_strFilter.Format("card_num='%s' and return_date is null",card_num);
m_borrowSet.Requery();
CTime today=CTime::GetCurrentTime(); //得到今天的日期
CTimeSpan diffDays;
while (!m_borrowSet.IsEOF())
{
diffDays=today-m_borrowSet.m_borrow_date; //计算已借图书的时间
if(diffDays.GetDays()>30){
AfxMessageBox("您有书过期了,请尽快还书!"); //超过30天,则报错返回
return true;}
m_borrowSet.MoveNext();}
return false;}
bool CBookBorrowDlg::AllowedToBorrow(const CString &book_ISBN)
{ if(!m_bookSet.IsOpen()){
m_bookSet.Open();}
//指定查询条件book_ISBN
m_bookSet.m_strFilter.Format("book_ISBN='%s'",book_ISBN);
m_bookSet.Requery();
//结果集为空则表明该书不存在
if(m_bookSet.IsEOF()){
AfxMessageBox("该书不存在");
return false; }
if(m_bookSet.m_book_stocked_num==0){
AfxMessageBox("该书已经被借空!");
return false; }
return true;}
bool CBookBorrowDlg::BorrowBook(const CString &card_num, const CString &book_ISBN)
{ if(! m_bookSet.IsOpen()){
m_bookSet.Open();}
m_bookSet.m_strFilter.Format("book_ISBN='%s'",book_ISBN); m_bookSet.Requery();
//将book表中书的库存-1
m_bookSet.Edit();
m_bookSet.m_book_stocked_num=m_bookSet.m_book_stocked_num-1;
m_bookSet.Update();
//在borrow表中增加一条借书记录
if(! m_borrowSet.IsOpen()){
m_borrowSet.Open();
}
m_borrowSet.AddNew();
m_borrowSet.m_card_num=card_num;
m_borrowSet.m_book_ISBN=book_ISBN;
m_borrowSet.m_borrow_date=CTime::GetCurrentTime();
m_borrowSet.m_admin_id=admin;
m_borrowSet.Update();
m_borrowSet.Requery();
return true;
}
void CBookBorrowDlg::OnBorrowlist()
{
UpdateData();
if(m_strCardNum==""){
AfxMessageBox("请输入卡号!");
return ; }
cardnum=m_strCardNum;
CBorrowListDlg borrowlist; //构造“借书记录”对话框
borrowlist.DoModal(); //显示“借书记录”对话框
}
批量入库部分代码
void CBookEnrollDlg::OnOK()
{
int i;
string str;
string s="";
char tmp[100];
CString m_book_ISBN;
CString m_book_subject;
CString m_book_title;
CString m_book_press;
int m_book_year;
CString m_book_authors;
double m_book_price;
int m_book_total_num;
UpdateData();
ifstream file;
if(m_address.IsEmpty())
{AfxMessageBox("不能为空");}
else
{file.open(m_address);//打开文件
if(!file)
{AfxMessageBox("文件打开失败!"); }
if(file){while(getline(file,str,'\n')
//用getline函数读取文件中的每一行
{ int k=0;
int m=0;
int j=0;
int total=0;
int a;
int b=0;
double price=0;
for(i=0;i<=7;i++)
{ a=0;
while(str[b]!=','&&str[b]){
//读取每一行中的内容,以遇到','为结束
tmp[a]=str[b];
b++;
a++;
}
b++;
tmp[a]='\0';
s=tmp;
//调用c_str()函数把string类型转换为cstring类型
switch(i){
case 0:m_book_ISBN=s.c_str(); break;
case 1:m_book_subject=s.c_str();break;
case 2:m_book_title=s.c_str();break;
case 3:m_book_press=s.c_str();break;
//将输入的字符串对应转化为对应的年份
case 4:
int year;
year = (tmp[0]-48)*1000+(tmp[1]-48)*100+(tmp[2]-48)*10+(tmp[3]-48);
m_book_year=year; break;
case 5:
m_book_authors=s.c_str();break;
//将输入的字符串转化为对应的价格
case 6:
double point;
point=((double)tmp[a-1]-48)/100 + ((double)tmp[a-2]-48)/10;
for(k=0;k<a-3;k++)
price=price*10+(tmp[k]-48);
price+=point;
m_book_price=price;
break;
//将输入的字符串转化为对应的库存数量
case 7:
for(m=0;m<a;m++)
total=total*10+(tmp[m]-48);
m_book_total_num=total;break;}}
//检测book表是否打开
if(!m_bookSet.IsOpen()){
m_bookSet.Open();}
//如果该书已经存在,在原来的库存量基础上加上入库的数量即可
m_bookSet.m_strFilter.Format("book_ISBN='%s'",m_book_ISBN);
m_bookSet.Requery();
if(!m_bookSet.IsEOF()){
m_bookSet.Edit();
m_bookSet.m_book_total_num+=m_book_total_num;
m_bookSet.m_book_stocked_num+=m_book_total_num;
m_bookSet.Update();
continue;}
//如果该书不存在
m_bookSet.AddNew();
m_bookSet.m_book_ISBN=m_book_ISBN;
m_bookSet.m_book_subject=m_book_subject;
m_bookSet.m_book_title=m_book_title;
m_bookSet.m_book_press=m_book_press;
m_bookSet.m_book_year=m_book_year;
m_bookSet.m_book_authors=m_book_authors;
m_bookSet.m_book_price=m_book_price;
m_bookSet.m_book_total_num=m_book_total_num;
m_bookSet.m_book_stocked_num=m_book_total_num;
m_bookSet.Update();}
AfxMessageBox("入库成功");
CDialog::OnOK();
}
}
}
单本入库部分代码
void CBookSingleEnrollDlg::OnOK()
{
CString str="";
//检测book表是否打开
if(!m_bookSet.IsOpen()){
m_bookSet.Open(); }
UpdateData();
//输入不能为空
if(m_book_ISBN.IsEmpty()||m_book_subject.IsEmpty()||m_book_title.IsEmpty()||m_book_press.IsEmpty()||m_book_year==0||m_book_authors.IsEmpty()||m_book_price==0||m_book_total_num==0){
AfxMessageBox("请输入完整信息");
return; }
m_bookSet.m_strFilter.Format("book_ISBN = '%s'",m_book_ISBN);
m_bookSet.Requery();
//如果该书已经存在
if(!m_bookSet.IsEOF()){
m_bookSet.Edit();
m_bookSet.m_book_total_num+=m_book_total_num;
m_bookSet.m_book_stocked_num+=m_book_total_num;
m_bookSet.Update();
AfxMessageBox("入库成功!");
CDialog::OnOK();}
//如果该书不存在
else{
m_bookSet.AddNew();
m_bookSet.m_book_ISBN=m_book_ISBN;
m_bookSet.m_book_subject=m_book_subject;
m_bookSet.m_book_title=m_book_title;
m_bookSet.m_book_press=m_book_press;
m_bookSet.m_book_year=m_book_year;
m_bookSet.m_book_authors=m_book_authors;
m_bookSet.m_book_price=m_book_price;
m_bookSet.m_book_total_num=m_book_total_num;
m_bookSet.m_book_stocked_num=m_book_total_num;
m_bookSet.Update();
AfxMessageBox("入库成功");
CDialog::OnOK();
}
}
预约部分代码
bool CBookOrderDlg::IsValidCard(const CString &card_num)
{
//检查card表是否打开
if(! m_cardSet.IsOpen()){
m_cardSet.Open();
}
//指定查询条件card_num为用户卡号
m_cardSet.m_strFilter.Format("card_num='%s'",card_num);
m_cardSet.Requery();
//结果集如果为空则表示卡号不存在
if(m_cardSet.IsEOF()){
AfxMessageBox("该卡号不存在");
return false;
}
return true;
}
bool CBookOrderDlg::AllowedToBorrow(const CString &book_ISBN)
{
if(!m_bookSet.IsOpen()){
m_bookSet.Open();
}
//指定查询条件book_ISBN
m_bookSet.m_strFilter.Format("book_ISBN='%s'",book_ISBN);
m_bookSet.Requery();
//结果集为空则表明该书不存在
if(m_bookSet.IsEOF()){
AfxMessageBox("该书不存在");
return false; }
if(m_bookSet.m_book_stocked_num==0){
AfxMessageBox("该书已经被借空!");
return false;}
return true;
}
bool CBookOrderDlg::OrderBook(const CString &card_num, const CString &book_ISBN)
{
//在borrow表中增加一条借书记录
if(! m_OrderSet.IsOpen()){
m_OrderSet.Open();
}
m_OrderSet.AddNew();
m_OrderSet.m_card_num=card_num;
m_OrderSet.m_book_ISBN=book_ISBN;
m_OrderSet.m_order_date=CTime::GetCurrentTime();
m_OrderSet.m_admin_id=admin;
m_OrderSet.Update();
m_OrderSet.Requery();
return true;
}
void CBookOrderDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnOK();
UpdateData();
if(m_strCardNum==""){
AfxMessageBox("请输入借书证号!");
return ;
}
if(m_strBookNum==""){
AfxMessageBox("请输入索书号!");
return ;
}
//如果卡号不存在,则拒绝借书
if(! IsValidCard(m_strCardNum)){
// CDialog::OnOK();//调用基类CDialog的OnOK函数来关闭对话框
AfxMessageBox("读者未找到您的注册信息!");
return;
}
//如果要借的书没有库存,也返回
if(! AllowedToBorrow(m_strBookNum)){
// CDialog::OnOK();
return ;
}
//以上都没有问题,才能外借图书
if(OrderBook(m_strCardNum,m_strBookNum)){
AfxMessageBox("预约成功");
}
else{
AfxMessageBox("预约失败");
}
CDialog::OnOK();
}
还书部分代码
void CBookReturnDlg::OnOK()
{
UpdateData(true);
if(m_strCardNum==""){
AfxMessageBox("请输入卡号!");
return ;
}
if(m_strBookNum==""){
AfxMessageBox("请输入藏书号码!");
return ;
}
if(!m_borrowSet.IsOpen()){
m_borrowSet.Open();
}
//查找借书记录
m_borrowSet.m_strFilter.Format("card_num='%s' and book_ISBN='%s' and Return_date is null",m_strCardNum,m_strBookNum);
m_borrowSet.Requery();
//当藏书不存在或所有记录的还书时间都为非空时
if(m_borrowSet.IsEOF()){
AfxMessageBox("此书不存在或已经还掉");
// CDialog::OnOK();
return ;
}
CTime today=CTime::GetCurrentTime();
//将还书日期改为今天
m_borrowSet.Edit();
m_borrowSet.m_return_date=today;
m_borrowSet.Update();
//book表中现有藏书加1
if(!m_bookSet.IsOpen()){
m_bookSet.Open();
}
m_bookSet.m_strFilter.Format("book_ISBN='%s'",m_strBookNum);
m_bookSet.Requery();
m_bookSet.Edit();
m_bookSet.m_book_stocked_num=m_bookSet.m_book_stocked_num+1;
m_bookSet.Update();
AfxMessageBox("还书成功!");
CDialog::OnOK();
}
void CBookReturnDlg::OnBorrowlist()
{
UpdateData();
if(m_strCardNum==""){
AfxMessageBox("请输入卡号!");
return ;
}
cardnum=m_strCardNum;
CBorrowListDlg borrowlist; //构造“借书记录”对话框
borrowlist.DoModal(); //显示“借书记录”对话框
}
void CBookReturnDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnOK();
UpdateData(true);
if(m_strCardNum==""){
AfxMessageBox("请输入借书证号!");
return ;
}
if(m_strBookNum==""){
AfxMessageBox("请输入索书号!");
return ;
}
if(!m_borrowSet.IsOpen()){
m_borrowSet.Open();
}
//查找借书记录
m_borrowSet.m_strFilter.Format("card_num='%s' and book_ISBN='%s' and Return_date is null and borrow_date is not null",m_strCardNum,m_strBookNum);
m_borrowSet.Requery();
//当藏书不存在或所有记录的还书时间都为非空时
if(m_borrowSet.IsEOF()){
AfxMessageBox("此书不存在或已经还掉");
// CDialog::OnOK();
return ;
}
//将还书日期改为今天
m_borrowSet.AddNew();
m_borrowSet.m_card_num=m_strCardNum;
m_borrowSet.m_book_ISBN=m_strBookNum;
m_borrowSet.m_return_date=CTime::GetCurrentTime();
m_borrowSet.m_admin_id=admin;
m_borrowSet.Update();
m_borrowSet.Requery();
//book表中现有藏书加1
if(!m_bookSet.IsOpen()){
m_bookSet.Open();
}
m_bookSet.m_strFilter.Format("book_ISBN='%s'",m_strBookNum);
m_bookSet.Requery();
m_bookSet.Edit();
m_bookSet.m_book_stocked_num+=1;
m_bookSet.Update();
AfxMessageBox("还书成功!");
CDialog::OnOK();
}
增加借书证部分代码
void CCardAddDlg::OnOK()
{
//检测card表是否打开
if (!m_cardSet.IsOpen()){
m_cardSet.Open();
}
UpdateData();
m_cardSet.m_strFilter.Format("card_num='%s'",m_card_num);
m_cardSet.Requery();
if(!m_cardSet.IsEOF()){
AfxMessageBox("该借书证已经存在");
return;
}
//如果该借书证不存在
m_cardSet.AddNew();
m_cardSet.m_card_num=m_card_num;
m_cardSet.m_name=m_name;
m_cardSet.m_unit=m_unit;
m_cardSet.m_rank=m_rank;
m_cardSet.Update();
AfxMessageBox("借书证添加成功");
CDialog::OnOK();
}
删除借书证代码
void CCardDeleteDlg::OnOK()
{
//检测card表是否打开
if(!m_cardSet.IsOpen()){
m_cardSet.Open();
}
UpdateData();
m_cardSet.m_strFilter.Format("card_num='%s'",m_card_num);
m_cardSet.Requery();
if(m_cardSet.IsEOF()){
AfxMessageBox("此卡号不存在");
return;
}
m_cardSet.Delete();
AfxMessageBox("删除成功");
CDialog::OnOK();
}
图书查询部分代码
void CQueryBasicDlg::OnQuery()
{
UpdateData();
CString strFilter;
CString str1="";
CString str2="";
if(m_edit2!=0){
str1.Format("book_year between %d and %d",m_edit1,m_edit2);
}
if(m_edit4!=0){
str2.Format("book_price between %f and %f",m_edit3,m_edit4);
}
//用户输入的查询
m_bookSet.m_strFilter="book_ISBN like '%"+m_keyword5+"%'"
+"and book_subject like '%"+m_keyword1+"%'"
+"and book_title like '%"+m_keyword2+"%'"
+"and book_press like '%"+m_keyword3+"%'"
+"and book_authors like '%"+m_keyword4+"%'";
if(!str1.IsEmpty()){
m_bookSet.m_strFilter+="and ";
m_bookSet.m_strFilter+=str1;
}
if(!str2.IsEmpty()){
m_bookSet.m_strFilter+="and ";
m_bookSet.m_strFilter+=str2;
}
//检测book表是否打开
if(!m_bookSet.IsOpen()){
m_bookSet.Open();
}
m_bookSet.Requery();
m_listResult.ResetContent(); //清空详细信息列表框中的原有内容
m_listDetail.ResetContent(); //清空信息列表框中的原有内容
if(m_bookSet.IsEOF())
{
AfxMessageBox("查无此书");
return;
}
while(!m_bookSet.IsEOF())
{
//将结果集中的每一本书的书名添加到查询结果列表中
m_listResult.AddString(m_bookSet.m_book_title);
m_bookSet.MoveNext();
}
}
void CQueryBasicDlg::OnSelchangeListResult()
{
//用数据aColCaption来存放所有列表信息,与数据库中的次序一致
CString aColCaption[9];
aColCaption[0]="索书号:";
aColCaption[1]="分类:";
aColCaption[2]="书名:";
aColCaption[3]="出版社:";
aColCaption[4]="年份:";
aColCaption[5]="作者:";
aColCaption[6]="价格:";
aColCaption[7]="藏书总量:";
aColCaption[8]="现存数:";
m_listDetail.ResetContent(); //清空详细信息列表中的原有内容
int curSel; //记录集中的当前位置
CString strDetail; //内容
CString strLine; //列表的一行,行=标题:+内容
curSel=m_listResult.GetCurSel(); //取得结果列表中当前的选中位置
m_bookSet.SetAbsolutePosition(curSel+1); //将记录集指针移到该位置
for(int i=0;i<m_bookSet.m_nFields;i++){
m_bookSet.GetFieldValue(i,strDetail); //取出第i列值存在strDetail中
strLine.Empty(); //清空原来的内容
strLine+=aColCaption[i]; //增加标题
strLine+=strDetail; //增加内容
m_listDetail.AddString(strLine); //把该行添加到详细信息列表框中
}
}
借书记录表
三、调试与运行
四、课程设计小结
通过此次数据库的课程设计,真正达到了学与用的结合,增强了对数据库方面应用的理解,对自己今后参与开发数据库系统积累了不少经验,在实验过程中,从建立数据开始,对灵据库设计理念及思想上有更高的认识,从需求分析,到概念设计和逻辑设计,E-R图的表示,懂得了不少有关数据库开发过程中的知识,在实验中建表,及其关系模式,关系代数的建立及理解,将SQL语的查询语句用得淋漓尽致,增强了自己在数据库中应用SQL语言的灵活性,其中包括,插入、删除、修改、查询,主码与外部码的定义,约束项的设置,使逻辑更严密,在学习过程中,我也能过上网查了不少资料,也看了一些别人设计的图书馆管理信息系统的设计报告,学以致用,自我创新,独立完成了这份自己的报告,从中在学到用,从用又到学,不断修改,系统更新。虽然不能达到完善系统,但也做到了尽善尽美,加强理论学习对完善系统会有很多帮助,不管怎么说,对这次做的课程设计自己觉得还算满意。此外,我明白了自学的重要性,本次试验要求应用MFC制作界面,而以前我只是学过C++的基本知识,显然对于我来说这还是相当有挑战的,后来我通过查询想过资料,了解了制作窗口菜单的方法,还明白了如何在C++中连接数据,以及在C++中对数据库进行操作的相关语句,如查询Requery(),AddNew()增加记录等,通过这次课程设计,我真的学到了不少,使对专业知识的了解更加的深入。
六、参考文献
(美)霍顿.Visual C++2005 入门经典[M].北京:清华大学出版社.2007
王珊,萨师煊.数据库系统概论.北京:高等教育出版社,2006