2008级数据库课程设计任务书
【设计目的】
数据库课程设计是在学生系统地学习了《数据库系统原理》课程后,按照关系型数据库的基本远离,综合运用所学的知识,设计开发一个小型的数据库管理信息系统,通过对一个实际问题的分析、设计与实现,将原理与应用相结合,使学生学会如何把书本上学到的知识用于解决世界问题,培养学生的动手能力;另一方面,使学生能深入理解和灵活掌握教学内容。
【设计要求】
1、课程设计题目自信填充,独立完成;
2、课程设计时间为1.5周;
3、数据库管理系统不限(Oracle\SQL Server\MySQL\Access…)、开发语言不限(VC\VC\ C++Builder\Delphi\C#\.net\ASP…),避免把学习语言的时间放在设计期间;
4、从开始的系统雪球分析到最后的软件测试,都要有详细的计划,设计文档应按照数据库设计的要求书写;
5、系统中的数据表设计合理、高效、尽量减少数据冗余,软件界面友好、健壮性强;
6、上机时间:上午8:20-11:50 ,下午 2:10-5:40;
7、无论在校外、校内,都要严格最受学校和所在单位的学习和劳动纪律、规章制度,学生有事离校必须请假。课程设计期间,无故缺席按旷课处理;缺席时间达四分之一以上者,其成绩按不及格处理。
【题目】
图书馆进销存系统
一、 设计目的
学生根据所学的数据库原理与程序设计的知识,能够针对一个小型的数据库管理信息系统,进行系统的需求分析,系统设计,数据库设计,编码,测试等完成题目要求的功能,从而达到掌握开发一个小型数据库管理信息系统的目的。
二、 设计内容
1)新书的入库。
2)新用户的注册
3)藏书的搜索
4)用户密码的找回
5)对藏书的借还状态的查询
6)用户的书籍借阅记录
7)管理员对图书借还的管理
8)用户对个人信息的管理
【一】需求分析
【二】概念结构设计
【三】逻辑结构设计
【四】物理设计
因为一个用户可以借阅多本图书,所以用户表对借阅表和管理表为一对多的关系,因此为了保证查询的唯一性和减少冗余,又因为书的编号唯一,所以以书的编号建立索引
【五】数据库的实施和维护
用户手册:
进入本系统首先会进入初始界面
新用户点击用户注册先输入自己的详细信息和密码注册即可
注册完毕后返回点击用户登陆,输入学号和密码进行登陆
如果忘记密码,点击找回密码,输入个人信息即会显示密码
登陆成功后,会进入个人界面,全部的图书信息均会显示出来,用户可以根据书名进行查询,若图书状态为可借,则可以进行预约
点击个人信息,可以查看用户目前所借阅的书
用户找到书后,前往管理员出进行借书,管理员通过管理员登陆可以进行新书添加,书籍借出和书籍归还工作
新书添加可以进行书籍入库工作
点击借书输入用户和书籍信息,并查询书籍的预约情况可以进行借书工作
用户进行还书时,输入书籍的编号既可以清除用户的借书记录
总结:
系统优缺点:本系统是在学习过数据库系统原理后用MFC语言所做的一款系统,具有简易的图书馆信息管理功能,但是对于惩罚系统和对借阅时间的管理上做的不够完善和智能,操作界面略显简陋,不够优美赏心悦目,但是对于一个图书馆系统所应该具有基本功能都具备。
个人感想:通过这次的数据库系统课程设计,本人熟悉了对SQL Server 2000,2005,Oracle ,VS2008,vc++6.0等软件的应用,但因为实现准备工作不够充分,因此,在进行编写时略微仓促了些,也暴露和许多的问题,比如对MFC语言不够精通等,不过最终许多问题都通过网上查找资料解决了,也从中学到了许多,不管怎么说,这是本人设计的第一款具有数据库管理功能的可视化软件,整个编写代码的过程大概用了一个下午,三个星期大部分时间都浪费了,在下次进行课程设计的时候,本人将吸取经验,充分利用好所有的时间,争取将课程设计做的更加完善完美。
附录:
ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}
// 初始化—连接数据库
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
m_pConnection->Open("FILEDSN=f:\\WYF.dsn;PageTimeout=5","uid=administrator", "pwd=wyf890722",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
// 执行查询
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}
// 执行SQL语句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
// _variant_t RecordsAffected;
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}
void login::OnOK()
{
// TODO: Add extra validation here
UpdateData();
if(m_id=="")
{
MessageBox("帐号不能为空!");
return;
}
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString str;
str.Format("SELECT * From 管理员 Where 帐号='%s'",m_id);
_bstr_t vSQL;
vSQL=_bstr_t(str);
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
if(m_code!=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("密码"))
{
MessageBox("密码错误!");
return;
}
else
{
choice dlg;
dlg.DoModal();
}
CDialog::OnOK();
}
void code::OnOK()
{
// TODO: Add extra validation here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString str;
str.Format("SELECT * From 学生 Where 学号='%s' and 姓名='%s' and 学院='%s'and 专业='%s'",m_id,m_name,m_xueyuan,m_zhuanye);
_bstr_t vSQL;
vSQL=_bstr_t(str);
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
str=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("密码");
MessageBox("你的密码为"+str);
CDialog::OnOK();
}
ook::look(CWnd* pParent /*=NULL*/)
: CDialog(look::IDD, pParent)
{
//{{AFX_DATA_INIT(look)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
id="";
}
void look::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(look)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(look, CDialog)
//{{AFX_MSG_MAP(look)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// look message handlers
BEGIN_EVENTSINK_MAP(look, CDialog)
//{{AFX_EVENTSINK_MAP(look)
ON_EVENT(look, IDC_DATAGRID1, -600 /* Click */, OnClickDatagrid1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void look::OnClickDatagrid1()
{
// TODO: Add your control notification handler code here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString str;
str.Format("SELECT * From 管理 Where 编号='%s'",id);
_bstr_t vSQL;
vSQL=_bstr_t(str);
m_AdoConn.ExitConnect();
}
void search::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
if(m_name=="")
{
MessageBox("输入不能为空!");
return;
}
CString str;
str.Format("SELECT * From 藏书 Where 书名='%s'",m_name);
_bstr_t vSQL;
vSQL=_bstr_t(str);
m_Adodc.SetRecordSource(vSQL);
m_Adodc.Refresh();
m_AdoConn.ExitConnect();
}
void search::OnButton3()
{
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString str,str1,str2,str3,str4;
str.Format("select * from 藏书 where 书名='%s'",m_name);
_bstr_t vSQL;
vSQL=_bstr_t(str);
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
str1=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("是否可借");
str4=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("编号");
if(str1=="可借")
{
str.Format("INSERT INTO 预约 VALUES ('%s','%s','%s','%s')",str4,m_name,id,name);
MessageBox("预约成功!");
m_AdoConn.ExecuteSQL(_bstr_t(str));
str.Format("update 藏书 set 是否可借='已预约' where 书名='%s'",m_name);
m_AdoConn.ExecuteSQL(_bstr_t(str));
}
else
{
MessageBox("该书已借出!");
}
void borro::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
if(m_id=="")
{
MessageBox("输入不能为空!");
return;
}
CString str;
str.Format("SELECT * From 藏书 Where 书名='%s'",m_id);
_bstr_t vSQL;
vSQL=_bstr_t(str);
m_AdoConn.ExitConnect();
}
void borro::OnOK()
{
// TODO: Add extra validation here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString str,str1,str2;
str.Format("select * from 藏书 where 编号='%s'",m_id);
m_AdoConn.ExecuteSQL(_bstr_t(str));
_bstr_t vSQL;
vSQL=_bstr_t(str);
_RecordsetPtr m_pRecordset;
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
str2=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("书名");
str.Format("insert into 管理 values ('%s','%s','%s','%s','%s','%s')",m_id,str2,m_ID,m_name,m_date1,m_date2);
MessageBox("成功借出");
m_AdoConn.ExecuteSQL(_bstr_t(str));
str.Format("update 藏书 set 是否可借='已借出' where 编号='%s'",m_id);
m_AdoConn.ExecuteSQL(_bstr_t(str));
str.Format("delete from 预约 where 编号='%s'",m_id);
m_AdoConn.ExecuteSQL(_bstr_t(str));
m_AdoConn.ExitConnect();
CDialog::OnOK();
}
void add::OnOK()
{
// TODO: Add extra validation here
// TODO: Add your control notification handler code here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
if(m_id=="")
{
MessageBox("编号不能为空!");
return;
}
CString str;
str.Format("INSERT INTO 藏书 VALUES('%s','%s','%s','%s','%f','可借')",m_name,m_id,m_publisher,m_author,m_price);
_bstr_t vSQL;
vSQL=_bstr_t(str);
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();
MessageBox("添加成功!");
CDialog::OnOK();
}
void delet::OnOK()
{
// TODO: Add extra validation here
UpdateData();
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString str;
str.Format("delete from 管理 where 编号='%s'",m_id);
m_AdoConn.ExecuteSQL(_bstr_t(str));
str.Format("update 藏书 set 是否可借='可借' where 编号='%s'",m_id);
m_AdoConn.ExecuteSQL(_bstr_t(str));
CDialog::OnOK();
}