《数据库课程设计(江苏大学版本)(共18页).doc》由会员分享,可在线阅读,更多相关《数据库课程设计(江苏大学版本)(共18页).doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上数据库课程设计班 级 软件工程1001 学 号 姓 名 张建彬 指导老师 辛燕 二零一二年六月一、引言1目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。课程设计的目的:l 加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平;l 在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;l 学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;l 为毕业设计和以后工作打下必要基础。2题目: 设计一个订户订阅报刊
2、的应用系统。(1).处理要求l 接收并且处理订户的订阅要求l 回答订户的查询l 统计报刊的订阅情况(2).信息要求l 订单l 订户l 报刊目录l 投递卡具体数据参见附表数据语义:l 一个客户可以订阅多份报刊,一种报刊可以为多个客户订阅(客户-订阅-报刊,m:n)l 一种报刊可以投递给多个客户,一个客户一次可以接受多种报刊的投递(报刊-投递-客户,m:n)(3).系统功能包括:(在查询和管理中各选一题)l 订户管理:订户的增加、修改、删除;l 报刊目录管理:报刊目录的增加、删除、修改;l 订单管理:订单的增加、删除、修改;l 查询订单:按订户查询订单的详细情况;l 统计查询:统计报刊的订阅数量及
3、金额。3要求:运用数据库基本理论与应用知识,在微机RDBMS(SQL Server)的环境上建立一个数据库应用系统。要求把现实世界的事物及事物之间的复杂关系抽象为信息世界的实体及实体之间联系的信息模型,再转换为机器世界的数据模型和数据文件,并对数据文件实施检索、更新和控制等操作。 (1). 用E-R图设计选定题目的信息模型;(2). 设计相应的关系模型,确定数据库结构;(3). 分析关系模式各属于第几范式,阐明理由;(4). 设计应用系统的系统结构图,确定系统功能;(5). 通过设计关系的主码约束、外码约束和使用CHECK实现完整性控制;(6). 为参照关系设计插入、删除、修改触发器;(7).
4、 实现应用程序设计、编程、优化功能;(8). 对系统的各个应用程序进行集成和调试,进一步优化系统功能、改善系统用户界面完成实验内容所指定的各项要求;(9). 分析遇到的问题,总结并写出课程设计报告;(10).自我评价4开发工具及技术:(1).开发工具l 数据库管理系统: SQL Server2000l 应用程序:C/C+(2).开发技术ODBC API(参考课本8.3 ODBC编程)二、系统的分析与设计1系统功能结构 YESNO程序初始化连结数据库初始化图形界面功能选择报刊数目金额统计模块订户、报刊及订单管理模块订户订单查询模块退出程序2主要功能模块设计 /*各模块的程序流程图、类定义*/ 1
5、)初始化环境和数据库连接:class orderpublic: int select1(); int select2();int insert1(); int update1();int remove1(); int insert2(); int update2(); int remove2(); int insert3();int update3(); int remove3(); /* Step 1 初始化环境*/ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);ret=SQLSetEnvAttr(serverhe
6、nv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);/* Step 2 :建立连接*/ret=SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);ret=SQLConnect(serverhdbc,(SQLCHAR*)syh,SQL_NTS,(SQLCHAR*)sa,SQL_NTS,(SQLCHAR*)sunyahui,SQL_NTS);if (!SQL_SUCCEEDED(ret) ) /连接失败时返回错误值 return -1;/* Step 3 :初始化语句句柄*/ret=SQLAl
7、locHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);ret=SQLSetStmtAttr(serverhstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);2)查询: 输入订户号输出相应订单ret=SQLPrepare(serverhstmt,(SQLCHAR*)select name,o,addr,sdate,nmno,start,term,qty from customer,sorder where o=o and o=?,SQL_NTS);
8、if(ret=SQL_SUCCESS|ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindCol(serverhstmt,1,SQL_C_CHAR,cname,10,&cbname);ret=SQLBindCol(serverhstmt,2,SQL_C_CHAR,ccno,10,&cbcno);ret=SQLBindCol(serverhstmt,3,SQL_C_CHAR,caddr,15,&cbaddr);ret=SQLBindCol(serverhstmt,4,SQL_C_CHAR,osdate,10,&cbsdate);ret=SQLBindCol(serverhs
9、tmt,5,SQL_C_CHAR,nnmno,10,&cbnmno);ret=SQLBindCol(serverhstmt,6,SQL_C_CHAR,ostart,10,&cbstart);ret=SQLBindCol(serverhstmt,7,SQL_C_CHAR,oterm,10,&cbterm);ret=SQLBindCol(serverhstmt,8,SQL_C_LONG,&oqty,0,&cbqty);ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno,0,&cbcno);
10、 coutccno;ret=SQLExecute(serverhstmt);/执行while ( (ret=SQLFetch(serverhstmt) ) !=SQL_NO_DATA_FOUND) coutccno cname caddr osdate nnmno ostart oterm oqtyendl;ret=SQLExecDirect(serverhstmt,(SQLCHAR*)select sorder.nmno, sum(qty),sum(qty*price) from sorder,nmtable where nmtable.nmno=sorder.nmno group by s
11、order.nmno;,SQL_NTS); if(ret=SQL_SUCCESS|ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindCol(serverhstmt,1,SQL_C_CHAR,nnmno,10,&cbnmno); ret=SQLBindCol(serverhstmt,2,SQL_C_LONG,&sum1,0,&cbsum1); ret=SQLBindCol(serverhstmt,3,SQL_C_DOUBLE,&sum2,0,&cbsum2); while ( (ret=SQLFetch(serverhstmt) ) !=SQL_NO_DATA_FOUND
12、) /从查询结果中取出数据 if(ret=SQL_ERROR) coutFetch errorn;else coutnnmnotsum1tsum2endl;3)管理:功能选择订户的管理报刊的管理订单的管理功能选择增加修改删除ret=SQLPrepare(serverhstmt,(SQLCHAR*)insert into customer(cno,name,addr) values (?,?,?), SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PAR
13、AM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno,0,&cbcno); ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,cname,0,&cbname); ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,15,0,caddr,0,&cbaddr); coutccnocnamecaddr;ret=SQLExecute(serverhstmt);ret=SQLPrepare(
14、serverhstmt,(SQLCHAR*)update customer set name=?,addr=? where cno=?, SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,cname,0,&cbname); ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,15,0,cadd
15、r,0,&cbaddr); ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno,0,&cbcno);coutcnamecaddr;coutccno; ret=SQLExecute(serverhstmt);ret=SQLPrepare(serverhstmt,(SQLCHAR*)delete from customer where cno=?, SQL_NTS);if (!(ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO) SQLFreeHand
16、le(SQL_HANDLE_STMT, serverhstmt);return ret; ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno, 0, &cbcno); coutccno;ret=SQLExecute(serverhstmt);SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);ret=SQLSetStmtAttr(s
17、erverhstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);ret=SQLExecDirect(serverhstmt,(SQLCHAR*)select * from customer,SQL_NTS); if(ret=SQL_SUCCESS|ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindCol(serverhstmt,1,SQL_C_CHAR,ccno,10,&cbcno);ret=SQLBindCol(serverhstmt,2,SQL_C_CHAR,cname
18、,10,&cbname);ret=SQLBindCol(serverhstmt,3,SQL_C_CHAR,caddr,15,&cbaddr);while ( (ret=SQLFetch(serverhstmt) ) !=SQL_NO_DATA_FOUND) if(ret=SQL_ERROR) coutFetch errorn;else coutccno cname caddrendl;ret=SQLPrepare(serverhstmt,(SQLCHAR*)insert into sorder(cno,sdate,nmno,start,term,qty) values (?,?,?,?,?,?
19、), SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno,0,&cbcno); ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,osdate,0, &cbsdate);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,S
20、QL_C_CHAR,SQL_CHAR,10,0,nnmno,0, &cbnmno);ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ostart,0, &cbstart);ret=SQLBindParameter(serverhstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,oterm,0, &cbterm);ret=SQLBindParameter(serverhstmt,6,SQL_PARAM_INPUT,SQL_C_LONG,SQL_IN
21、TEGER,0,0,&oqty,0,&cbqty); coutccnoosdatennmnoostartotermoqty; ret=SQLExecute(serverhstmt);ret=SQLPrepare(serverhstmt,(SQLCHAR*)update sorder set sdate=?,start=?,term=?,qty=? where cno=? and nmno=?, SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM
22、_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,osdate,0,&cbsdate);ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ostart,0, &cbstart);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, 10,0, oterm, 0, &cbterm);ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C
23、_LONG,SQL_INTEGER,0,0,&oqty,0,&cbqty);ret=SQLBindParameter(serverhstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR, 10,0, ccno, 0, &cbcno);ret=SQLBindParameter(serverhstmt,6,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,nnmno,0,&cbnmno); coutosdateostartotermoqty;coutccno;coutnnmno;ret=SQLExecute(serverhstmt);
24、ret=SQLPrepare(serverhstmt,(SQLCHAR*)delete from sorder where cno=? and nmno=?, SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0, ccno,0, &cbcno);ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR
25、,10,0,nnmno,0,&cbnmno); coutccno;coutnnmno; ret=SQLExecute(serverhstmt);SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);ret=SQLSetStmtAttr(serverhstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);ret=SQLExecDirect(serve
26、rhstmt,(SQLCHAR*)select * from sorder,SQL_NTS); if(ret=SQL_SUCCESS|ret=SQL_SUCCESS_WITH_INFO) ret=SQLBindCol(serverhstmt,1,SQL_C_CHAR,ccno, 10,&cbcno);ret=SQLBindCol(serverhstmt,2,SQL_C_CHAR,osdate,10,&cbsdate);ret=SQLBindCol(serverhstmt,3,SQL_C_CHAR,nnmno, 10,&cbnmno);ret=SQLBindCol(serverhstmt,4,S
27、QL_C_CHAR,ostart,10,&cbstart);ret=SQLBindCol(serverhstmt,5,SQL_C_CHAR,oterm, 10,&cbterm);ret=SQLBindCol(serverhstmt,6,SQL_C_LONG,&oqty, 0,&cbqty); while ( (ret=SQLFetch(serverhstmt) ) !=SQL_NO_DATA_FOUND) if(ret=SQL_ERROR) coutFetch errorn;else coutccno osdate nnmno ostart oterm oqtyendl;ret=SQLPrep
28、are(serverhstmt,(SQLCHAR*)insert into nmtable(nmno,title,period,price) values (?,?,?,?), SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,nnmno,0, &cbnmno); ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CH
29、AR,SQL_CHAR,15,0,ntitle,0, &cbtitle);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,nperiod,0, &cbperiod);ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_DOUBLE,SQL_DOUBLE,0,0,&nprice,0, &cbprice);coutnnmnontitlenperiodnprice;ret=SQLExecute(serverhstmt);ret=SQLP
30、repare(serverhstmt,(SQLCHAR*)update nmtable set title=?,period=?,price=? where nmno=?, SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,15,0,ntitle,0, &cbtitle);ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT,SQL_C_CHA
31、R,SQL_CHAR,10,0,nperiod,0, &cbperiod);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_DOUBLE,SQL_DOUBLE,0,0,&nprice,0, &cbprice);ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,nnmno,0,&cbnmno); coutntitlenperiodnprice; coutnnmno;ret=SQLExecute(serverhstmt);ret=S
32、QLPrepare(serverhstmt,(SQLCHAR*)delete from nmtable where nmno=?, SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,nnmno,0,&cbnmno); coutnnmno; ret=SQLExecute(serverhstmt);SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);
33、ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);ret=SQLSetStmtAttr(serverhstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);ret=SQLExecDirect(serverhstmt,(SQLCHAR*)select * from nmtable,SQL_NTS); if(ret=SQL_SUCCESS|ret=SQL_SUCCESS_WITH_INFO) ret=SQLBindCol(server
34、hstmt,1,SQL_C_CHAR,nnmno, 10,&cbnmno);ret=SQLBindCol(serverhstmt,2,SQL_C_CHAR,ntitle, 15,&cbtitle);ret=SQLBindCol(serverhstmt,3,SQL_C_CHAR,nperiod, 10,&cbperiod);ret=SQLBindCol(serverhstmt,4,SQL_C_DOUBLE,&nprice,0,&cbprice); while ( (ret=SQLFetch(serverhstmt) ) !=SQL_NO_DATA_FOUND) if(ret=SQL_ERROR)
35、 coutFetch errorn;else coutnnmno ntitle nperiod npriceendl;三、数据库的分析与设计1概念设计:E-R图 m报刊订阅投递n n代号名称刊期单价日期起订日终定日份数编号用户地址姓名期号份数m2逻辑设计:关系模型及其分析 主码用横线划出:订户(订户号,姓名,住址);报刊目录(报刊代号,名称,刊期,单价);订单(订户号,报刊代号,日期,起订期,终定期,订单量);外码:订户号、报刊代号投递卡(订户号,报刊代号,期号,份数); 外码:订户号、报刊代号3完整性设计:关系主码、外码、CHECK约束、触发器1) 关系主码、外码: 2) CHECK约束:
36、3) 实现级联删除:l 触发器定义:CREATE TRIGGER C2_DELETEON customerINSTEAD OF DELETEAS BEGINDELETE sorderFROM sorder br,Deleted dwhere o=oEND/删除订户同时删除订户的订单CREATE TRIGGER N2_DELETEON nmtableINSTEAD OF DELETEAS BEGINDELETE sorderFROM sorder br,Deleted d where br.nmno=d.nmnoEND/删除报刊目录同时删除订户的订单l 通过设置定义外码来实现级联删除:四、系统的
37、实现1. 按订户查询订单的详细情况: 输入要查询的订户编号,对应订户的订单信息便可输出。2. 统计报刊的订阅数量及金额: 将订单中的被订阅报刊按各自的报刊号分组,相同的在一组之后用聚集函数sum(qty)和sum(qty*price)将各种报刊被订阅的数量和金额输出。3.订户的管理1) 订户的增加:Customer表中共订户号、姓名、住址3个属性,把要插入的新用户信息(,孙亚慧,江苏大学)依次按这个顺序输入,已完成新用户的插入。2) 订户的修改:修改订户必须是修改已经存在的订户,主码为订户号cno不可改变,也是可以唯一决定某一元组的属性,输入要修改的值(孙亚慧,无锡),再输入cno:,将原来对
38、应的姓名和住址修改掉。3) 订户的删除:删除订户也必须是已经存在的订户,输入主码,由其决定的那一行将被删除。4.报刊的管理:1) 报刊的增加:Nmtable表中的属性有代号、名称、刊号、单价,把要插入的新报刊信息(01-07,无锡日报,日报,0.056)依次按这个顺序输入,已完成新报刊的插入。2) 报刊的修改:修改报刊必须是修改已经存在的报刊,主码为报刊号nmno不可改变,也是可以唯一决定某一元组的属性,输入要修改的值(无锡周报,周报,0.076),再输入nmno:01-07,将原来01-07对应的名称、刊号和单价修改掉。3) 报刊的删除:删除报刊也必须是已经存在的报刊,输入主码01-07,由
39、其决定的那一行将被删除。5.订单的管理:1) 订单的增加:Order表中的属性有编号、日期、代号、起定期、终定期、份数,把要插入的新订单信息(,01-03,02,15,7)依次按这个顺序输入,已完成新订单的插入,其中cno和nmno必须是已经存在的订户号和报刊号。2) 订单的修改:修改订单必须是修改已经存在的订单,主码为cno和nmno不可改变,也是可以唯一决定某一元组的属性,输入要修改的值(,01,10,10),再输入cno:和nmno:01-03,将原来对应的其余属性修改掉。3) 订单的删除:删除订单也必须是已经存在的订单,输入主码和01-03,由其决定的那一行将被删除。五、课程设计小结
40、通过这次课程设计,我对于SQL Server有了更深入的了解,并对于如何将SQL Server与VC+环境相连接也有了一个全新的认识,对于一个企业的数据库管理有了很深刻的实践认知。同时使我对数据库系统的设计及应用有了更加深刻的认识,包括从E-R图的设计,数据结构定义到关系模型的设计,完整性约束的整个过程。最终将题目中所有功能实现的时候也让我很是兴奋。当然在其中遇到了很多的困难与不解,虽然有些是因为我的粗心马虎造成的书写等小错误,但更多的是一些技术上的问题。除此之外关于ODBC的数据配置也是以前所没有接触过的,通过这次课设也是新学了一种知识与运用,做到了理论与实际很好的结合。不过由于是第一次接触这种连接式的编程,在设置上也是经常犯错,虽说书上已经给出了一个大概的程序模版,不过真正实际运用到我自己编写的程序上的时候诸多的不解也随之而来了,比如每一个函数的含义以及应该在什么时候运用,每一个变量的定义格式和代表的意思等等全都要重新写过,所以整整花了前半个课设的时间才渐渐的理清了头绪,能够自己看懂整个程序并发现问题,直至最终完成所有程序的编写。整个过程可以说是让我受益匪浅,类似于学会了一种全新的技能,以前看着那些企业管理系统,却不知道是如何形成的,而如今我自己也可以完成那么一个系统的编程,也为我个人的知识能力储备添砖加瓦了。专心-专注-专业