2023年7月17日发(作者:)
MFC图书管理系统
实 用 软 件 开 发
课题:图书馆管理系统
课程名称: 实 用 软 件 开 发
院 系: 计算机科学与技术学院
班 级:
组 员:
组 员:
组 员:
指导教师:
2012-5-31
第一章 图书管理系统的概述
1.1图书馆整体概述
二十一世纪是信息高度交流与发展的时代,计算机系统则在信息时代扮演着极为重要的
借阅者功能模块书籍查询子模块书籍借还子模块
图1-2借阅者管理系统功能模块图
1.2.1书籍查询子模块
借阅者可以通过系统根据书籍编号,书籍作者,书籍名称以及书籍类型来查询想获取的书籍;
书籍查询子模块按编号查找按书名查找按作者查找按类别查找
图1-3书籍查询模块图
1.2.2书籍归还与借阅模块
借阅者也可以通过本系统借阅书籍,归还书籍,缴纳罚金,登记丢失的书籍以及续借书籍。
书籍借还子模块借阅书籍归还书籍缴纳罚金续借书籍丢失登记
图1-4书籍借还模块图
1.3系统管理子模块
在图书馆管理子系统中,其功能概述如下:
1)管理书目信息,如增加、删除和更新,查看书目信息
其功能细化图如下:
系统管理子模块借阅者信息管理管理员信息管理书籍信息管理
图1-5图书馆管理系统功能模块图
1.3.1书籍信息管理
在书籍信息管理子系统中,其功能概述如下:
1)添加书籍信息,便于管理书籍
2)删除书籍信息,便于管理书籍
3)检索书籍信息,便于管理书籍
4)查看书籍信息,便于了解书籍基本情况
其功能细化图如下:
1 书籍管理子模块添加书籍信息删除书籍信息修改书籍信息查询书籍信息显示书籍信息
图1-6书籍信息管理系统功能模块图
1.3.2借阅者信息管理
在借阅者信息管理子系统中,其功能概述如下:
1)添加借阅者信息
2)删除借阅者信息
3)检索借阅者信息,便于管理借阅者
4)查看借阅者信息,便于了解借阅者基本信息
其功能细化图如下:
借阅者信息管理子模块添加借阅者信息删除借阅者信息查询借阅者信息
图1-7借阅者信息管理系统功能模块图
1.3.3管理员信息管理
在借阅者信息管理子系统中,其功能概述如下:
1)添加管理员信息
2)删除管理员信息
3)查看借阅者信息,便于了解借阅者基本信息
其功能细化图如下:
2 管理员信息管理子模块添加管理员信息删除管理员信息查询管理员信息
图1-8管理员信息管理系统功能模块图
1.3.4书籍类别信息管理
在借阅者信息管理子系统中,其功能概述如下:
1)添加管理员信息
2)删除管理员信息
3)查看借阅者信息,便于了解借阅者基本信息
其功能细化图如下:
书籍类别信息管理添加书籍类别信息删除书籍类别信息查询书籍类别信息
图1-9书籍类别信息管理模块图
3
第二章 数据库设计
2.1 E-R图
由于本图书馆管理系统没有海量数据的存储问题,其数据一般不是很多,所以没有必要选用像Oracle这样的数据库。另外现阶段尚处于演示阶段,对安全性要求不是很高,SQL
Server足可以胜任,所以我们选用了Microsoft SQL Servers 2000。
数据通信接口采用ODBC(Open Database Connectivity,开放数据库互连)。ODBC是微软开发的一套读取数据库的解决方案,它的目的是将所有对数据库的底层操作全部隐藏在ODBC的驱动程序内核里。对于程序员来说,只要构建了一个指向数据库的连接,就可以采用统一的应用程序编程接口实现对数据库的读写。目前ODBC驱动已经提供了对大多数常见类型数据库的支持,包括dBase,Informix,Access,SQL Server和Oracle等。也包括了对其它类型的数据库的支持,如文本,Excel电子表格等的支持。
本章主要设计出能够满足用户需求的各个实体以及它们之间的关系,为后面的逻辑结构设计打下基础。根据以上的分析设计结果,得到管理员实体、书籍实体、书籍类别实体、借阅信息实体以及借阅者实体。下面来介绍这些实体的E-R图:
2.1.1管理员实体
管理员实体包括:用来记录管理员的ID号的AID,用来记录管理员的姓名和密码的ANAME和APassword。管理员实体的E-R图如下所示:
4 AID管理员ANAME图2-1 管理员实体E-R图
2.1.2书籍实体
书籍实体包括:书籍的BID号、书名BName、作者BAuthor、出版社BPress、出版日期BPress_data、书籍备注BDesc、价格BPrice和类别号BType,其中BFlag_Borrow属性用来表示该书是否以借出。书籍实体的E-R图如下所示:
BIDBflag_BorrowAPassword
BNameBType书籍BPriceBDescBpress_dataBAuthorBPress
图2-2 书籍实体E-R图
2.1.3书籍类别实体
书籍类别实体包括:书籍的类别号BType、类别名TypeName以及可以借阅的最长日期DaysCanBorrow。书籍类别实体的E-R图如下所示:
5 BType书籍类别DaysCanBorrowTypeName
图2-3书籍类别实体E-R图
2.1.4借阅信息实体
借阅信息实体包括:借阅者的ID号RID、书籍的ID号BID、借阅的日期BORROW_DATE和还书日期BACK_DATE。借阅信息实体的E-R图如下所示:
BIDRID借阅信息BORROW_DATEBACK_DATE
图2-4 借阅信息实体E-R图
2.1.5借阅者实体
借阅者实体包括:借阅者的ID号RID、借阅者姓名RName、借阅者类别RType、借阅者可以保留书籍的最长日期RMaxNum_Can_borrow、是否已借书的标记RFlag_Borrow。借阅者实体的E-R图如下所示:
RIDRName借阅者RTypeRMaxNum_Can_boBACK_DATE
图2-5 借阅者实体E-R图
6
2.1.6系统E-R图
系统E-R图包含了各个实体间的关系,如下图所示:
管理员书籍类别管理分类1*借阅者2.2主要数据表的结构
数据库在整个系统中占据着非常重要的地位,数据库结构设计的好坏直接影响着系统的效率和实现效果。本系统采用SQL Server 2000数据库,数据库的名称为library,下面介绍library数据库中的主要数据表结构。
2.2.1 Admin表
Admin表用来存储管理员的身份信息,AID用来记录管理员的ID号,ANAME和APassword用来记录管理员的姓名和密码,该表的结构如下图所示:
***借阅*书籍1记录*借阅信息
图2-6 系统E-R图
图2-7 Admin表结构
2.2.2 Book表
Book表用来存储书籍的具体信息,分别记录了书籍的BID号、书名BName、作者BAuthor、出版社BPress、出版日期BPress_data、书籍备注BDesc、价格BPrice和类别号BType,其中BFlag_Borrow属性用来表示该书是否以借出,该表的结构如下图所示:
7
图2-8 Book表结构
2.2.3 Booktype表
Booktype表用来存储书籍类别的具体信息,分别记录了书籍的类别号BType、类别名TypeName以及可以借阅的最长日期DaysCanBorrow,该表的结构如下图所示:
图2-9 Booktype表结构
2.2.4 Borrow表
Borrow表用来存储书籍借阅的具体信息,分别记录了借阅者的ID号RID、书籍的ID号BID、借阅的日期BORROW_DATE和还书日期BACK_DATE,该表的结构如下图所示:
图2-10 Borrow表结构
2.2.5 Reader
Reader表用来存储借阅者的具体信息,分别记录了借阅者的ID号RID、借阅者姓名RName、借阅者类别RType、借阅者可以保留书籍的最长日期RMaxNum_Can_borrow、以
8 及是否已借书的标记RFlag_Borrow,该表的结构如下图所示:
图2-11 Reader表结构
第三章 图书管理系统的实现
图书管理系统系统的实现首先要实现的是用户能够正确的通过权限进行登录验证成功后,对管理系统的一系列操作。即系统先将用户登录信息写入日志数据表,然后显示图书管理系统的主窗口;如果用户登录失败,系统显示登录失败信息。
登陆界面如下所示:
9
图3-1登陆界面
实现用户登录到学生考试成绩管理系统的流程图如图所示:
开始用户名密码空YN在数据库中查找该用户密码正确?N提示用户Y登录成功开始
图3-2登录流程图
登录成功后,管理员进入到学生考试成绩系统界面,界面如下所示
10
图3-3系统主界面
3.1借阅者子模块的实现
借阅者可以通过系统根据书籍编号,书籍作者,书籍名称以及书籍类型来查询想获取的书籍;
借阅者也可以通过本系统借阅书籍,归还书籍,缴纳罚金,登记丢失的书籍以及续借书籍。
3.1.1书籍查询子模块的实现
借阅者可以通过系统根据书籍编号,书籍作者,书籍名称以及书籍类型来查询想获取的书籍;
查询界面的设计:
图3-4书籍查询界面
查询编程的实现:
11 查询流程图如下:
开 始按书名作者…方式查找Y在数据库中查找书籍N查找成功?N提示用户Y查找成功结束
图3-5书籍查询流程图
主要代码如下:
void CBookSelectDlg::OnIDSearch()
{
// TODO: Add your control notification handler code here
m_AllItems();
UpdateData();
if(m_y())
{
AfxMessageBox("图书ID不能为空");
return ;
}
ClearText();
if(!m_(AFX_DB_USE_DEFAULT_TYPE,_T("select * from BOOK where
BID='"+m_BookID+"'")))
{
AfxMessageBox("数据表BOOK打开失败");
return;
}
int i=0;
CString str;
while(!m_())
{
m_BookRset.m_ght();
12 m_BookRset.m_ght();
m_BookRset.m_ght();
m_BookRset.m_ght();
m_BookRset.m_ght();
m_Item(i,m_BookRset.m_BID);
m_mText(i,1,m_BookRset.m_BName);
m_mText(i,2,m_BookRset.m_BAuthor);
m_mText(i,3,m_BookRset.m_BPress);
("%d",m_BookRset.m_BType);
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select * from BOOKTYPE where
BType='"+str+"'"))
{
AfxMessageBox("BOOKTYPE表打开失败!");
m_();
return;
}
if(m_())
{
AfxMessageBox("查找图书类型出错!");
m_();
m_();
return;
}
m_TypeRset.m_ght();
m_mText(i,4,m_TypeRset.m_TpyeName);
str=m_BookRset.m_BRress_("%Y-%m-%d");
m_mText(i,5,str);
("%5.1f¥",m_BookRset.m_BPrice);
m_mText(i,6,str);
("%d天",m_TypeRset.m_DaysCanBorrow);
m_mText(i,7,str);
m_mText(i,8,m_BookRset.m_BFlag_Borrow);
m_mText(i,9,m_BookRset.m_BDesc);
i++;
m_xt();
m_();
}
m_();
m_raw(TRUE);
}
3.1.2书籍借还子模块的实现
借阅者也可以通过本系统借阅书籍,归还书籍,缴纳罚金,登记丢失的书籍以及续借书籍。
13 借书界面的设计:
图3-6书籍借阅界面
借书编程的实现:
流程图如下:
开 始
借阅者ID和书籍IDY在数据库中查找借阅者和书籍N查找成功?N提示用户Y借书结束
图3-7借书流程图
主要代码如下
void CBorrw::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
if(!m_bCanBorrow)
14 {
AfxMessageBox("读者借书证件已欠费或有书还未按时归还,请及时缴费,还书后再借!");
return ;
}
CDatabase db;
(_T("Library"));
CBookRset rs(&db);
m_ght();
if(!(AFX_DB_USE_DEFAULT_TYPE,"select * from BOOK where
BID='"+m_strBookID+"'"))
{
AfxMessageBox("数据表Reader打开失败!");
return ;
}
if(())
{
AfxMessageBox("图书编号为:"+m_strBookID+"的图书不存在!");
return ;
}
else
{
rs.m_BFlag_ght();
if( rs.m_BFlag_Borrow=="已借出" ||rs.m_BFlag_Borrow=="已丢失")
{
AfxMessageBox("该书已借出或已丢失 提交失败!");
return ;
}
m_strBFlagBorrw=_T("已借出");
try
{
();
rs.m_BFlag_Borrow="已借出";
();
}
catch(CDBException e)
{
AfxMessageBox("提交失败!"+e.m_strError);
}
}
CString strSQL;
CTime time,time1;
time=CTime::GetCurrentTime();
CTimeSpan time2(30,0,0,0);
time1=time+time2;
15 ("Insert into Borrow(RID,BID,BORROW_DATE,BACK_DATE)
values('%s','%s','%s','%s')",m_strReaderID,m_strBookID,("%Y-%m-%d"),("%Y-%m-%d"));
try
{
rans();
eSQL(strSQL);
Trans();
}
catch(CDBException e)
{
AfxMessageBox("错误:"+e.m_strError);
}
UpdateData(FALSE);
AfxMessageBox("提交成功");
}
void CBorrw::OnButton2()
{
// TODO: Add your control notification handler code here
EndDialog(IDCANCEL);
}
还书界面的设计:
图3-8书籍归还界面
还书编程的实现:
流程图如下:
16 开 始借阅者IDY在数据库中查找借阅者N查找成功?N提示用户Y还书结束
图3-9书籍归还流程图
主要代码如下:
BOOL CBOOKBACK::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_Column(0,"读者ID",LVCFMT_LEFT,100);
m_Column(1,"图书ID",LVCFMT_LEFT,100);
m_Column(2,"借书日期",LVCFMT_LEFT,100);
m_Column(3,"应还日期",LVCFMT_LEFT,100);
m_endedStyle(LVS_EX_FULLROWSELECT);
m_olor(RGB(244,200,222));
m_tBkColor(RGB(244,200,222));
m_tColor(RGB(0,00,60));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBOOKBACK::Onbackbook()
{
// TODO: Add your control notification handler code here
UpdateData();
int i=m_ectionMark();
if(i<0)
{
17 AfxMessageBox("请选择要归还的图书");
return;
}
else
{
if(!(AFX_DB_USE_DEFAULT_TYPE,"select * from BORROW where
RID='"+m_ID+"'"))
{
AfxMessageBox("数据库打开失败!");
return ;
}
CTimeSpan time=CTime::GetCurrentTime()-BorrowBook.m_BACK_DATE;
if(s()<0)
{
AfxMessageBox("借书超期,请先缴费!");
();
return ;
}
try
{
();
Book.m_BFlag_Borrow="在架";
();
}
catch(...)
{
AfxMessageBox("出现异常!");
();
();
return ;
}
try
{
();
y();
}
catch(...)
{
AfxMessageBox("注销失败!");
();
();
return ;
}
();
();
m_Item(i);
18 m_raw(TRUE);
}
}
续借界面的实现:
图3-10书籍续借界面
续借编程的实现:
流程图如下:
开 始借阅者ID和书籍IDY在数据库中查找借阅者和书籍N查找成功?N提示用户Y续借结束
图3-11书籍续借流程图
19
主要代码如下:
BOOL CBorrowDalyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Column(0,"图书ID",LVCFMT_LEFT,80);
m_Column(1,"读者ID",LVCFMT_LEFT,80);
m_Column(2,"借书日期",LVCFMT_LEFT,95);
m_Column(3,"还书日期",LVCFMT_LEFT,95);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBorrowDalyDlg::OnKillfocusEdit1()
{
UpdateData(TRUE);
m_AllItems();
if(m_y())
{
return ;
}
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select * from Borrow where
RID='"+m_ReaderID+"'"))
AfxMessageBox("数据表打开失败");
else if(m_())
{
AfxMessageBox("不存在读者"+m_ReaderID+"信息");
(CEdit*)GetDlgItem(IDC_EDIT1)->SetFocus();
}
else
{
int i=0;
CString str=_T("");
while(!m_())
{
m_BorrowRset.m_ght();
m_Item(i,m_BorrowRset.m_BID);
m_BorrowRset.m_ght();
m_mText(i,1,m_BorrowRset.m_RID);
str=m_BorrowRset.m_BORROW_("%Y-%m-%d");
m_mText(i,2,str);
str=m_BorrowRset.m_BACK_("%Y-%m-%d");
m_mText(i,3,str);
m_xt();
20 }
m_raw(TRUE);
}
m_();
}
void CBorrowDalyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if(m_y())
{
AfxMessageBox("请选择要续借的书籍!");
return ;
}
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select * from Borrow where
BID='"+m_BookID+"'"))
AfxMessageBox("数据表打开失败");
else
{
CTimeSpan time(30,0,0,0);
m_();
m_BorrowRset.m_BACK_DATE=CTime::GetCurrentTime()+time;
m_();
}
m_();
}
void CBorrowDalyDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int i=m_ectionMark();
if(i>=0)
{
m_BookID=m_mText(i,0);
}
UpdateData(FALSE);
*pResult = 0;
}
void CBorrowDalyDlg::OnButton4()
{
// TODO: Add your control notification handler code here
EndDialog(IDCANCEL);
}
缴纳罚金界面的设计:
21
图3-12
缴纳罚金的编程实现:
流程图如下:
开 始借阅者ID和书籍IDY在数据库中查找借阅者和书籍N查找成功?N提示用户Y缴纳罚金结束
图3-13
主要代码如下:
void CFMoneyDlg::OnCommite()
{
22 // TODO: Add your control notification handler code here
CTimeSpan time(0,0,0,0);
if(m_())
m_();
else
{
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select * from Borrow where
RID='"+m_ReaderID+"'"))
{
AfxMessageBox("打开Borrow表数据失败!");
return ;
}
else if(m_())
{
AfxMessageBox("未找到:"+m_ReaderID);
return ;
}
else
{
while(!m_())
{
m_();
m_BorrowRset.m_BACK_DATE=CTime::GetCurrentTime();
m_();
time+=(CTime::GetCurrentTime()-m_BorrowRset.m_BACK_DATE);
m_xt();
}
m_money=s()*m_setmoney;
UpdateData(FALSE);
}
}
m_();
}
void CFMoneyDlg::OnEnddlg()
{
// TODO: Add your control notification handler code here
EndDialog(IDCANCEL);
}
void CFMoneyDlg::OnKillfocusEdit13()
{
// TODO: Add your control notification handler code here
OnKillfocusEdit1();
}
23 void CFMoneyDlg::OnKillfocusEdit1()
{
// TODO: Add your control notification handler code here
UpdateData();
CTimeSpan time(0,0,0,0);
if(m_y())
{
AfxMessageBox("读者ID不能为空!");
return ;
}
if(m_())
m_();
else
{
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select * from Borrow where
RID='"+m_ReaderID+"'"))
{
AfxMessageBox("打开Borrow表数据失败!");
return ;
}
else if(m_())
{
AfxMessageBox("未找到:"+m_ReaderID);
return ;
}
else
{
while(!m_())
{
m_ing(m_BorrowRset.m_BID);
time+=(CTime::GetCurrentTime()-m_BorrowRset.m_BACK_DATE);
m_xt();
}
m_money=s()*m_setmoney;
}
m_Sel(0);
}
UpdateData(FALSE);
m_();
}
24
丢失书籍界面的设计:
图3-14书籍丢失界面设计
丢失书籍编程的实现:
流程图如下:
开 始借阅者IDY在数据库中查找借阅者N查找成功?N提示用户Y还书结束
图3-15丢失书籍流程图
主要代码如下:
25 BOOL CLostIfom::OnInitDialog()
{
CDialog::OnInitDialog();
m_Column(0,"读者ID",LVCFMT_LEFT,100);
m_Column(1,"图书ID",LVCFMT_LEFT,100);
m_Column(2,"借书日期",LVCFMT_LEFT,100);
m_Column(3,"应还日期",LVCFMT_LEFT,100);
m_endedStyle(LVS_EX_FULLROWSELECT);
m_olor(RGB(244,200,222));
m_tBkColor(RGB(244,200,222));
m_tColor(RGB(0,00,60));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CLostIfom::OnKillfocusEdit1()
{
// TODO: Add your control notification handler code here
m_AllItems();
UpdateData();
if(!(AFX_DB_USE_DEFAULT_TYPE,"select *from BORROW
RID='"+m_ID+"'"))
{
AfxMessageBox("数据库打开失败!");
return;
}
else if(())
{
AfxMessageBox("找不到读者ID的借书,请确认读者信息");
();
return ;
}
else
{
int i=0;
CString str;
while(!())
{
BorrowBook.m_ght();
m_Item(i,BorrowBook.m_BID);
BorrowBook.m_ght();
m_mText(i,1,BorrowBook.m_RID);
str=BorrowBook.m_BORROW_("%Y-%m-%d");
m_mText(i,2,str);
str=BorrowBook.m_BACK_("%Y-%m-%d");
m_mText(i,3,str);
26
where xt();
}
}
();
}
void CLostIfom::OnOK()
{
// TODO: Add your control notification handler code here
UpdateData();
int i=m_ectionMark();
if(i<0)
{
AfxMessageBox("请选择要登记的图书");
return;
}
else
{
if(!(AFX_DB_USE_DEFAULT_TYPE,"select * from BORROW where
RID='"+m_ID+"'"))
{
AfxMessageBox("数据库打开失败!");
return ;
}
CTimeSpan time=CTime::GetCurrentTime()-BorrowBook.m_BACK_DATE;
if(s()<0)
{
AfxMessageBox("借书超期,请先缴费!");
();
return ;
}
CString BID=BorrowBook.m_BID;
ght();
if(!(AFX_DB_USE_DEFAULT_TYPE,"select * from Book where
BID='"+BID+"'"))
AfxMessageBox("数据表打开失败");
();
Book.m_BFlag_Borrow="已丢失";
();
();
y();
();
();
m_Item(i);
m_raw(TRUE);
}
27 }
3.2系统管理子模块的实现
管理员可以同过本系统对书籍进行管理:主要包括书籍的添加,删除,修改,查询,显示全部书籍这些操作;亦可以管理借阅者信息,主要包括借阅者的删除,添加操作;也可以管理管理员信息,主要包括借阅者的删除,添加操作;同时也可以管理书籍类别信息,主要包括借阅者的删除,添加操作;
3.2.1书籍信息管理子模块的实现
管理员可以同过本系统对书籍进行管理:主要包括书籍的添加,删除,修改,查询,显示全部书籍这些操作。
书籍信息管理子模块的界面设计:
图3-16书籍信息管理界面
书籍信息管理子模块的编程实现:
流程图如下:
开始增/删/改/查书籍Y在数据库中增/删/改/查书籍N成功增/删/改/查书籍N提示用户Y成功管理结束
28
图3-17书籍信息管理流程图
主要代码如下:
HBRUSH CBookSelectDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
return hbr;
}
void CBookSelectDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int i=m_ectionMark();
if(i<0)
{
ClearText();
return;
}
CString str;
m_FNO=m_mText(i,0);
m_NAME=m_mText(i,1);
m_AUTHOR=m_mText(i,2);
m_PRESS=m_mText(i,3);
int j=m_ring(-1,m_mText(i,4));
m_Sel(j);
(_T("select * from BOOK where BID='%s'"),m_mText(i,0));
if(!m_(AFX_DB_USE_DEFAULT_TYPE,str))
{
AfxMessageBox("数据表BOOK打开失败");
return;
}
m_e(&m_BookRset.m_BRress_date);
str=m_mText(i,6);
double tempf=atof(str);
m_PRICE=(float)tempf;
str=m_mText(i,7);
m_DAYS=atoi(str);
m_STATE=m_mText(i,8);
m_DESC=m_mText(i,9);
UpdateData(FALSE);
m_();
*pResult = 0;
}
29
void CBookSelectDlg::ClearText()
{
m_FNO = _T("");
m_AUTHOR = _T("");
m_PRESS = _T("");
m_DESC = _T("");
m_NAME = _T("");
m_PRICE = 0.0f;
m_DAYS = 0;
m_STATE=_T("");
UpdateData(FALSE);
}
void CBookSelectDlg::OnDeleteBook()
{
int i=m_ectionMark();
CString str=m_mText(i,0);
if(i<0)
{
AfxMessageBox("请选择你要删除的图书!");
return;
}
if(IDNO==AfxMessageBox("你确定要删除此项吗?",MB_YESNO))
{
return ;
}
if(!m_(AFX_DB_USE_DEFAULT_TYPE,_T("select * from BOOK where
BID='"+str+"'")))
{
AfxMessageBox("数据表BOOK打开失败");
return;
}
try
{
m_();
m_y();
}
catch(...)
{
AfxMessageBox("可能该书在正在借阅中,不能删除!");
m_();
return;
}
ClearText();
m_();
30 m_Item(i);
m_raw(TRUE);
}
3.2.2借阅者信息管理子模块的实现
管理员可以管理借阅者信息,主要包括借阅者的删除,添加操作;
添加借阅者的界面设计:
图3-18添加借阅者的界面
添加借阅者的编程实现:
流程图如下:
开始添加借阅者Y在数据库中添加借阅者N添加成功N提示用户Y成功添加结束
图3-19添加借阅者的流程图
主要代码如下:
void CReaderADD::OnOK()
{
31 // TODO: Add your control notification handler code here
UpdateData();
if(m_y()||m_y())
{
AfxMessageBox("存在空值!");
return;
}
if(!())
{
AfxMessageBox("数据库打开失败!");
return;
}
try
{
();
}
catch(...)
{
AfxMessageBox("添加失败,请换个ID再试!");
();
return ;
}
();
if(IDNO==AfxMessageBox("添加成功!继续添加吗?",MB_YESNO))
{
EndDialog(IDCANCEL);
}
else
{
m_Sel(0);
m_ID = _T("");
m_Days = 0;
m_Name = _T("");
UpdateData(FALSE);
return ;
}
}
void CReaderADD::OnOUT()
{
// TODO: Add your control notification handler code here
EndDialog(IDCANCEL);
}
BOOL CReaderADD::OnInitDialog()
32 {
CDialog::OnInitDialog();
m_Sel(0);
return TRUE; // return TRUE unless you set the focus to a control
}
删除借阅者的界面设计:
图3-20删除借阅者界面
删除借阅者的编程实现:
流程图如下:
33 开始删除借阅者Y在数据库中删除借阅者N删除成功N提示用户Y成功删除结束
图3-21删除借阅者流程图
主要代码如下:
BOOL CReaderDelete::OnInitDialog()
{
CDialog::OnInitDialog();
m_Column(0,"读者ID",LVCFMT_LEFT,100);
m_Column(1,"读者姓名",LVCFMT_LEFT,100);
m_Column(2,"可借天数",LVCFMT_LEFT,100);
m_Column(3,"读者类型",LVCFMT_LEFT,100);
m_Column(4,"借书状态",LVCFMT_LEFT,100);
m_endedStyle(LVS_EX_FULLROWSELECT);
m_olor(RGB(244,200,222));
m_tBkColor(RGB(244,200,222));
m_tColor(RGB(0,00,60));
if(!())
{
AfxMessageBox("数据库打开失败!");
return FALSE;
}
int i=0;
char num[10];
while(!())
{
Reader.m_ght();
34 Reader.m_ght();
//Reader.m_RMaxNum_Can_borrow
Reader.m_ght();
Reader.m_RFlag_ght();
m_Item(i,Reader.m_RID);
m_mText(i,1,Reader.m_RName);
memset(num,0,10);
ltoa(Reader.m_RMaxNum_Can_borrow,num,10);
m_mText(i,2,num);
m_mText(i,3,Reader.m_RType);
m_mText(i,4,Reader.m_RFlag_Borrow);
xt();
}
();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CReaderDelete::OnDelete()
{
// TODO: Add your control notification handler code here
int i=m_ectionMark();
int x=m_mCount();
if(x==0)
{
AfxMessageBox("没有读者可以删除了");
return ;
}
if(IDNO==AfxMessageBox("是否真的要注销?",MB_YESNO))
{
return ;
}
if(i<0)
{
return;
}
else
{
CString str;
str=m_mText(i,0);
if(!(AFX_DB_USE_DEFAULT_TYPE,"select * from Reader where
RID='"+str+"'"))
{
AfxMessageBox("数据库打开失败!");
return ;
}
35 try
{
();
y();
}
catch(...)
{
AfxMessageBox("注销失败!");
();
return ;
}
();
m_Item(i);
m_raw(TRUE);
}
}
void CReaderDelete::OnOUT()
{
// TODO: Add your control notification handler code here
EndDialog(IDCANCEL);
}
3.2.3管理员信息管理子模块的实现
管理员管理管理员信息,主要包括借阅者的删除,添加操作。
添加管理员的界面设计:
图3-22添加管理员界面
添加管理员的编程设计:
36 流程图如下:
开始添加管理员Y在数据库中添加管理员N添加成功N提示用户Y成功添加结束
图3-23添加管理员流程图
主要代码如下:
BOOL CAdmin::OnInitDialog()
{
CDialog::OnInitDialog();
return TRUE;
}
void CAdmin::OnOK()
{
UpdateData(TRUE);
if(m_y() || m_y())
{
AfxMessageBox("有未填项!");
return ;
}
if(m_PASSWORD!=m_AGAIN)
{
AfxMessageBox("两次密码输入不一致,请重新输入!");
m_AGAIN=_T("");
return ;
}
else
{
37
}
void CAdmin::OnCancel()
if(!m_())
{
AfxMessageBox("数据库打开失败!");
return ;
}
m_();
m_AdminRset.m_AID=m_NO;
m_AdminRset.m_ANAME=m_NAME;
m_AdminRset.m_APassword=m_PASSWORD;
try
{
m_();
}
catch(...)
{
m_();
if(IDYES==AfxMessageBox("该ID可能已注册请重新选择ID号?",MB_YESNO))
{
return ;
}
else
EndDialog(IDCANCEL);
}
if(IDYES==AfxMessageBox("注册成功!是否继续?",MB_YESNO))
{
m_NO=_T("");
m_NAME = _T("");
m_PASSWORD = _T("");
m_AGAIN = _T("");
UpdateData(FALSE);
m_();
return ;
}
else
{
m_();
EndDialog(IDCANCEL);
}
}
38 {
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
删除管理员的界面设计:
图3-24删除管理员界面
删除管理员的编程设计:
流程图如下:
开始删除管理员Y在数据库中删除管理员N删除成功N提示用户Y成功删除结束
39
图3-25删除管理员流程图
主要代码如下:
BOOL CAdminDelete::OnInitDialog()
{
CDialog::OnInitDialog();
m_Column(0,"管理员编号",LVCFMT_LEFT,100);
m_Column(1,"登陆名",LVCFMT_LEFT,100);
if(!m_())
{
AfxMessageBox("数据库打开失败!");
return FALSE;
}
int i=0;
while(!m_())
{
m_AdminRset.m_ght();
m_AdminRset.m_ght();
m_Item(i,m_AdminRset.m_AID);
m_mText(i,1,m_AdminRset.m_ANAME);
i++;
m_xt();
}
m_olor(RGB(244,200,222));
m_tBkColor(RGB(244,200,222));
m_();
}
void CAdminDelete::OnDelete()
{
int i=m_ectionMark();
int x=m_mCount();
if(x==1)
{
AfxMessageBox("最后一个管理员。。。。无法删除!");
return ;
}
if(IDNO==AfxMessageBox("是否真的要注销?",MB_YESNO))
{
return ;
}
if(i<0)
{
return;
}
else
40 {
CString str;
str=m_mText(i,0);
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select * from ADMIN where
AID='"+str+"'"))
{
AfxMessageBox("数据库打开失败!");
return ;
}
try
{
m_();
m_y();
}
catch(...)
{
AfxMessageBox("注销失败!");
m_();
return ;
}
m_raw(TRUE);
m_();
}
}
3.2.4书籍类别信息管理子模块的实现
管理员管理书籍类别信息,主要包括借阅者的删除,添加操作
书籍类别信息管理的界面设计:
图3-26书籍类别信息管理的界面
书籍类别信息管理的编程实现:
41 流程图如下:
开 始删除/增加书籍类别Y在数据库中删除/增加书籍类别N删除/增加成功N提示用户Y成功删除/增加结束
图3-27书籍类别信息管理流程图
主要代码如下:
BOOL CTypeTrans::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
if(!m_())
{
AfxMessageBox("数据表BOOKTYPE加载失败!");
return FALSE;
}
while(!m_())
{
m_typeRset.m_ght();
m_ing(m_typeRset.m_TpyeName);
m_xt();
}
m_();
m_Sel(0);
m_NO=m_typeRset.m_BType;
m_Name=m_typeRset.m_TpyeName;
m_Days=m_typeRset.m_DaysCanBorrow;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
42 }
void CTypeTrans::OnAdd()
{
// TODO: Add your control notification handler code here
if(!m_())
{
((CButton*)GetDlgItem(IDC_BUTTON4))->EnableWindow(FALSE);
m_IsEdit=TRUE;
ReadOnly(FALSE);
if(!m_())
{
AfxMessageBox("数据表BOOKTYPE加载失败!");
return ;
}
m_();
}
}
void CTypeTrans::OnDelete()
{
// TODO: Add your control notification handler code here
// TODO: Add extra initialization here
CString str;
if(IDNO==AfxMessageBox("你确定要删除此项吗?",MB_YESNO))
{
return ;
}
int i=m_Sel();
if(i>=0)
{
m_t(i,str);
if(!m_(AFX_DB_USE_DEFAULT_TYPE,"select
BOOKTYPE where TpyeName='"+str+"'"))
{
AfxMessageBox("数据表BOOKTYPE加载失败!");
return ;
}
if(m_())
{
AfxMessageBox("查找不到你要删除的类型!");
m_();
return ;
}
try
{
43
* from
}
m_();
}
catch(...)
{
AfxMessageBox("外键约束,不能删除");
m_();
return ;
}
m_String(i);
m_Data(FALSE);
m_Sel(0);
m_y();
m_();
}
else
{
AfxMessageBox("没有要删除的数据");
}
第四章 相关的技术难点及总结
4.1使用到的技术难点
数据库的连接与数据操作:
开放数据库互连是一种数据库互连操作平台,通过已经严格定义的各个级别的ODBC接口和客户系统的初始装置,能够为应用程序提供数据库类型透明性,让应用程序的编写者避免了与数据源相联的复杂性。MFC的数据库扩展部分封装了使用ODBC数据资源的细节,应用程序可以直接使用MFC中的数据库扩展类,来操纵ODBC驱动程序管理器,访问数据库。进行MFC ODBC数据库开发时,所需的基础工具就是MFC ODBC数据库类的使用。
MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简单的调用接口,从而大大方便了数据库应用程序的开发。程序员不必了解ODBC API和SQL的具体细节。利用ODBC类即可完成对数据库的大部分操作。本课程设计使用了的MFC的ODBC类主要包括CDdatabase类:主要功能是建立与数据库的连接。
要建立与数据库的连接,首先构造一个CDdatabase对象,然后再调用CDdatabase的Open成员函数,其负责建立连接。对数据库中数据的操作还包括修改(Edit成员函数)、添加(AddNew成员函数)和删除(Delete成员函数)。
控件和对话框的使用:
控件是应用程序窗口的子窗口。MFC的控件类封装了Windows的标准控件和通用控件,这些控件类都派生于类CWnd。
静态文本控件由类CStatic封装,按钮控件由类CButton封装,编辑控件由类CEdit封装,进度条控件由类CProgessCtrl封装,微调器控件由类CSpinButtonCtrl封装,图象列表控件由类CImageList封装,列表视图控件由类CListCtrl封装。控件类的使用与窗口类CWnd的使用基本相同。
对话框是Windows应用程序与用户交互的重要手段,分为模态对话框和非模态对话框。
44 对话框的基本行为由类CDialog封装,对话框的外观由模版资源定义。对话框模版资源可以使用Visual C++的资源编辑器来创建和编辑。
资源的使用:
资源是供Windows应用程序使用的数据,它们驻留在执行文件中。程序运行时,随着程序的需要,这些数据可以被动态地加载进入内存。资源是程序用户界面的重要组成部分。常用资源有菜单,加速键,图标,位图。程序所需要的资源使用资源描述文件来说明,并在资源头文件中用标识符唯一地标识。资源可以使用VisualC++的资源编辑器来创建和编辑,也可以使用文本编辑器来编辑。
菜单的使用与Windows的命令消息WM_COMMAND相关。菜单项消息映射宏的格式是:
ON_COMMAND;菜单项动态修改的消息映射宏的格式是: ON_UPDATE_COMMAND_UI。
在文档/视图结构的程序中,资源的加载是由应用程序类的InitInstance函数通过构造CDocTemplate(包括其派生类)对象来完成的。
位图要用CBitmap对象来保存,由成员函数LoadBitmap来加载,在显示时需先绘制到内存DC中,然后再用BitBlt函数把它由内存DC复制到显示设备的DC上。
4.2开发过程中碰到的难点及解决过程
在开发过程中遇到了一些比较棘手的问题,也解决了这些问题。
主要包括数据库的连接与数据操作:要建立与数据库的连接,首先构造一个CDdatabase对象,然后再调用CDdatabase的Open成员函数,其负责建立连接。对数据库中数据的操作还包括修改(Edit成员函数)、添加(AddNew成员函数)和删除(Delete成员函数)。
要修改当前记录,应该按下列步骤进行:
调用Edit成员函数,调用该函数后就进入编辑模式,程序可以修改域数据成员,注意不要在一个空的记录集中调用Edit,否则会产生异常。Edit函数会把当前域数据成员的内容保存在一个缓冲区中,这样做有两个目的,一是可以与域数据成员做比较以判断哪些字段别改变了,二是可以在必要的时候可以恢复域数据成员原来的值。若再次调用Edit,则将从缓冲区中恢复与数据成员,调用后程序仍处于编辑模式。调用Move(AFX_MOVE_REFERESH)或Move(0)可推出编辑模式(AFX_MOVE_REFERESH的值为0),同时该函数会从缓冲区中恢复域数据成员。设置域数据成员的新值,调用Update完成编辑。Update把变化后的记录写入数据源并结束编辑模式。
要向记录中添加新的记录,应该按下列步骤进行:
调用AddNew成员函数,调用该函数后就进入添加模式,该函数把所有的域数据成员都设置成NULL(注意,在数据库术语中,NULL是指没有值这与C++的NULL是不同的)。与Edit一样,AddNew会把当前域数据成员内容保存在一个缓冲区中,在必要的时候,程序可以再次调用AddNew取消添加操作并恢复域数据成员原来的值,调用后程序仍处于添加模式。调用Move(AFX_MOVE_REFERESH)可退出添加模式,同时该函数会从缓冲区中恢复数据成员。设置域数据成员,调用Update把域数据成员中的内容作为新的记录写入数据源,从而结束添加。如果记录集是快照,那么在添加一个新的记录后,需要调用Requery重新查询,应为快照无法反映添加操作。
要要删除记录集的当前记录,应该按下列步骤进行:
调用Delete成员函数。该函数会同时给记录集和数据源中的当前记录加上删除标记。注意不要在一个空记录集中调用Delete,否则会产生一个异常。滚动到另一个记录上以跳过删除记录。
4.3感想
通过课程设计中编写图书管理系统中的书库管理系统,为整个小组最终完成图书管理系
45
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689607549a270158.html
评论列表(0条)