图书管理系统(VC++与 SQL SERVER)
一.数据库设计
一共 4 张表:管理员基本信息表,图书信息表,借阅卡信息表,借书信息表
管理员信息表
字段名称 数据类型
可否为空 约束条件
用户名
Varchar(50)
NOT NULL 主键
密码
Varchar(50)
NOT NULL 无
图书信息表
字段名称 数据类型
可否为空 约束条件
书籍 ID
Varchar(50)
NOT NULL 主键
书名
作者
Varchar(50)
NOT NULL 无
Varchar(50)
NOT NULL 无
出版社
Varchar(50)
NOT NULL 无
单价
Float(8)
NOT NULL 无
入库时间 Datetime(8)
NOT NULL 无
总量
现存量
Int(4)
Int(4)
NOT NULL 无
NOT NULL 无
借阅卡信息表
字段名称
数据类型
可否为空 约束条件
借阅卡 ID
Varchar(50)
NOT NULL 主键
姓名
性别
Varchar(50)
NOT NULL 无
Varchar(50)
NOT NULL 无
出生日期
Datetime(8)
NOT NULL 无
地址
Varchar(50)
NOT NULL 无
身份证号码 Varchar(50)
NOT NULL 无
电话号码
Varchar(50)
NOT NULL 无
现借书总量 Int(4)
NOT NULL 无
借书信息表
字段名称 数据类型
可否为空 约束条件
借书 ID
Varchar(50)
NOT NULL 主键
借阅卡 ID
Varchar(50)
NOT NULL 外键(借阅信息表)
书籍 ID
Varchar(50)
NOT NULL 外键(图书信息表)
借出时间 Dateime(8)
NOT NULL 无
二.新建数据库用户的登陆和数据源的连接
1.打开企业管理器,新建一个数据库,命名为图书管理。按照上面四张表格建立四张表。
在安全性目录下创建一个新登陆用户,用户名为 zhang 密码为 123,并设定允许该用户
访问图书管理数据库。
2.打开管理工具中的数据源(ODBC),添加 SQL SERVER 数据源命名为 Library,服务器
为 Local,使用数据库用户登陆。
3.点击测试是否成功,如果测试成功则点确定。
三.工程框架设计
1.将应用程序类型设定为基于对话框的应用程序。设定工程名称为 LibraryDBS。
2.将主对话框的 ID 改为 ID_DIALOG_LIBRARYDBS,标题改为“图书馆管理系统”。
主对话框布局如图
书籍管理控件列表
控件类型 ID
组框
按钮
按钮
按钮
按钮
按钮
IDC_STATIC
IDC_BUTTON_BOOK_IN
属性
书籍管理
新书入库
变量或者函数
无
OnButtonBookIn()
IDC_BUTTON_BORROW_RETURN 借书/还书
OnButtonBorrowReturn()
IDC_BUTTON_BOOK_LOST
书籍挂失
OnButtonBookLost()
IDC_BUTTON_BOOK_CHECK
图书信息查询 OnButtonBookCheck()
IDC_BUTTON_BORROW_CHECK 借书信息查询 OnButtonBorrowCheck()
借阅卡管理控件列表
控件类型 ID
属性
变量或者函数
组框
按钮
按钮
按钮
IDC_STATIC
借阅卡管理
无
IDC_BUTTON_NEW_PROOF
办理借阅卡
OnButtonNewProof()
IDC_BUTTON_PROOF_CHECK 借阅卡信息查询 OnButtonProofCheck()
IDC_BUTTON_PROOF_LOST 借阅卡挂失
OnButtonProofLost()
系统管理控件列表
控件类型 ID
属性
变量或者函数
组框
按钮
按钮
按钮
IDC_STATIC
系统管理
无
IDC_BUTTON_ADD_USER
注册管理员 OnButtonAddUser()
IDC_BUTTON_MOD_PASSWORD 修改密码
OnButtonModPassword()
IDOK
退出
无
3.总的工程设计一共分为 5 个部分:管理员的登陆,书籍的入库、查询和挂失,借阅卡的
办理、查询和挂失,管理员的注册和密码的修改,借书和还书的办理。
第一部分 管理员的登陆
1.添加一个对话框,对话框的类名为 CLoginDlg,资源 ID 为 IDD_DIALOG_LOGIN,对话框名
称为“登陆图书管理系统”
2.登陆对话框如图
对话框控件列表:
控件类型 ID
属性
变量或者函数
静态文本 IDC_STATIC
登陆图书管理系统 无
静态文本 IDC_STATIC
编辑框
IDC_EDIT_USER
静态文本 IDC_STATIC
用户名
无
密码
无
CString 类型变量 m_strUser
无
编辑框
IDC_EDIT_PASSWORD 无
CString 类型变量 m_strPassword
按钮
按钮
IDOK
IDCANCLE
3.部分程序代码
登陆
退出
OnOK()
无
在主对话框创建前先创建登陆对话框,在 BOOL CLibDBSDlg::OnInitDialog()中添加代码
BOOL CLibDBSDlg::OnInitDialog()
{
…
CLoginDlg dlg;
m_login=1;
dlg.m_login=&m_login;
dlg.DoModal();
if(m_login)
{
CDialog::OnOK();
}
…
}
实现登陆成功的部分代码,在 void CLoginDlg::OnOK()中添加代码
void CLoginDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData();
if(m_strUser==""||m_strPassword=="")
{
MessageBox("请填写用户名和密码!","登陆图书管理系统");
m_strUser.Empty();
m_strPassword.Empty();
UpdateData(FALSE);
return;
}
if(!m_database.IsOpen())
{
if(!m_database.Open(_T("Library")))
{
MessageBox("连接数据库失败!","数据库连接");
return;
}
}
CLoginSet *m_pset=new CLoginSet(&m_database);
CString strSQL;
strSQL.Format("select * from 管 理 员 信 息 表 where 用 户 名 ='%s' AND 密 码
='%s'",m_strUser,m_strPassword);
m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
if(!m_pset->GetRecordCount())
{
if(count<5)
{
MessageBox("对不起,你输入的用户名和密码不正确!","图书管理系统");
count++;
m_strUser.Empty();
m_strPassword.Empty();
UpdateData(FALSE);
}
else
{
m_database.Close();
MessageBox("你的登陆失败超过 5 次,请与管理员联系!","图书管理系统");
OnCancel();
}
}
else
{
m_database.Close();
*m_login=0;
CDialog::OnOK();
}
}
第二部分 书籍的入库,查询和挂失
书籍入库
1. 添 加 一 个 对 话 框 , 对 话 框 的 类 名 为 CNewBookInDlg , 资 源 ID 为
IDD_DIALOG_NEW_BOOK_IN,对话框名称为“新书入库”
2. 新书入库对话框如图
对话框控件列表
控件类型 ID
静态文本 IDC_STATIC
属性
书号
变量或者函数
无
编辑框
IDC_EDIT_BOOK_NO
无
CString 类型变量 m_strBookNo
静态文本 IDC_STATIC
书名
无
编辑框
IDC_EDIT_BOOK_NAME 无
CString 类型变量 m_strBookName
静态文本 IDC_STATIC
作者
无
编辑框
IDC_EDIT_WRITER
无
CString 类型变量 m_strWriter
静态文本 IDC_STATIC
单价
无
编辑框
IDC_EDIT_PRICE
无
double 类型变量 m_dPrice
静态文本 IDC_STATIC
出版社 无
编辑框
IDC_EDIT_PRESS
无
CString 类型变量 m_strPress
静态文本 IDC_STATIC
总量
无
编辑框
IDC_EDIT_TOTAL
无
Long 类型变量 m_lTotal
静态文本 IDC_STATIC
现存量 无
编辑框
IDC_EDIT_NOW
无
Long 类型变量 m_lNow
按钮
按钮
IDC_BUTTON_BOOK_IN 入库
OnButtonBookIn()
IDC_BUTTON_BACK
返回
OnButtonBack()
3.实现书籍入库功能在 void CNewBookInDlg::OnButtonBookIn()添加代码
void CNewBookInDlg::OnButtonBookIn()
{
// TODO: Add your control notification handler code here
UpdateData();
if(m_strBookNo.Compare("")==0)
{
MessageBox("请输入书号!","新书入库");
return;
}
if(!m_database.IsOpen())
{
if(!m_database.Open(_T("Library")))
{
MessageBox("连接数据库失败!","新书入库");
return;
}
}
CBookSet *m_pset= new CBookSet(&m_database);
CString strSQL;
strSQL.Format("select * from 图书信息表 where 书籍 ID='%s'",m_strBookNo);
m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
if(m_pset->GetRecordCount()!=0)
{
m_pset->Edit();
m_pset->m_Total=m_pset->m_Total+m_lTotal;
m_pset->m_Now=m_pset->m_Now+m_lNow;
m_pset->Update();
m_pset->Requery();
m_pset->Close();
m_database.Close();
MessageBox("添加书籍成功!","新书入库");
return;
}
m_pset->Close();
if(m_strBookNo==""||m_strBookName==""||m_strWriter==""||m_dPrice==0||
m_strPress==""||m_lTotal==0||m_lNow==0)
{
MessageBox("请将下列选项填写完整!","新书入库");
m_database.Close();
return;
}
strSQL.Format("select * from 图书信息表");
m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
if(m_pset->GetRecordCount()==0)
{
MessageBox("添加的第一本书!","新书入库");
}
m_pset->AddNew();
m_pset->SetFieldNull(&(m_pset->m_Book_NO),FALSE);
m_pset->m_Book_NO=m_strBookNo;
m_pset->SetFieldNull(&(m_pset->m_Book_Name),FALSE);
m_pset->m_Book_Name=m_strBookName;
m_pset->SetFieldNull(&(m_pset->m_Writer),FALSE);
m_pset->m_Writer=m_strWriter;
m_pset->SetFieldNull(&(m_pset->m_Price),FALSE);
m_pset->m_Price=m_dPrice;
m_pset->SetFieldNull(&(m_pset->m_Press),FALSE);
m_pset->m_Press=m_strPress;
m_pset->SetFieldNull(&(m_pset->m_Total),FALSE);
m_pset->m_Total=m_lTotal;
m_pset->SetFieldNull(&(m_pset->m_Now),FALSE);
m_pset->m_Now=m_lNow;
CTime curTime=CTime::GetCurrentTime();
m_pset->SetFieldNull(&(m_pset->m_InLibrary_Time),FALSE);
m_pset->m_InLibrary_Time=curTime;
m_pset->Update();
m_pset->Requery();
m_pset->Close();
m_database.Close();
MessageBox("新书入库成功!","新书入库");
m_strBookNo.Empty();
m_strBookName.Empty();
m_strWriter.Empty();
m_dPrice=0;
m_strPress.Empty();
m_lTotal=0;
m_lNow=0;
UpdateData(FALSE);
return;
}
书籍查询
1. 添加一个对话框,对话框的类名为 CBookCheckDlg,资源 ID 为 IDD_DIALOG_BOOK_CHECK,
对话框名称为“图书查询”
2. 图书查询对话框如图
书籍查询对话框控件列表
控件类型 ID
静态文本 IDC_STATIC
编辑框
IDC_EDIT_BOOK_NO
IDC_BUTTON_CHECK
按钮
按钮
按钮
属性
书号
无
查询
变量或者函数
无
CString 类型变量 m_strBookNo
OnButtonCheck()
IDC_BUTTON_CHECK_ALL 全部查询 OnButtonCheckAll()
IDC_BUTTON_BACK
列表控件 IDC_LIST_RESULT
返回
无
OnButtonBack()
CListCtrl 类型变量 m_ctrList
3. 实现查询书籍功能在 void CBookCheckDlg::OnButtonCheck()添加代码
void CBookCheckDlg::OnButtonCheck()
{
// TODO: Add your control notification handler code here
UpdateData();
if(m_strBookNo=="")
{
MessageBox("请输入书号!","书籍查询");
return;
}
if(!m_database.IsOpen());
{
if(!m_database.Open(_T("Library")))
{
MessageBox("连接数据库失败!","书籍查询");
return;
}
}
CBookSet *m_pset=new CBookSet(&m_database);
CString strSQL;
strSQL.Format("select * from 图书信息表 where 书籍 ID='%s'",m_strBookNo);
m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL);
if(m_pset->GetRecordCount()==0)
{
MessageBox("书库中没有该书!","书籍查询");