版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库课程设计报告专 业 班 级 计科11002 学 生 姓 名 学 生 学 号 指 导 教 师 时 间 2013.1.82013.1.18 目录一、 课程设计题目1二、 系统需求11.数据需求1读者类型表1读者信息表1图书信息表2借阅信息表22. 功能需求3三、 系统设计31. 各实体间联系的e-r图32. 总体流程图设计43. 建数据库44. 体系结构6四、 系统实现71. 数据库操作公共类72. 业务实体类103. 数据访问层114. 业务逻辑层13五、 系统运行效果、功能151. 登陆界面152. 读者管理界面16添加读者信息16修改读者信息16删除读者信息16查找读者信息163. 图
2、书管理界面174.借还书操作界面17登记借阅者18查找图书18借书18还书184. 非管理员登陆界面18六、 遇到的问题及解决方法191. 三层架构问题192.读者信息修改时传值问题193.删除读者信息时单击表头选中问题194. 借书顺序号问题20七、 心得体会20八、指导教师评语211、 课程设计题目图书管理信息系统2、 系统需求1.数据需求读者类型表序号字段名数据类型说明1rdtypesmallint读者类别【主键】2rdtypenamenvarchar(20)读者类别名称【非空、唯一】3canlendqtyint可借书数量4canlenddayint可借书天数5cancontinueti
3、mesint可续借的次数6punishratefloat罚款率(分/天/本)7datevalidsmallint证书有效时间(年数)【非空,0表示永久有效】读者信息表序号字段名数据类型说明1rdidint读者序号【主键】2rdnamenvarchar(20)读者姓名3rdpwdnvarchar (20)读者密码,初值为“123”4rdsexnchar(1)性别,-男/女5rdtypesmallint读者类别【外键tb_readertype.rdtype,非空】6rddeptnvarchar (20)单位代码/单位名称7rdphonenvarchar(25)电话号码8rdemailnvarcha
4、r(25)电子邮件9rddateregdatetime读者登记日期/办证日期10rdborrowqtyint已借书数量(缺省值0)图书信息表序号字段名数据类型说明1bkidint图书序号或条码号【主键】2bkcodenvarchar (20)图书编号(如:tp316-21-123)3bknamenvarchar(50)书名4bkauthornvarchar(30)作者5bkpressnvarchar(50)出版社6bkdatepressdatetime出版日期7bkisbnnvarchar (15)书号8bkcatalognvarchar(30)分类名9bklanguagesmallint语言
5、,0-中文,1-英文,2-日文,3-俄文,4-德文,5-法文10bkpagesint页数11bkpricemoney价格12bkdateindatetime入馆日期13bkbrieftext内容简介14bkcoverimage图书封面照片15bkisinlabnchar(1)或bit是否在馆(借出)借阅信息表序号字段名数据类型说明1borrowidnumeric(12,0)借书顺序号【主键】2rdidint读者序号【外键tb_reader.rdid】3bkidint图书序号【外键tb_book.bkid】4ldcontinuetimesint续借次数(第一次借时,记为1)5lddateoutd
6、atetime借书日期6lddateretplandatetime应还日期7lddateretactdatetime实际还书日期8ldoverdayint超期天数9ldovermoneymoney超期金额10ldpunishmoneymoney罚款金额11lshasreturnbit是否已经还书,缺省为0-未还12operatorlendnvarchar(20)借书操作员13operatorretnvarchar(20)还书操作员2. 功能需求读者管理员:读者管理员可以添加读者信息,可以按指定的组合条件查询读者,查询结果可以显示还可以删除(注销)读者和修改部分字段的内容。图书管理员:图书入库(
7、添加图书信息):图书管理员可以将新书添加到数据库中(注销图书信息):图书删除。图书信息查询:所有用户可以按指定的组合条件查询图书查询结果可以显示对于图书管理员,可以删除图书和修改部分字段的内容。借书还书操作:读者管理员可以给读者借书、续借和还书。还书时如果图书超期,提示超期的天数,并计算罚款,记录归还相关信息。读者管理员还可按读者信息查询指定期间内的历史借阅信息和当前未还信息,按图书信息查询指定期间内的历史借阅信息和当前借阅读者信息。查询结果可以显示3、 系统设计1. 各实体间联系的e-r图由于空间有限,只取其中部分属性画成e-r图出版社图书编号出版日期读者姓名所 在 系1n超期天数续借次数还
8、 期借 期借 还年 龄 读者编号性 别作 者图书名称读者信息图 书2. 总体流程图设计3. 建数据库脚本代码如下:-创建数据库create database bookmanagegouse bookmanagego-创建读者类别表create table readertype(rdtype smallint not null primary key, -读者类别rdtypename varchar(18), -读者类别名称canlendqty int, -可借书数量canlendday int, -可借书天数cancontinuetimes int, -可续借的次数punishrate flo
9、at, -罚款率datevalid smallint default 0 -0表示证件一直有效)-插入测试数据insert into readertype values(1, 读者管理员, 40, 120, 4, 0.1, 0)insert into readertype values(2, 图书管理员, 30, 90, 3, 0.2, 0)insert into readertype values(3, 教师, 20, 60, 2, 0.3, 0)insert into readertype values(4, 学生, 10, 30, 1, 0.4, 4)-创建读者表create table
10、 reader(rdidint not null primary key,rdname nvarchar(20),rdpwd nvarchar(20),rdsex char(8),rdtype smallint constraint lei_bie foreign key references readertype(rdtype),rddept nchar(8), -单位代码rdphone nvarchar(25), -读者电话rdemail nvarchar(50), -读者emailrddatereg smalldatetime, -读者登记日期rdborrowqty int -已借数量)
11、insert into reader values(1, 张林峰, 123, 男, 1, 计科,1051034428,20100903,3)insert into reader values(2, 姚玉婷, 123, 女, 2, 医学院,1051034428,20100903,3)insert into reader values(3, 胡龙安, 123, 男, 3, 机械,1051034428,20100903,3)insert into reader values(4, 刘元强, 123, 女, 4, 生科, 1
12、5507158607,1051034428,20100903,3)create table tb_book(bkid int not null,bkcode nchar(20) not null,bkname nvarchar(50) null,bkauthor nvarchar(30) null,bkpress nvarchar(50) null,-bkdatepress datetime null,-bkisbn nchar(15) null,bkcatalog nvarchar(30) null,-bklanguage smallint null,bkpages int null,bkp
13、rice float null,bkdatein datetime null,-bkbrief text null,-bkcover image null,bkisinlab nchar(1) null, primary key (bkid) create table tb_borrow(borrowid int not null,rdid int null,bkid int null,ldcontinuetimes int null,lddateout datetime null,lddateretplan datetime null,lddateretact datetime null,l
14、doverday int null,ldovermoney float null,ldpunishmoney float null,lshasreturn nchar(1) null,operatorlend nvarchar(20) null,operatorret nvarchar(20) null, primary key (borrowid), foreign key(rdid) references reader(rdid), foreign key(bkid) references tb_book (bkid)4. 体系结构要求使用多层(三层)c/s或b/s模式开发该系统。简单的客
15、户/服务器体系结构的数据库应用系统开发周期短,能够适应大部分中小型数据库应用系统的要求(当客户端数量少于50时),但是,随着数据库应用的日益发展、数据容量的不断增加、客户端数量的不断增多,这种体系结构显示出了诸多缺陷。你知道有哪些缺陷吗?所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”。它是指逻辑上的三层结构,即使在一台机器上也可构成三层体系结构的应用系统。三层分别为表示层、业务逻辑层和数据访问层。表示层(usl):为客户提供对应用程序的访问,以windows应用程序或web应用程序的形式提供实现的功能。业务逻辑层(bll):实现应用程序的业务功能,以类库的形式为表示层提供服务。数
16、据访问层(dal):实现整个系统所有的数据库连接、数据存取操作,以组件类库的形式为业务逻辑层提供服务。此外,实体类,简单地说是描述一个业务实体的类。业务实体直观一点的理解就是整个应用系统业务所涉及的对象,从数据存储来讲,业务实体就是存储应用系统信息的数据表,将数据表中的每一个字段定义成属性,并将这些属性用一个类封装,这个类就称为实体类。业务实体可以认为属于业务逻辑层,当然,可以将业务实体单独作为一层,称为业务实体层。表示层、业务逻辑层、数据访问层都依赖于业务实体。各层之间数据的传递主要是实体对象4、 系统实现1. 数据库操作公共类数据库操作类sqlhelper主要实现的功能有:打开数据库连接、
17、关闭数据库连接、执行带参数的sql语句,执行存储过程等。public class sqlhelper static sqlconnection conn = new sqlconnection(server=localhost;database=bookmanage;integrated security=sspi); / 打开数据库连接 private static void openconn() try if (conn.state = connectionstate.closed) conn.open(); catch (exception ex) throw new exception
18、(ex.message); / 关闭数据库连接 private static void closeconn() if (conn.state = connectionstate.open) conn.close(); / / 执行不带参数的sql语句,并返回受影响的行数 / / 不带参数的sql语句 / 返回受影响的行数 public static int execsqlnoparam(string sql) int rows = -1; try openconn(); sqlcommand cmd = conn.createcommand(); cmd.commandtext = sql;
19、rows = cmd.executenonquery(); catch (exception ex) throw new exception(ex.message); return rows; / / 执行带参数的sql语句,并返回受影响的行数 / / 带参数的sql语句 / 参数数组 / 返回受影响的行数 public static int execsqlwithparam(string sql, sqlparameter parameters) int rows = -1; try openconn(); sqlcommand cmd = conn.createcommand(); cmd
20、.commandtext = sql; foreach (sqlparameter param in parameters) cmd.parameters.add(param); rows = cmd.executenonquery(); catch (exception ex) throw new exception(ex.message); return rows; / / 执行带参数的存储过程,并返回受影响的行数 / / / / public static int execspwithparam(string storedprocedurename, sqlparameter param
21、eters) int rows = -1; try openconn(); sqlcommand cmd = conn.createcommand(); cmd.commandtype = commandtype.storedprocedure; cmd.commandtext = storedprocedurename; foreach (sqlparameter param in parameters) cmd.parameters.add(param); rows = cmd.executenonquery(); catch (exception ex) throw new except
22、ion(ex.message); return rows; / / 执行不带参数的sql语句,返回数据集中的数据表 / / 不带参数的sql语句 / 数据表的名称 / 返回数据集中的数据表 public static datatable gettable(string sql, string tablename) datatable dt; try openconn(); sqldataadapter sda = new sqldataadapter(sql, conn); dataset ds = new dataset(); sda.fill(ds, tablename); dt = ds
23、.tablestablename; catch (exception ex) throw new exception(ex.message); return dt; /执行不带参数的的sql语句,并返回首行首列的值 public static object executescalar(string sql) object obj; try openconn(); sqlcommand cmd = conn.createcommand(); cmd.commandtext = sql; obj = cmd.executescalar(); catch (exception ex) throw n
24、ew exception(ex.message) return obj; /执行不带参数的的sql语句,并返回sqldatareader public static sqldatareader executereader(string sql) sqldatareader sdr; try openconn(); sqlcommand cmd = conn.createcommand(); cmd.commandtext = sql; sdr = cmd.executereader(); catch (exception ex) throw new exception(ex.message);
25、 return sdr; 2. 业务实体类model层实体类的属性与数据库表结构保持一致;实体类应尽量简单,除了实体对象的复制与比较方法等外,不适宜添加过多方法。namespace model /读者信息 public class reader / 私有字段 private int _rdid; private string _rdname; private string _rdpwd; private string _rdsex; private int _rdtype; private string _rddept; private string _rdphone; private str
26、ing _rdemail; private datetime _rddatereg; private int _rdborrowqty; / 公有属性 public int32 rdid set; get; /读者序号 public string rdname set; get; /读者姓名 public string rdpwd set; get; /读者密码 public string rdsex set; get; /读者性别 public int32 rdtype set; get; /读者类型 public string rddept set; get; /读者单位 public s
27、tring rdphone set; get; /读者电话 public string rdemail set; get; /读者邮箱 public datetime rddatereg set; get; /注册日期 public int32 rdborrowqty set; get; /已借书数量 3. 数据访问层dal层实现model实体对象在数据库中的基本存取操作(插删改查)和事务操作。(1)一般来说,一张表的插、删、改操作各采用一个方法实现就够了,查询操作可能需要多个方法。(2)sql语句的生成与执行操作尽量放入dal层。(3)多表查询sql语句的生成可以放入bll层,并调用dal层
28、中相应方法,如sqlhelper.getdatatable()。(4)对事务性要求高的操作,可以采用存储过程实现,在存储过程中控制事务的执行过程。(5)dal层中类的成员函数,建议全部使用 public static访问属性,如7.3节中的readerdal.getallreader()和readerdal.addreader();这样在bll层调用dal层方法时,不需要创建dal层对象,可直接使用dal层类名来调用。namespace dal public class readerdal / 获取所有读者的基本信息 public datatable getreader() string sq
29、l = select * from reader; datatable dt = sqlhelper.gettable(sql, reader); return dt; / 获取所有读者的基本信息 public list getlistreader() string sql = select * from reader; list readerlist = new list(); sqldatareader sdr = sqlhelper.executereader(sql); while (sdr.read() reader r = new reader(); r.rdid = conver
30、t.toint32(sdrrdid); r.rdname = sdrrdname.tostring().trim(); r.rdpwd = sdrrdpwd.tostring().trim(); r.rdsex = sdrrdsex.tostring().trim(); r.rdtype = convert.toint32(sdrrdtype); r.rddept = sdrrddept.tostring().trim(); r.rdphone = sdrrdphone.tostring().trim(); r.rdemail = sdrrdemail.tostring().trim(); r
31、.rddatereg = convert.todatetime(sdrrddatereg); r.rdborrowqty = convert.toint32(sdrrdborrowqty); readerlist.add(r); sdr.close(); return readerlist; / 指定读者序号的读者是否已存在 public bool isexistsreader(int rdid) string sql = string.format(select count(*) from reader where rdid =0, rdid); int count = convert.to
32、int32(sqlhelper.executescalar(sql); return count = 1; / 添加读者信息 public bool insertreader(reader reader) string sql = insert into reader values(rdid, rdname, rdpwd, rdsex, rdtype,rddept,rdphone,rdemail,rddatereg,rdborrowqty); sqlparameter parameters = new sqlparameter(rdid, sqldbtype.int ), new sqlpar
33、ameter(rdname, sqldbtype.char, 6), new sqlparameter(rdpwd, sqldbtype.nvarchar , 20), new sqlparameter(rdsex, sqldbtype.char ,8), new sqlparameter(rdtype, sqldbtype.smallint ), new sqlparameter(rddept, sqldbtype.nchar , 8), new sqlparameter(rdphone, sqldbtype.nvarchar , 25), new sqlparameter(rdemail,
34、 sqldbtype.nvarchar , 25), new sqlparameter(rddatereg, sqldbtype.smalldatetime, 2), new sqlparameter(rdborrowqty, sqldbtype.int) ; parameters0.value = reader.rdid; parameters1.value = reader.rdname; parameters2.value = reader.rdpwd; parameters3.value = reader.rdsex; parameters4.value = reader.rdtype
35、; parameters5.value = reader.rddept; parameters6.value = reader.rdphone; parameters7.value = reader.rdemail; parameters8.value = reader.rddatereg; parameters9.value = reader.rdborrowqty; int rows = sqlhelper.execsqlwithparam(sql, parameters); return rows = 1; public bool deletereader(string rdid) st
36、ring sql = delete from reader where rdid = rdid; sqlparameter parameters = new sqlparameter(rdid, sqldbtype.int ) ; parameters0.value = rdid; int rows = sqlhelper.execsqlwithparam(sql, parameters); return rows = 1; 4. 业务逻辑层bll层可以设计与实体类对应的类,并实现仅与该实体类有关的一些基础功能。如下例中readerbll继承了实体类reader:namespace bll p
37、ublic class readerbll / readerdal rdal = new readerdal(); private readerdal rdal; public readerbll() rdal = new readerdal(); / 获取所有读者信息 public datatable getreader() return rdal.getreader(); public list getlistreader() return rdal.getlistreader(); / 添加读者 public bool insertreader(reader reader) /如果已经存
38、在该读者 if (rdal.isexistsreader(reader.rdid) return false; else return rdal.insertreader(reader); public class bookbll private bookdal bdal; public bookbll() bdal = new bookdal(); / 获取所有图书信息 public datatable getbook() return bdal.getbook(); public list getlistbook() return bdal.getlistbook(); / 添加图书 pu
39、blic bool insertbook(book book) /如果已经存在该图书 if (bdal.isexistsbook(book.bkid) return false; else return bdal.insertbook(book); 5、 系统运行效果、功能1. 登陆界面读者管理员选择第一个radio button后进入读者管理界面,图书管理员选择第二个radio button后进入图书管理界面。教师、本科、专科、硕士生由第三个radio button进入普通读者界面。例如选择进入读者管理可用如下代码实现:if (duzhegly.checked) /选择读者管理员radio
40、button conn.open(); string sql = select * from reader where rdid= + zhanghao.text.tostring().trim() + and rdpwd= + mima.text.tostring().trim() + and rdtype =1; cmd.commandtext = sql; if (null != cmd.executescalar() frmduzhe form2 = new frmduzhe(); form2.show(); zhanghao.text = ; mima.text = ; else messagebox.show(用户名或密码错误!, 警告); conn.close(); 2. 读者管理界面添加读者信息往文本框输入读者信息,点击添加按钮即可添加读者信息,若该读者序号存在,则显示添加错误。修改读者信息双击某读者那一行的表头,该读者的信息将传送到文本框,在文本框进行修改,然后点击修改,即可修改该读者信息,读者序号不可修改。删除读者信息单击某一行表头,点击删除,即可删除该行信息。查找读者信息可按读者序号、读者姓名、读者类别、性别进行模糊查询。即可显示在网格中。若不存在以上条件的读者,则弹
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年护理工作计划及总结改进措施(2篇)
- 地热采暖工程施工组织设计
- 2026年物联网外包数字孪生合同
- 2026年汽车外包人事外包合同
- 2026年大数据培训采购供应协议
- 村庄清洁整治工作制度
- 预诊分诊分诊工作制度
- 领导党建联席工作制度
- 领导挂联粮食工作制度
- 风控病房工作制度汇编
- 2026重庆邮政集团春季招聘笔试模拟试题及答案解析
- 《赵州桥(第一课时)》课件
- 《建设工程监理合同管理》课件
- 政府项目招投标流程培训课件
- 设备租赁管理规定考核标准
- 互联网医疗创新创业路演
- 2025年社区工作者招聘真题试卷+参考答案
- 劳动合同法视角下灵活就业人员权益保护
- 不合格标本讲解
- 清理网箱应急预案
- 2025年大学《休闲体育》专业题库- 享受体育带来的快乐
评论
0/150
提交评论