数据库实验 图书管理系统(使用SQLsever,附C#窗体程序源码)

本文介绍了一个基于SQL Server和C#的图书管理系统的设计与实现,包括登录注册、图书及借阅信息管理等功能,通过详细数据库设计和窗体程序实现,支持不同用户角色权限管理。
写一个可以登录注册包括管理员身份、读者身份在内的,可以管理(增删改查)图书、借阅信息,可以借书还书的图书管理系统

使用数据库:SQL sever
使用语言:C#
使用IDE:Visual Studio 2019

初步想法:
在这里插入图片描述
话不多说,第一步:建立数据库:

为此我们需要考虑关于建立哪些表的问题,首先我们肯定需要一个读者表和一个图书表,才外,我们还需要一个借阅信息表,来作为中介以便借书还书等活动,之后,还需要一个用户表,用来存放注册人信息。
//////////////////////首先画出数据库的BR图///////////////////////
在这里插入图片描述
说明:方框代表数据库的一个表,椭圆代表一个属性,菱形方框代表表之间的关系。

理论的数据库物理模型:
在这里插入图片描述
说明:"pk"为主键、“fk”为外键,表中的所有Bigint都应设置为自增模式

表 名功 能 说 明
Books存放图书信息
Readers存放读者信息
BR存放借书信息
LogInfo存放用户信息

具体SQL语句:

use master
--创建数据库Library
if(exists(select * from master.dbo.sysdatabases where name = 'Library'))
begin
print '已存在数据库Library,删除重建中。。。'

drop database Library
end
go
create database Library
go
use Library
go

--创建各个表
create table LogInfo
(
	tno bigint identity(1,1) primary key,--设置自增
	username char(20),
	passwd char(30),
	Logid char(6),
	check (Logid='admin' OR Logid='reader')
)
alter table LogInfo add constraint uniuserName unique(username)

create table Books
(
	
	ISBNum char(10) primary key,
	bname char(20) not null,
	bpress char(20),
	bwriter char(10),
	bnumAll int,
	bnumAvailable int,
	bifAvailable char(5),
	check(bnumAll>=0 AND bnumAvailable >=0)
	
)
alter table Books add
constraint de_Books_Ifavailable default '可借' for bifAvailable

create table Readers
(
	rid char(20) primary key,
	rname char(20) not null,
	rsex char(2),
	rjob char(10),
	ravailable int,
	ralready int,
	rworkplace char(20),
	rtel char(11),
	check (rsex = '男'OR rsex ='女' )
)
alter table Readers add
constraint de_Readers_rsex default '男' for rsex

create table BR
(
	BRno bigint identity(1,1) primary key,
	ISBNum char(10),
	rid char(20),
	CheckOutDate date,
	DeadLine date,
	ReturnDate date,
	fine money,
	constraint FK_BR_BOOKS foreign key(ISBNum)
	references Books(ISBNum)
	on update cascade
	on delete cascade,
	constraint FK_BR_READERS foreign key(rid)
	references Readers(rid)
	on update cascade
	on delete cascade,
	check (fine>=0)
)
alter table BR add
constraint de_BR_fine default 0 for fine

其中还加入了各种约束,请自行查看上面的代码
接下来为数据库添加角色,这一步可以方便之后的根据不同注册信息赋予不同权限的操作。
角色说明:

  • Lbry_admin:Library的管理员
  • Lbry_reader:Library的读者

分别赋予以下权限:

grant all on Books to Lbry_admin with grant option
grant all on BR to Lbry_admin with grant option
grant all on LogInfo to Lbry_admin with grant option
grant all on Readers to Lbry_admin with grant option

grant select,update on Books to Lbry_reader
grant select,update on Readers to Lbry_reader
grant select,update,insert,delete on BR to Lbry_reader
grant select,insert,update,delete on LogInfo to Lbry_reader

为了验证数据库创建是否成功,我设置了默认添加的用户和数据,默认添加的用户是:“tutu”和“ding”,默认的图书为:“tuBook”和“DingBook”,默认他们俩各借了一本书:

use master
if(exists(select * from master.dbo.syslogins where name = 'tutu'))
begin
exec sp_droplogin 'tutu'
exec sp_dropuser 'tutu'
end

if(exists(select * from master.dbo.syslogins where name = 'ding'))
begin
exec sp_droplogin 'ding'
exec sp_dropuser 'ding'
end

exec sp_addlogin 'tutu','123456','Library'
exec sp_adduser 'tutu','tutu'
EXEC master.dbo.sp_addsrvrolemember @loginame = N'tutu',   @rolename = N'sysadmin'
exec sp_addrolemember 'Lbry_admin','tutu'




exec sp_addlogin 'ding','654321','Library'
exec sp_adduser 'ding','ding'
EXEC master.dbo.sp_addsrvrolemember @loginame = N'ding',   @rolename = N'sysadmin'
exec sp_addrolemember 'Lbry_admin','ding'





print '数据库初始化完成,进行select * from LogInfo 查看初始化用户信息'

use Library

insert into Books values ('1234567890','tubook','tupress','tutu',100,20,'是')
insert into Books values ('0987654321','DIngbook','dingpress','ding',100,20,'是')
insert into Readers values ('22920172204175','tutu','男','学生',5,20,'学校','18120757777')
insert into Readers values ('2292017220235','ding','男','学生',5,20,'学校','13220721177')
insert into BR(ISBNum,rid,CheckOutDate,DeadLine,ReturnDate,fine) values ('1234567890','22920172204175','2020-01-01','2020-06-04','','0.00')
insert into BR(ISBNum,rid,CheckOutDate,DeadLine,ReturnDate,fine) values ('0987654321','2292017220235','2020-01-02','2020-06-05','','0.00')

select * from Books
select * from Readers
select * from BR

insert into LogInfo(username,passwd,Logid)
values('tutu','123456','admin')
insert into LogInfo(username,passwd,Logid)
values('ding','654321','admin')
select * from LogInfo

接下来,还需要完善数据库。如何完善?就是 给数据库添加方便我们使用的存储过程和函数程序:
这里我分别添加了如下内容:

  • OverDueInfo:逾期未还的图书和读者信息
  • OverDueBooks:逾期未还的借阅信息
  • ifAvailable:根据图书数量改变图书可借状态的触发器
  • deleteReader:删除读者时同时删除相应用户信息的触发器
if exists(select * from sys.procedures where name='OverDueInfo') -- 逾期未还的图书和读者信息
drop procedure dbo.OverDueInfo
go
create procedure OverDueInfo
	@Rid char(20)
as
begin
	
	begin
		select ISBNum as 'ISBN书号',bname as '书名',rname as '读者姓名' from Books,Readers
			where exists(select * from BR where  DeadLine <=  DATENAME(YEAR,GETDATE())+'/'+DATENAME(MONTH,GETDATE())+'/'+DATENAME(DAY,GETDATE()) and BR.ISBNum = Books.ISBNum and BR.rid = @Rid and Readers.rid = @Rid)
	end
end


if exists(select * from sys.procedures where name='OverDueBooks')-- 逾期未还的借阅信息
drop procedure dbo.OverDueBooks
go
create procedure OverDueBooks
	@Rid char(20)
as
begin
	
	begin
		select *
		from BR
		where  
			DeadLine <=  DATENAME(YEAR,GETDATE())+'/'
			+DATENAME(MONTH,GETDATE())+'/'+DATENAME(DAY,GETDATE()) 
			and ReturnDate = '1900/1/1'
			and BR.rid = @Rid
	end
end


if(OBJECT_ID('ifAvilable') is not null) -- 关于图书是否可借的触发器
drop trigger ifAvilable       
go
create trigger ifAvilable
on Books for update as
declare @numAvailable int = 1
declare @ISBNum char(10)
	select @numAvailable = bnumAvailable,@ISBNum = ISBNum from inserted 
	if(@numAvailable > 0)
		update Books set bifAvailable = '是'  where ISBNum = @ISBNum
	else
		update Books set bifAvailable = '否' where ISBNum = @ISBNum
		
		
go
if(OBJECT_ID('deleteReader') is not null)   -- 删除读者信息时也删除相关用户信息的触发器  
drop trigger deleteReader       
go
create trigger deleteReader
on Readers for delete as
declare @Rname char(20)
	select @Rname = rname from deleted 
	delete from LogInfo where username = @Rname

第二步:编写窗体程序
由于本部分代码太多,只展示效果,源码在文末下载查看
在visual studio中建立新的Windows窗体程序:
在这里插入图片描述
如果没有请在工具栏中下载这个工具:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我写的程序的总类表:
在这里插入图片描述

接下来使用C#自带的工具绘制出类似下图的结构,并对每一个组件命名,记住这些名字,方便自己之后调用。
在这里插入图片描述
用户登录/注册模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
 功能
进行用户的登录、注册。
 模块流程
输入正确的账户密码登录或者进行注册,对于管理员的注册,还可以进行管理员的身份验证。默认的校验码是123456 。
当用户选择不同的身份时,会自动跳出不同的信息填写界面,如果是管理员会跳出校验码填写界面。如果是读者,会跳出详细的读者信息填写。

 输入输出项
输入:用户的账户密码
输出:用户的身份以及权限,根据这个进行界面切换。
 重点类描述
Signin:进行注册校验,同时需要向数据库新增这样的用户以及赋予其相关的权限。

 重点算法
这里要注册就要先登录数据库,默认的初始登录账户已经在sql文件中创建,为“tutu;123456”
其中,赋予权限的部分比较重要,使用的SQL语句是:

signinTran = String.Format(@"set xact_abort on 
exec sp_addlogin '{0}', '{1}','Library' 
exec sp_adduser '{2}','{3}' 
exec sp_addrolemember '{4}','{5}' 
insert into LogInfo(username,passwd,Logid) values('{6}','{7}','{8}')  ",
                                                 username,password,username,username,role,username,username,password,id_box.Text );

 限制条件
管理员需要输入校验码。

7.2. 读者信息管理模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 功能
实现读者信息的管理,包括修改新增删除操作。
其中新增键参考的数据是上面这一排所输入的数据。
在没有选择数据的时候,或者DataGridBox中没有数据的时候,删除键和修改键是无效的,可以进行新增信息。点击修改,会弹出新的窗体专门进行修改。
其中:
刷新:刷新当前查询的结果,一般由于程序不是循环刷新的,所以显示出来的信息可能会存在一些错误或者缺失,点击刷新可以查看最新的信息
复位:将上面这些文本框中的数据恢复成默认数据。
查看该读者未还书籍信息:查看当前选择的读者有哪些未还信息。

 模块流程
输入:根据文本框的数据形成的SQL语句
输出:查询或者修改的结果,操作都会有提示。
 重点算法
关于如何实现查看未还书籍信息:
数据库内已经编写了一个程序procedure 即之前说的OverDueBooks

只需要在程序内进行调用即可。
7.3. 图书信息管理模块
在这里插入图片描述
在这里插入图片描述
 功能
总体功能与读者管理模块类似

7.4. 借阅信息管理模块
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总体功能的使用与之前的图书管理和读者管理类似。
注意其中的日期相关选择框中是一个日期组件,可以图形化选择日期,不用手动输入。
修改时,是否逾期结果自动生成,并根据超时日期计算罚款金额

7.5. 读者查询图书信息模块
在这里插入图片描述

在这里插入图片描述

 功能
实现读者对于所有书籍信息的查询和借阅。
在点击借阅之后,读者的可借数量会自动减一,读者的已借数量会自动加一。该图书的可借数量会自动减一。
而图书是否可借的信息,有数据库内的trigger进行约束,若可借数量小于1则自动更改可借状态为否。
 模块流程
点击查询,找到要借的书籍,点击借书即可。
 输入输出项
输入:查询语句、借书请求
输出:查询结果、借书结果
 限制条件
只能给自己借书

7.6. 读者查看读者信息模块

 功能
可以查询所有读者信息,并且可以修改自己的信息,但是仅限于修改工作职称、性别、工作地点、电话,其他的信息可以显示但是不可以修改。
 模块流程
点击查询,显示读者信息仅可供查看,点击修改我信息可以进入修改本人信息界面。
 输入输出项
输入:SQL查询语句
输出:查询结果,是否修改自己的信息成功
 限制条件
只能修改自己的信息。

7.7. 读者查阅借阅信息模块
在这里插入图片描述
在这里插入图片描述
 功能
查询自己所有的借阅信息
查询自己已经到期的图书
还书
 模块流程
点击查询,可以查看自己已借的所有书籍记录
点击到期图书,可以查看自己到期的图书。
点击还书可以进行还书,会自动根据还书日期进行罚款和个人书本数量增减、总图数增减。
 重点算法
关于查询到期图书的SQL语句:

string OverDueSQL = String.Format(@"select * from BR where  DeadLine <=  DATENAME(YEAR,GETDATE())+'/'+DATENAME(MONTH,GETDATE())+'/'+DATENAME(DAY,GETDATE()) and ReturnDate = '1900/1/1' and BR.rid ='{0}'", publicVar.currentRid.Trim());

 限制条件
只能操作自己的信息。

使用手册

  1. 确认自己打开了本地的SQL服务:

在这里插入图片描述
在这里插入图片描述
2. 在本地数据库运行初始化数据库的SQL文件(源码文件中有)

最后应该可以在结果中看到初始化的数据库表,说明初始化成功。
在这里插入图片描述
3. 注册管理员时,你需要输入正确的管理员校验码,否则无效(默认为123456):
在这里插入图片描述
4. 注册读者时,必须要填写读书卡号和性别,否则不成功:
在这里插入图片描述
5. 注册的读书卡号不能与其他人重复:
在这里插入图片描述
6. 管理员进行插入数据时,不可以插入主键为空的数据:
在这里插入图片描述
7. 读者点击到期图书可以查看自己到期以及即将到期的的图书,点击还书可以查看自己还书的结果(超时一天罚款0.2元):
在这里插入图片描述
在这里插入图片描述
8. 不能归还已经归还的书籍:
在这里插入图片描述
9. 点击缴纳罚款即可缴纳所有罚款,点击到期图书可以查看自己已经到期的图书信息:
在这里插入图片描述
10. 罚款的金额是每超一天罚款0.2元
11. 读者借书时,如果书本可借数量为0 ,则会提示:

在这里插入图片描述
在这里插入图片描述
12. 说明:所有的日期变量默认设置为1900-01-01.
13. 所有的修改操作都会提示修改的内容。
14. 本数据库初始的表数据:
在这里插入图片描述

源码下载:
说明:本代码仅供交流使用,请勿用作自己的实验代码,否则因为抄袭本代码而导致的一切后果,概不负责。
源码下载点击此处

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值