数据库课程设计1215副本.docx
《数据库课程设计1215副本.docx》由会员分享,可在线阅读,更多相关《数据库课程设计1215副本.docx(32页珍藏版)》请在冰豆网上搜索。
数据库课程设计1215副本
数据库课程设计
题目图书管理系统
院系计算机学院
专业名称教育方向
年级2009级
学生彭洪伟(0950310006)
周发洋(0950310012)
指导教师邱长春
二〇一一年十二月
目录
数据库创建部分1
一、创建数据库(SQLServer2008)1
(1)图书管理数据库相关信息1
(2)创建图书管理数据库。
1
二、图书管理系统E-R图2
三、图书管理系统基本表3
(1)读者信息表3
(2)图书信息表4
(3)借阅表6
四、视图6
(1)实现功能7
五、存储过程7
六、触发器11
连接数据库部分12
一、主窗口12
二、图书查询13
三、借书15
四、还书16
五、读者管理17
六、图书管理22
七、关于25
数据库创建部分
一、创建数据库(SQLServer2008)
(1)图书管理数据库相关信息。
数据库名:
MBOOK
数据文件名:
MBOOK
日志文件名:
MBOOK_Log
图书管理系统的数据库为MBOOK,改数据库由读者(Treader)、图书(TBook)、借阅(TLend)、3个表构成,依托3个基本表创建视图、触发器、和存储过程。
(2)创建图书管理数据库。
创建数据库MBOOK的T-SQL语句如下。
CREATEDATABASEMBOOK
创建数据库MBOOK的界面如下图所示。
二、图书管理系统E-R图
三、图书管理系统基本表
(1)读者信息表
1、读者信息表结构
创建读者信息表,表名为“TReader”,表结构如下:
项目
字段名
类型与宽度
是否主键
是否允许空值
说明
借书证号
ReaderID
char(8)
√
×
姓名
Name
char(8)
×
×
性别
Sex
bit
×
×
1:
男,0:
女
出生时间
Born
date
×
×
专业
Spec
char(12)
×
×
借书量
Num
Int
×
×
小于等于5,默认为0
照片
Photo
varbinary(MAX)
×
√
联系方式
Addr
xml
×
√
2、创建读者信息表
界面方式创建读者信息表。
界面如下:
3、读者信息表样本数据
(2)图书信息表
创建图书信息表,创建方式同上。
表名为“TBook”,表结构如下:
项目
字段名
类型与宽度
是否主键
是否允许为空
说明
IBSN
ISBN
char(8)
√
×
出版物的代码
书名
BookName
char(40)
×
×
作译者
Author
char(16)
×
×
出版社
Publisher
char(30)
×
×
价格
Price
float
×
×
复本量
CNum
int
×
×
库存量
SNum
int
复本量=库存量+已经借阅的统计。
当借一本书时,book的库存量减1;还一本书书事加1
内容提要
Summary
varchar(200)
×
√
封面照片
Photo
varbinary(MAX)
×
√
图书信息表样本数据:
(3)借阅表
1、借阅表结构
创建借阅表,创建方式同上。
表名为“TLend”,表结构如下所示:
项目
字段名
类型与宽度
是否主键
是否允许为空
说明
图书ID
BookID
char(10)
√
×
借书证号
ReaderID
char(8)
×
×
ISBN
ISBN
char(18)
×
×
借书时间
LTime
datetime
×
×
2、借阅表样本数据
四、视图
创建“读者借阅图书”视图,名称为RBL。
通过“借书证号(ReaderID)”将读者表(TReader)和借阅表(TLend)联系起来,通过“ISBN”将借阅表(TLend)和图书信息表(TBook)联系起来,视图包含借书证号、图书ID、ISBN、书名、出版社、价格、借书时间等列。
(1)实现功能
把三个基本表联系起来,方便需要3个表关联的功能使用,如图所示:
五、存储过程
共有两个存储过程,分别为:
Book_Borrow、Book_Return
1、Book_Borrow
参数:
借书证号(in_ReaderID)、ISBN(in_ISBN)、图书ID(in_BookID)、执行信息(out_str)。
实现功能:
根据存储过程前三个参数,实现读者图书“借阅”。
第四个参数为输出参数,将存储过程的执行情况以字符串形式赋予此参数。
“借阅”存储过程代码:
USE[MBOOK]
GO
/******Object:
StoredProcedure[dbo].[Book_Borrow]******/
/******ScriptDate:
12/13/201116:
34:
06******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATEPROCEDURE[dbo].[Book_Borrow]@in_ReaderIDchar(8),@in_ISBNchar(18),@in_BookIDchar(10),@out_strchar(30)OUTPUT
AS
BEGIN
IFNOTEXISTS(SELECT*FROMTReaderWHEREReaderID=@in_ReaderID)
BEGIN
SET@out_str='该读者不存在'
RETURN0
END
IFNOTEXISTS(SELECT*FROMTBookWHEREISBN=@in_ISBN)
BEGIN
SET@out_str='该图书不存在'
RETURN0
END
IF(SELECTNumFROMTReaderWHEREReaderID=@in_ReaderID)=5
BEGIN
SET@out_str='读者借书量不能大于5'
RETURN0
END
IF(SELECTSNumFROMTBookWHEREISBN=@in_ISBN)=0
BEGIN
SET@out_str='图书库存量为0'
RETURN0
END
IF@in_ISBNIN(SELECTISBNFROMTLendWHEREReaderID=@in_ReaderID)
BEGIN
SET@out_str='读者已经借过该书'
RETURN0
END
IFEXISTS(SELECT*FROMTLendWHEREBookID=@in_BookID)
BEGIN
--SET@out_str='该图书ID已存在'
set@out_str='该图书已借出'
RETURN0
END
BEGINTRAN/*开始一个事务*/
INSERTINTOTLendVALUES(@in_BookID,@in_ReaderID,@in_ISBN,GETDATE())
IF@@ERROR>0/*如果前面一条SQL语句出错则回滚事务并返回*/
BEGIN
ROLLBACKTRAN
SET@out_str='执行过程中遇到错误'
RETURN0
END
UPDATETReaderSETNum=Num+1WHEREReaderID=@in_ReaderID
IF@@ERROR>0/*如果前面一条SQL语句出错则回滚事务并返回*/
BEGIN
ROLLBACKTRAN
SET@out_str='执行过程中遇到错误'
RETURN0
END
UPDATETBookSETSNum=SNum-1WHEREISBN=@in_ISBN
IF@@ERROR=0/*如果所有语句都不出错则结束事务并返回*/
BEGIN
COMMITTRAN
SET@out_str='借书成功'
RETURN1
END
ELSE/*如果执行出错则回滚所有操作并返回*/
BEGIN
ROLLBACKTRAN
SET@out_str='执行过程中遇到错误'
RETURN0
END
END
2、Book_Return
参数:
借书证号(in_ReaderID)、ISBN(in_ISBN)、图书ID(in_BookID)、执行信息(out_str)。
实现功能:
根据存储过程前三个参数,实现读者图书“还书”。
第四个参数为输出参数,将存储过程的执行情况以字符串形式赋予此参数。
“还书”存储过程代码:
USE[MBOOK]
GO
/******Object:
StoredProcedure[dbo].[Book_Return]******/
/******ScriptDate:
12/13/201116:
39:
08******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATEPROCEDURE[dbo].[Book_Return]@in_ReaderIDchar(8),@in_ISBNchar(18),@in_BookIDchar(10),@out_strchar(30)OUTPUT
AS
BEGIN
IFNOTEXISTS(SELECT*FROMTReaderWHEREReaderID=@in_ReaderID)
BEGIN
SET@out_str='该读者不存在'
RETURN0
END
IFnotexists(SELECT*FROMTLendWHEREReaderID=@in_ReaderID)
BEGIN
SET@out_str='该读者未借书'
RETURN0
END
IFNOTEXISTS(SELECT*FROMTBookWHEREISBN=@in_ISBN)
BEGIN
SET@out_str='该图书非馆内书籍'
RETURN0
END
BEGINTRAN/*开始一个事务*/
deletefromTLendwhereBookID=@in_BookID
IF@@ERROR>0/*如果前面一条SQL语句出错则回滚事务并返回*/
BEGIN
ROLLBACKTRAN
SET@out_str='删除TLend表中的记录时出错了'
RETURN0
END
IF@@ERROR=0/*如果所有语句都不出错则结束事务并返回*/
BEGIN
COMMITTRAN
SET@out_str='还书成功'
RETURN1
END
ELSE/*如果执行出错则回滚所有操作并返回*/
BEGIN
ROLLBACKTRAN
SET@out_str='删除TLend表中的记录时出错了'
RETURN0
END
END
六、触发器
1、实现功能
当用户“还书”时,要删除借阅表(TLend)中的一条借书记录,读者信息表(TReader)中该读者的借书量减1;图书信息表(TBook)中该图书记录的库存量加1.
2、实现方法
次功能可以通过创建借阅表(TLend)的DELETE触发器实现,触发器名称为:
TLend_delete。
创建触发器代码如下:
USE[MBOOK]
GO
/******Object:
Trigger[dbo].[TLend_delete]******/
/******ScriptDate:
12/13/201116:
44:
51******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATETRIGGER[dbo].[TLend_delete]ON[dbo].[TLend]
AFTERDELETE
AS
BEGIN
UPDATETReaderSETNum=Num-1WHEREReaderID=(SELECTReaderIDFROMdeleted)
UPDATETBookSETSNum=SNum+1WHEREISBN=(SELECTISBNFROMdeleted)
END
连接数据库部分
这一部分用到VisualStudio2008开发环境,利用C#语言构建图书管理系统窗口。
共有七个窗口,分别为:
主窗口、图书查询、借书、还书、读者管理、图书管理、关于。
下面分别介绍各个窗口实现的方法及关键代码。
一、主窗口
“主窗口”是所有子窗口的父窗体,因此主要功能是创建各个子窗体,下面是创建“读者管理”窗口的关键代码,其他窗口代码基本相似。
privatevoid读者管理ToolStripMenuItem_Click(objectsender,EventArgse)
{
Form1form1=newForm1();
form1.MdiParent=this;
form1.Show();
}
“主窗口”截图如下:
二、图书查询
实现功能:
查询图书信息。
可以按照四种方式查询,分别为ISBN、书名、作者、出版社。
点击不同按钮,实现不同的查询方式,并且支持模糊查询,在“图书信息”框中显示图书信息。
图书查询窗口如下所示:
实现代码如下(只贴出关键部分代码):
publicpartialclassForm4:
Form
{
stringstrcon="DataSource=PENGHONGWEI\\SQL2008;InitialCatalog=MBOOK;IntegratedSecurity=True;ConnectTimeout=10;NetworkLibrary=dbnmpntw";
privatevoidForm4_Load(objectsender,EventArgse)
{
//TODO:
这行代码将数据加载到表“mBOOKDataSet3.TBook”中。
您可以根据需要移动或移除它。
this.tBookTableAdapter.Fill(this.mBOOKDataSet3.TBook);
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
SqlConnectionconn=newSqlConnection(strcon);
stringsqlStrSelect="select*fromTBook";
switch(tabControl1.SelectedIndex)
{
case0:
sqlStrSelect="select[ISBN],[BookName],[Author],[Publisher],[Price],[CNum],[SNum]fromTBookwhere[ISBN]='"+textBox1.Text.Trim()+"'";
break;
case1:
sqlStrSelect="select[ISBN],[BookName],[Author],[Publisher],[Price],[CNum],[SNum]fromTBookwhere[Author]like'%"+textBox2.Text.Trim()+"%'";
break;
case2:
sqlStrSelect="select[ISBN],[BookName],[Author],[Publisher],[Price],[CNum],[SNum]fromTBookwhere[BookName]like'%"+textBox3.Text.Trim()+"%'";
break;
case3:
sqlStrSelect="select[ISBN],[BookName],[Author],[Publisher],[Price],[CNum],[SNum]fromTBookwhere[Publisher]like'%"+textBox4.Text.Trim()+"%'";
break;
}
try
{
SqlDataAdapteradapter=newSqlDataAdapter(sqlStrSelect,conn);
DataSetdstable=newDataSet();
adapter.Fill(dstable,"testTable");
dataGridView1.DataSource=dstable.Tables["testTable"];
dataGridView1.Show();
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}
}
三、借书
实现功能:
输入借书证号、ISBN以及要借的图书ID,点击“借书”按钮实现借书功能。
此窗体主要操作数据库的“RBL”视图和调用Book_Borrow存储过程。
点击“查询”按钮时,可以查询当前借书证号的借书记录。
“借书”按钮实现代码如下:
privatevoidbutton2_Click(objectsender,EventArgse)//借书
{
if(textBox1.Text.Trim()==""||textBox2.Text.Trim()==""||textBox3.Text.Trim()=="")
{
MessageBox.Show("借书证号,ISBN,图书ID输入完整!
");
return;
}
SqlConnectionconn=newSqlConnection(strcon);
SqlCommandcmd=newSqlCommand("Book_Borrow",conn);
cmd.CommandType=CommandType.StoredProcedure;
SqlParameterinReaderID=newSqlParameter("@in_ReaderID",SqlDbType.Char,8);
inReaderID.Direction=ParameterDirection.Input;
inReaderID.Value=textBox1.Text.Trim();
cmd.Parameters.Add(inReaderID);
SqlParameterinISBN=newSqlParameter("@in_ISBN",SqlDbType.Char,18);
inISBN.Direction=ParameterDirection.Input;
inISBN.Value=textBox2.Text.Trim();
cmd.Parameters.Add(inISBN);
SqlParameterinBookID=newSqlParameter("@in_BookID",SqlDbType.Char,8);
inBookID.Direction=ParameterDirection.Input;
inBookID.Value=textBox3.Text.Trim();
cmd.Parameters.Add(inBookID);
SqlParameteroutReturn=newSqlParameter("@out_str",SqlDbType.Char,30);
outReturn.Direction=ParameterDirection.Output;
cmd.Parameters.Add(outReturn);
try
{
onn.Open();
cmd.ExecuteNonQuery();
MessageBox.Show(outReturn.Value.ToString());
}
catch
{
MessageBox.Show("借书出错!
");
}
finally
{
conn.Close();
button1_Click(null,null);
}
}
四、还书
实现功能:
与“借书”功能相反,窗口大体相似。
此窗体主要操作数据库的“RBL”视图和调用Book_Return存储过程并激发TLend_delete触发器。
点击“还书”按钮实现还书功能。
窗口如下:
“还书”按钮的单击事件关键代码如下:
privatevoidbutton2_Click(objectsender,EventArgse)//还书
{
if(textBox1.Text.Trim()==""||textBox2.Text.Trim()==""||textBox3.Text.Trim()=="")
{
MessageBox.Show("借书证号,ISBN,图书ID输入完整!
");
return;
}
SqlConnectionconn=newSqlConnection(strcon);
SqlCommandcmd=newSqlCommand("Book_Return",conn);
cmd.CommandType=CommandType.StoredProcedure;
SqlParameterinReaderID=newSqlParameter("@in_ReaderID",SqlDbType.Char,8);
inReaderID.Direction=ParameterDirection.Input;
inReaderID.Value=textBox1.Text.Trim();
cmd.Para