数据库设计报告图书管理系统.docx
《数据库设计报告图书管理系统.docx》由会员分享,可在线阅读,更多相关《数据库设计报告图书管理系统.docx(29页珍藏版)》请在冰豆网上搜索。
数据库设计报告图书管理系统
数据库课程设计
一、引言
1.设计目的
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力。
课程设计的目的:
1.加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平;
2.在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;
3.学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;
4.为毕业设计和以后工作打下必要基础。
2.设计要求
运用数据库基本理论与应用知识,在微机RDBMS(SQLServer)的环境上建立一个数据库应用系统。
要求把现实世界的事物及事物之间的复杂关系抽象为信息世界的实体及实体之间联系的信息模型,再转换为机器世界的数据模型和数据文件,并对数据文件实施检索、更新和控制等操作。
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++,SQLServer通过ODBC连接
二、详细设计
1、数据库设计;
建立admin表
CREATETABLE[dbo].[admin](
[admin_id][nchar](10)NOTNULL,
[admin_password][nchar](10)NULL,
[admin_name][nchar](10)NOTNULL,
[admin_contact][nchar](15)NULL,
PRIMARYKEYCLUSTERED
([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表
CREATETABLE[dbo].[book](
[book_ISBN][nchar](10)NOTNULL,
[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,
PRIMARYKEYCLUSTERED
([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表
CREATETABLE[dbo].[card](
[card_num][nchar](10)NOTNULL,
[name][nchar](10)NOTNULL,
[unit][nchar](15)NULL,
[rank][nchar](10)NULL,
PRIMARYKEYCLUSTERED
([card_num]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)
ALTERTABLE[dbo].[card]WITHCHECKADDCONSTRAINT[c1]CHECK(([rank]='教师'OR[rank]='研究生'OR[rank]='本科生'))
ALTERTABLE[dbo].[card]CHECKCONSTRAINT[c1]
建立borrow表
CREATETABLE[dbo].[borrow](
[card_num][nchar](10)NOTNULL,
[book_ISBN][nchar](10)NOTNULL,
[borrow_date][date]NULL,
[return_date][date]NULL,
[admin_id][nchar](10)NULL,
FOREIGNKEY([admin_id])REFERENCES[dbo].[admin]([admin_id])
FOREIGNKEY([admin_id])REFERENCES[dbo].[admin]([admin_id])
FOREIGNKEY([book_ISBN])REFERENCES[dbo].[book]([book_ISBN])
FOREIGNKEY([book_ISBN])REFERENCES[dbo].[book]([book_ISBN])
FOREIGNKEY([card_num])REFERENCES[dbo].[card]([card_num])
)
建立order表
CREATETABLE[dbo].[order](
[card_num][nchar](10)NOTNULL,
[book_ISBN][nchar](10)NOTNULL,
[order_date][date]NULL,
[admin_id][nchar](10)NULL,
PRIMARYKEYCLUSTERED
([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、图书管理系统实现与截图
窗口界面
借书模块部分程序
voidCBookBorrowDlg:
:
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();
}
boolCBookBorrowDlg:
:
IsValidCard(constCString&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("该卡号不存在");
returnfalse;
}
returntrue;
}
boolCBookBorrowDlg:
:
AnyBookExpired(constCString&card_num)
{
if(!
m_borrowSet.IsOpen()){
m_borrowSet.Open();
}
m_borrowSet.m_strFilter.Format("card_num='%s'andreturn_dateisnull",card_num);
m_borrowSet.Requery();
CTimetoday=CTime:
:
GetCurrentTime();//得到今天的日期
CTimeSpandiffDays;
while(!
m_borrowSet.IsEOF())
{
diffDays=today-m_borrowSet.m_borrow_date;//计算已借图书的时间
if(diffDays.GetDays()>30){
AfxMessageBox("您有书过期了,请尽快还书!
");//超过30天,则报错返回
returntrue;}
m_borrowSet.MoveNext();}
returnfalse;}
boolCBookBorrowDlg:
:
AllowedToBorrow(constCString&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("该书不存在");
returnfalse;}
if(m_bookSet.m_book_stocked_num==0){
AfxMessageBox("该书已经被借空!
");
returnfalse;}
returntrue;}
boolCBookBorrowDlg:
:
BorrowBook(constCString&card_num,constCString&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();
returntrue;
}
voidCBookBorrowDlg:
:
OnBorrowlist()
{
UpdateData();
if(m_strCardNum==""){
AfxMessageBox("请输入卡号!
");
return;}
cardnum=m_strCardNum;
CBorrowListDlgborrowlist;//构造“借书记录”对话框
borrowlist.DoModal();//显示“借书记录”对话框
}
批量入库部分代码
voidCBookEnrollDlg:
:
OnOK()
{
inti;
stringstr;
strings="";
chartmp[100];
CStringm_book_ISBN;
CStringm_book_subject;
CStringm_book_title;
CStringm_book_press;
intm_book_year;
CStringm_book_authors;
doublem_book_price;
intm_book_total_num;
UpdateData();
ifstreamfile;
if(m_address.IsEmpty())
{AfxMessageBox("不能为空");}
else
{file.open(m_address);//打开文件
if(!
file)
{AfxMessageBox("文件打开失败!
");}
if(file){while(getline(file,str,'\n')
//用getline函数读取文件中的每一行
{intk=0;
intm=0;
intj=0;
inttotal=0;
inta;
intb=0;
doubleprice=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){
case0:
m_book_ISBN=s.c_str();break;
case1:
m_book_subject=s.c_str();break;
case2:
m_book_title=s.c_str();break;
case3:
m_book_press=s.c_str();break;
//将输入的字符串对应转化为对应的年份
case4:
intyear;
year=(tmp[0]-48)*1000+(tmp[1]-48)*100+(tmp[2]-48)*10+(tmp[3]-48);
m_book_year=year;break;
case5:
m_book_authors=s.c_str();break;
//将输入的字符串转化为对应的价格
case6:
doublepoint;
point=((double)tmp[a-1]-48)/100+((double)tmp[a-2]-48)/10;
for(k=0;kprice=price*10+(tmp[k]-48);
price+=point;
m_book_price=price;
break;
//将输入的字符串转化为对应的库存数量
case7:
for(m=0;mtotal=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();
}
}
}
单本入库部分代码
voidCBookSingleEnrollDlg:
:
OnOK()
{
CStringstr="";
//检测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_boo