数据库课程设计-图书馆管理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一课题名称
图书馆管理系统
二设计目的和要求、任务
通过本次课程设计,加深对数据库原理以及相关程序设计语言的理解和应用水平。
通过设计实际的数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力。
三需求分析
①、能够存储一定图书信息,并方便有效的进行相应的书籍数据操
作和管理,这主要包括:
1) 图书信息的录入、删除及修改。
2) 图书信息的多关键字检索查询。
3) 图书的出借、返还及超期罚款或丢失赔偿。
②、能够对读者、管理员、采购员进行相应的信息存储与管理,这其中包括:
1) 读者信息的登记、删除及修改。
2)管理员信息的增加、删除及修改。
3)采购员信息的增加、删除及修改。
4) 读者资料的统计与查询。
③、能够提供一定的安全机制,提供数据信息授权访问,防止随意删改、查询。
④、对于借阅即将到期的读者能够及时通过邮箱发送提示信息;对于拖欠罚款的读者给予锁定并通过邮箱提醒;对于长久不还书提及拖欠罚款进行联系。
⑤、对查询、统计的结果能够列表显示。
四总体功能设计
此图书馆系统登录用户分为三类采购员,管理员,读者用户
①采购员用户功能:
②管理员用户功能:
③读者用户功能:
④系统总体功能:
五数据库设计
⑴根据要实现的功能设计,可能建立它们之间的关系,进而实现逻辑结构功能。
图书管理信息系统可以划分的实体有:图书实体、读者实体、管理员实体,采购者实体,借阅实体,图书类型实体 E-R 图如下:
⑵根据E-R得到关系模式,根据实际情况,出版社跟图书类型一般都固定的,单独作为一个实体,用出版社号,跟图书类型号跟图书联系起来;
管理员:管理员号,管理员姓名,管理员密码,管理员电话
采购员:采购者号,采购者姓名,采购者密码,采购者电话
读者:读者姓名,读者密码,读者联系方式,读者借阅数量,读者状态
图书:图书号,图书名,图书状态,作者名,出版社号,图书类型号,价格
出版社:出版社号,出版社名称
图书类型:图书类型号,图书类型名称
借阅:读者号,图书号,借阅日期,还书日期,罚款
⑶各实体表格的数字字典
管理员表Admin
采购员表
读者表reader:
图书表book
图书类别表booktype
出版社表publish
借阅表borrow
(4)创建各个表sql语句
①admin表
CREATE TABLE [dbo].[admin](
[aid] [numeric](18, 0) NOT NULL,
[aname] [nvarchar](50) NOT NULL,
[apwd] [nvarchar](50) NOT NULL,
[atel] [numeric](11, 0) NOT NULL,
CONSTRAINT [PK_admin] PRIMARY KEY CLUSTERED
(
[aid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
②buyer表
CREATE TABLE [dbo].[buyer](
[buyerid] [numeric](18, 0) NOT NULL,
[buyername] [nvarchar](50) NOT NULL,
[buyerpwd] [nvarchar](50) NOT NULL,
[buyertel] [numeric](18, 0) NOT NULL,
CONSTRAINT [PK_buyer] PRIMARY KEY CLUSTERED
(
[buyerid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
③reader表
CREATE TABLE [dbo].[reader](
[rid] [numeric](18, 0) NOT NULL,
[rname] [nvarchar](50) NOT NULL,
[rpwd] [nvarchar](50) NOT NULL,
[re_mail] [nvarchar](50) NOT NULL,
[rnum] [smallint] NOT NULL,
[rstate] [smallint] NOT NULL,
CONSTRAINT [PK_reader] PRIMARY KEY CLUSTERED
(
[rid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
④book表
CREATE TABLE [dbo].[book](
[bid] [numeric](18, 0) NOT NULL,
[bname] [nvarchar](100) NOT NULL,
[bstate] [nvarchar](10) NOT NULL,
[bauthor] [nvarchar](50) NOT NULL,
[bpublishid] [numeric](18, 0) NOT NULL,
[btypeid] [nchar](10) NOT NULL,
[bprice] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_book] PRIMARY KEY CLUSTERED
(
[bid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
⑤booktype表
CREATE TABLE [dbo].[booktype](
[btypeid] [nchar](10) NOT NULL,
[typename] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_booktype] PRIMARY KEY CLUSTERED
(
[btypeid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
⑥publish表
CREATE TABLE [dbo].[publish](
[bpublishid] [numeric](18, 0) NOT NULL,
[publishname] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_publish] PRIMARY KEY CLUSTERED
(
[bpublishid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
⑦borrow表
CREATE TABLE [dbo].[borrow](
[rid] [numeric](18, 0) NOT NULL,
[bid] [numeric](18, 0) NOT NULL,
[start_date] [date] NOT NULL,
[end_date] [date] NOT NULL,
[payment] [nvarchar](100) NULL,
PRIMARY KEY CLUSTERED
(
[rid] ASC,
[bid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
(5)创建表关系
六应用程序设计
⑴对于不同的用户登录系统所看到的页面不同,拥有的权限不相同,正如上面功能图所示:对于读者而言主要有检索图书,借阅图书,归还图书,违章缴费得功能;对于管理员是系统中权限最高的用户,
如对用户的增加,删改,编辑,对读者违章缴费的进行收取费用;在设计次系统中,管理员将增删图书的功能下架给采购员,采购员分担管理员一下事物。
⑵正如前面所说,系统分成不同的用户,设计出3个表,在实际操作中发现其实用户在一张表里面更容易设计,增加一个用户类型属性就可以。
但这是后话,所以在设计系统的时候代码冗余较多,为了实现不同的用户不同的功能,每类用户对应不同的页面,以此达到控制权限。
⑶由于系统并完成定时的功能,所以在判断读者未及时归还书籍,将用户锁定,以及所欠的费用,通过触发借书事件之前,调用成员函数来判断。
七调试运行情况
(1)登录:对各种用户出现不同的菜单项
①管理员登录
②采购员登录
③读者登录
protected void sure_Click(object sender, EventArgs e)
{
string yzm = this.yzm.Text.ToString().Trim();//首先进行验证码判断
if (yzm.ToUpper() != Session["CheckCode"].ToString().Trim())
{
Page.ClientScript.RegisterStartupScript(Page.GetType(),
DateTime.Now.Ticks.ToString(), "<Script Language='Javascript'>alert('系统提示:\\r\\n\\r\\n'+'验证码错误!');</Script>");
this.yzm.Text = "";
}
else//验证码正确之后进行用户名跟密码判断
{
SqlConnection con = sqlcon.getConnection();
con.Open();
if (type.SelectedValue == "1")//对读者进行验证
{
string s = "select * from reader where rid='"+userid.Text.ToString()+"' and rpwd='"+userpwd.Text.ToString()+"'";//传值实现sql语句
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
sda.Fill(dt);
sda.Dispose();
con.Dispose();
con.Close();
if (dt.Rows.Count> 0)//存在读者
{
Session["id"] = dt.Rows[0][0].ToString();//保留读者信息
Session["type"] = "left3.html";//菜单为读者菜单
Response.Redirect("main.aspx");//跳到主页面
}
else
{
Response.Write("<Script type='text/javascript'>alert('系统提示:'用户名或密码错误!')</Script>");
userid.Text = "";
userpwd.Text = "";
this.yzm.Text = "";
}
dt.Dispose();
}
else if (type.SelectedValue == "2")//对管理员进行验证
{
string s = "select * from admin where aid='" + userid.Text.ToString() + "' and apwd='" + userpwd.Text.ToString() + "'";//传值实现sql语句
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
sda.Fill(dt);
sda.Dispose();
con.Dispose();
con.Close();
if (dt.Rows.Count > 0)//存在管理员
{
Session["id"] = dt.Rows[0][0].ToString();//保留管理员信息
Session["type"] = "left.html";//菜单为管理员菜单
Response.Redirect("main.aspx");//跳到主页面
}
else
{
Response.Write("<Script type='text/javascript'>alert('系统提示:'用户名或密码错误!')</Script>");
userid.Text = "";
userpwd.Text = "";
this.yzm.Text = "";
}
}
else if (type.SelectedValue == "3")//对采购者进行验证
{
string s = "select * from buyer where buyerid='" + userid.Text.ToString() + "' and buyerpwd='" + userpwd.Text.ToString() + "'";//传值实现sql语句
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
sda.Fill(dt);
sda.Dispose();
con.Dispose();
con.Close();
if (dt.Rows.Count > 0)//存在采购者
{
Session["id"] = dt.Rows[0][0].ToString();//保留采购者信息
Session["type"] = "left2.html";//菜单为采购者菜单
Response.Redirect("main.aspx");//跳到主页面
}
else
{
Response.Write("<Script type='text/javascript'>alert('系统提示:'用户名或密码错误!')</Script>");
userid.Text = "";
userpwd.Text = "";
this.yzm.Text = "";
}
}
con.Close();
con.Dispose();
}
}
⑵读者
protected void name()
{
string table = "";
string id = "";//获取当前用户类型
if (Session["type"].ToString() == "left.html")
{
table = "admin";
id = "aid";
}
else if (Session["type"].ToString() == "left2.html")
{
table = "buyer";
id = "buyerid";
}
else if (Session["type"].ToString() == "left3.html")
{
table = "reader";
id = "rid";
}
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand("select * from " + table + " where " + id + "=" + Session["id"].ToString() + " ", con);//从读者表中读取信息
DataTable dt = new DataTable();//一次显示信息
sda.Fill(dt);
TxtRid.Text = dt.Rows[0][0].ToString();
TxtRname.Text = dt.Rows[0][1].ToString();
TxtRpwd.Text = dt.Rows[0][2].ToString();
TxtRe_mail.Text = dt.Rows[0][3].ToString();
sda.Dispose();
con.Close();
con.Dispose();
}
protected void sure_Click(object sender, EventArgs e)
{
if (TxtRpwd.Text.ToString() == dt.Rows[0][2].ToString())//至此之前,页面加载的时候,先读取用户信息,保留在表里面,之后判段原先密码是否正确
{
string table = "";//获取用户类别
//string name = "";
string pwd = "";
string id = "";
if (Session["type"].ToString() == "left.html")
{
table = "admin";
// name = "aname";
id = "aid";
pwd = "apwd";
}
else if (Session["type"].ToString() == "left2.html")
{
table = "buyer";
// name = "buyername";
id = "buyerid";
pwd = "buyerpwd";
}
else if (Session["type"].ToString() == "left3.html")
{
table = "reader";
//name = "rname";
id = "rid";
pwd = "rpwd";
}
string s = "update " + table + " set " + pwd + "='" + TxtRe_mail.Text.ToString() + "' where " + id + "='" + dt.Rows[0][0].ToString()+"'";//更用户密码
SqlConnection con=sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
if (cmd.ExecuteNonQuery() > 0)
{
Response.Write("<script type='text/javascript'>alert('修改成功!')</script>");
}
TxtRpwd.Text = "";
TxtRe_mail.Text = "";
TextBox1.Text = "";
con.Close();
con.Dispose();
}
else
{
TxtRpwd.Text = "";
TxtRe_mail.Text = "";
TextBox1.Text = "";
Response.Write("<script type='text/javascript'>alert('原密码不正确!')</script>");
}
}
private void showbook()//按条件检索图书
{
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = "select * from bookview where [" + select.SelectedValue + "]='" + simple.Text.ToString() + "'";//在数据库建立试图将book表,booktype表,publish表联系起来,则查出来如图所示效果
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
sda.Fill(dt);//将查询结果存储到table里面
if (dt.Rows.Count > 0)//存在图书
{
GridView1.DataSource = dt;//绑定显示
GridView1.DataBind();
}
else
{
Response.Write("<script type='text/javascript'>alert('无图书记录!')</script>");
}
con.Close();
con.Dispose();
}
多字段检索(条件不一定要全部输入)
private string judge()//对字段判断,返回执行条件
{
string s="";
if (txtid.Text.Trim() != "")
{
s =" bid = '"+txtid.Text.Trim()+"'";
}
if (txtname.Text.Trim() != "")
{
if (s.Trim() == "")
{
s += "bname ='" + txtname.Text.Trim() + "'";
}
else
{
s += " and bname ='" + txtname.Text.Trim() + "'";
}
}
if (txtauthor.Text.Trim() != "")
{
if (s.Trim() == "")
{
s += " bauthor='" + txtauthor.Text.Trim() + "'";
}
else
{
s += " and bauthor='" + txtauthor.Text.Trim() + "'";
}
}
if (txtpublish.Text.Trim() != "")
{
if (s.Trim()=="")
{
s += " publishname='" + txtpublish.Text.Trim() + "'";
}
else
{
s += " and publishname='" + txtpublish.Text.Trim() + "'";
}
}
if (txttype.Text.Trim() != "")
{
if (s.Trim() == "")
{
s += " typename='" + txttype.Text.Trim() + "'";
}
else
{
s += " and typename='" + txttype.Text.Trim() + "'";
}
}
return s;
}
通过此函数来返回sql语句的执行条件
private void showbook()
{
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = judge();//获取条件
if (s.Trim() == "")
{
Response.Write("<script type='text/javascript'>alert('请输入检索')</script>");
return;
}
s = "select * from bookview where " + s;//执行sql,获取符合条件的图书
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
sda.Fill(dt);
if (dt.Rows.Count <=0)
{
Response.Write("<script type='text/javascript'>alert('无图书记录')</script>");
return;
}
GridView1.DataSource = dt;//存在图书,绑定显示
GridView1.DataBind();
con.Close();
con.Dispose();
}
图书借阅:
读者借阅图书,首先要判断用户是否有欠费的图书,若有将读者状态锁定;若无则可借书。
public static void borrow(string id, string id2)//借阅自动添加借书日期以及还书日期{
DateTime t = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")); //当日为借阅时间
DateTime t2 = DateTime.Parse(DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).AddMonths(1).ToShort DateString());//归还日期为借阅日期加一个月
string s = "insert into borrow values('" + id + "','" + id2 + "','" + t + "','" + t2 + "','0')";//增加借阅记录
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
s = "update reader set rnum=rnum+1 where rid='"+id+"'";
cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Close();
}
public static void fi(string id)//超出还书日期,欠费
{
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = "select bid,end_date from borrowbook where rid='" + id + "'";
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
DataTable dt = new DataTable();
sda.Fill(dt);
sda.Dispose();
if (dt.Rows.Count == 0)
{
return;
}
for (int i = 0; i < dt.Rows.Count; i++)
{
DateTime t = DateTime.Parse(dt.Rows[i][1].ToString());
if (t<DateTime.Now)//还书日期小于当前日期
{
TimeSpan m =DateTime.Parse( DateTime.Now.ToString("yyyy-MM-dd")) - t;//每超过一天,欠费就自动增加一元
string x = "update borrowbook set payment='"+m.Days.ToString()+"' where rid ='" + id + "' and bid='" + dt.Rows[i][0].ToString() + "'";//更新费用到borrow表
SqlCommand cmd = new SqlCommand(x, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
x = "update borrowbook set rstate=1 where rid ='" + id + "' and bid='" + dt.Rows[i][0].ToString() + "'";//锁定读者
cmd = new SqlCommand(x, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
cmd.Dispose();
}
}
}
public static bool state(string id)//判断读者状态
{
string s = "select rstate from reader where rid='" + id + "'";
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s,con);
//SqlDataReader ds = cmd.ExecuteReader();
int i = int.Parse(cmd.ExecuteScalar().ToString().Trim());//读取读者状态
cmd.Dispose();
con.Dispose();
if (i == 0)
{
return true;//未锁定
}
else
{
return false;//锁定
}
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) {//点击借阅按钮
int j = e.RowIndex;
string id = GridView1.Rows[j].Cells[0].Text.ToString();
string state = GridView1.Rows[j].Cells[2].Text.ToString();
if (state == "未借")
{
bo.fi(Session["id"].ToString());//先判断读者是否欠费,锁定
if (bo.state(Session["id"].ToString()))//若读者未锁定
{
bo.borrow(Session["id"].ToString(), id);//增加借阅记录
borrowsuccess(id);
}
else
{
Response.Write("<script type='text/javascript'>window.alert('您已经欠费,被锁定!')</script>");
}
}
else
{
Response.Write("<script type='text/javascript'>window.alert('图书已被借!')</script>");
}
}
先读取用户的借阅情况,代码与上面类似;
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) {//续借功能
int i = e.RowIndex;
string id = GridView1.Rows[i].Cells[0].Text.ToString();//图书号
DateTime end_date =DateTime.Parse(DateTime.Parse(DateTime.Parse(GridView1.Rows[i].Cells[3].Text.ToString()).ToS tring("yyyy-MM-dd")).AddMonths(1).ToShortDateString());//还书日期增加一个月
string s = "update returnbook set end_date='"+end_date+"' where bid='"+id+"'";
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
if (cmd.ExecuteNonQuery() > 0)
{
Response.Write("<script type='text/javascript'>alert('续借成功!')</script>");
biand();
}
con.Close();
con.Dispose();
}
页面加载调用bo类的fi(string id)函数,并更新欠费(没过一天欠费自动加1元)protected void Page_Load(object sender, EventArgs e)
{
bo.fi(Session["id"].ToString());
if (!IsPostBack)
{
DataTable dt = new DataTable();
dt = bo.paymoney(Session["id"].ToString());
if (dt.Rows.Count == 0)
{
Response.Write("<script type='text/javascript'>alert('无违章罚款记录!')</script>");
return;
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
⑶管理员:(采购员专门负责图书管理)
与用户信息类似。
点击编辑跳转到编辑读者页面。
编辑页面与用户信息代码类似。
private void Tbooktype()//先绑定图书类型,用于选择图书类型。
{
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = "select * from booktype";
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
DataTable dt = new DataTable();
sda.Fill(dt);
con.Close();
con.Dispose();
Txtbtpyeid.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
Txtbtpyeid.Items.Add(new ListItem(dt.Rows[i][1].ToString(), dt.Rows[i][0].ToString()));
}
sda.Dispose();
con.Close();
}
private void Tpublish()//绑定出版社,用于选择图书出版社
{
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = "select * from publish";
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
DataTable dt = new DataTable();
sda.Fill(dt);
con.Close();
con.Dispose();
Txtbpublishid.Items.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
Txtbpublishid.Items.Add(new ListItem(dt.Rows[i][1].ToString(),
dt.Rows[i][0].ToString()));
}
sda.Dispose();
con.Close();
}
protected void Button1_Click(object sender, EventArgs e)//更新图书表
{
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = "insert into book values('" + Txtbid.Text.ToString() + "','" + Txtbname.Text.ToString() + "','" + Txtbstate.Text.ToString() + "','" + Txtbauthor.Text.ToString() + "','" + Txtbpublishid.Text.ToString() + "','" + Txtbtpyeid.Text.ToString() + "','" + Txtbprice.Text.ToString() + "')";//添加新的图书信息
SqlCommand cmd = new SqlCommand(s, con);
int i = cmd.ExecuteNonQuery();
cmd.Dispose();
con.Close();
if (i > 0)
{
Txtbid.Text = " ";
Txtbname.Text = " ";
Txtbstate.Text = " ";
Txtbauthor.Text = " ";
Txtbprice.Text=" ";
Response.Write("<script type='text/javascript'>window.alert('添加成功!')</script>");
}
}
点击删除:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) {
int j= e.RowIndex;
string id = GridView1.Rows[j].Cells[0].Text.ToString();//获取图书号
string sqlStr = "delete from book where bid='" + Convert.ToInt32(id) + "'";//执行删除操作
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(sqlStr, con);
int i = cmd.ExecuteNonQuery();
con.Dispose();
con.Close();
if (i > 0)
{
Response.Write("<script type='text/javascript'>window.alert('删除成功!')</script>");
}
bind();
}
点击还书:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) {
int i = e.RowIndex;
string bid = GridView1.Rows[i].Cells[0].Text.ToString();//图书号
string s = "delete borrow where rid='" + rid.Text.ToString() + "' and bid='" + bid + "' ";//删除读者的借阅记录
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
if (cmd.ExecuteNonQuery() > 0)
{
Response.Write("<script type='text/javascript'>alert('归还成功!')</script>");
}
cmd.Dispose();
s = "update reader set rnum=rnum-1 where rid='"+rid.Text.ToString()+"'";
cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Dispose();
con.Close();
getreturn();
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) {
int i = e.RowIndex;
string bid = GridView1.Rows[i].Cells[0].Text.ToString();//图书号
string s = "delete borrow where rid='" + rid.Text.ToString() + "' and bid='" + bid + "' ";//缴费
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
if (cmd.ExecuteNonQuery() > 0)
{
Response.Write("<script type='text/javascript'>alert('缴费成功!')</script>");
}
cmd.Dispose();
s = "update book set bstate='未借' where bid='"+bid+"'";//更新图书状态为未借
cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
s = "update reader set rnum=rnum-1 where rid='" + rid.Text.ToString() + "'";//读者所借数目减1
cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Dispose();
con.Close();
getpay();
}
private void getpay()
{
bo.fi(rid.Text.ToString());//更新读者所欠费用
SqlConnection con = sqlcon.getConnection();
con.Open();
string s = "select * from returnbook where rid='" + rid.Text.ToString() + "' and payment>'0'";
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = new SqlCommand(s, con);
sda.Fill(dt);
Label1.Text = Convert.ToString(dt.Rows.Count);//初始读者所借图书超过归还日期的书的个数
if (dt.Rows.Count == 0)
{
Response.Write("<script type='text/javascript'>alert('无罚款记录!')</script>");
}
GridView1.DataSource = dt;
GridView1.DataBind();
sda.Dispose();
con.Dispose();
con.Close();
statenone();
}
protected void statenone()//判断读者欠费是否全部缴费
{
int i = int.Parse(Label1.Text.ToString());
if (i == 0)//全部缴费
{
string s = "update reader set rstate=0 where rid='" + rid.Text.ToString() + "'";//读者解锁
SqlConnection con = sqlcon.getConnection();
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Dispose();
con.Close();
}
}
八心得体会
1.这次课程设计熟悉了数据库系统设计的整体步骤。
其中需求分析阶段,是基础;必须对所要设计的系统有总体的构思和了解,与实际情况对应,作必要的更改。
2.这次课程设计加深了我对数据库系统概论相关知识和SQL SERVER相关功能的理解。
3.在设计表结构时候,一般情况下,在建表的时候,就设置好表的约束关系。
但在实际编写系统的时候,对表的增加,删除,受表的约束关系,而不能正常调试程序。
在解决此问题时,用视图实现表连接查询,控制表之间关系。
但是在更新操作不能够一次性对视图进行多次更新,需要分步执行更新视图。
4.更多的时候,表的约束关系,是通过前台的代码实现。
在实现系统的时候,更要注重逻辑上的推敲,以免有bug。
5.对于一个系统,用户体验最重要,即使后台代码写的再好,直接更用户打交道的还是前台的界面,所以在做好后台的维护与管理的同时,加强对界面的美化。
九参考文献
[1]王珊《数据库系统概论》[M].高等教育出版社2012.5
[2]邵良彬《 3.5(C#)》[M].清华大学出版社 2011.2。