




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库课程设计班 级 软件工程1001 学 号 3100608024 姓 名 张建彬 指导老师 辛燕 二零一二年六月一、引言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(serverhenv
6、,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=SQLAllo
7、cHandle(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); if
8、(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(serverhstm
9、t,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); c
10、outccno;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 sor
11、der.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_PARAM
13、_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(se
14、rverhstmt,(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,caddr,
15、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) SQLFreeHandle
16、(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(ser
17、verhstmt,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,1
18、0,&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,SQL
20、_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_INTE
21、GER,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_I
22、NPUT,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_L
23、ONG,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);re
24、t=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,1
25、0,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(serverh
26、stmt,(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,SQL
27、_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=SQLPrepar
28、e(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_CHAR
29、,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=SQLPre
30、pare(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_CHAR,
31、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=SQL
32、Prepare(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);re
33、t=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(serverhs
34、tmt,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) c
35、outFetch errorn;else coutnnmno ntitle nperiod npriceendl;三、数据库的分析与设计1概念设计:E-R图 m报刊订阅投递n n代号名称刊期单价日期起订日终定日份数编号用户地址姓名期号份数m2逻辑设计:关系模型及其分析 主码用横线划出:订户(订户号,姓名,住址);报刊目录(报刊代号,名称,刊期,单价);订单(订户号,报刊代号,日期,起订期,终定期,订单量);外码:订户号、报刊代号投递卡(订户号,报刊代号,期号,份数); 外码:订户号、报刊代号3完整性设计:关系主码、外码、CHECK约束、触发器1) 关系主码、外码: 2) CHECK约束: 3)
36、 实现级联删除: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 通过设置定义外码来实现级联删除:四、系统的实现1. 按订户查询订单的详细情况: 输入要查询的订户编号,对应订户的订单信息便可输出。2. 统计报刊的订阅数量及金额: 将订单中的被订阅报刊按各自的报刊号分组,相同的在一组之后用聚集函数sum(qty)和sum(qty*price)将各种报刊被订阅的数量和金额输出。3.订户的管理1) 订户的增加:Customer表中共订户号、姓名、住址3个属性,把要插入的新用户信息(090107,孙亚慧,江苏大学)依次按这个顺序输入,已完成新用户的插入。2) 订户的修改:修改订户必须是修改已经存在的订户,主码为订户号cno不可改变,也是可以唯一决定某一元组的属性,输入要修改的值(孙亚慧,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床医学技士试题及答案
- 掌握2024年纺织品检验员试题及答案
- 全面了解纺织工程师考试内容试题及答案
- 国际商业美术设计师行业前景展望试题及答案
- 全球市场中的设计策略适应性试题及答案
- 护士类考试试题及答案
- 教师体罚测试题及答案
- 外伤固定考试题及答案
- 电梯管理员试题及答案
- 烟叶种植面试题及答案
- 全屋硬装 工具-版本信息 v2-2021041课件讲解
- 东华全民健康信息平台建设方案
- 少先队队员知识考核试题参考(有答案)
- 煤矿排矸场、矸石山生态环境治理工程施工组织设计
- 《论教育》主要篇目课件
- 10t桥式起重机安装方案
- 消防查验合同范例
- 园丁与木匠读书分享
- 1例脑出血术后并颅内感染患者的个案护理
- 2024年重庆市普通高中学业水平选择性考试高考模拟调研卷(一)化学试题(含答案解析)
- 《发酵工程原理及技术》期末试题C及答案
评论
0/150
提交评论