数据库课程设计班级软件工程1001学号3100608024姓名张建彬指导老师辛燕二零一二年六月一、引言1.目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。课程设计的目的:加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平;在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;学会将知识应用于实际的方法,提高分析和解决问题的能力,增强动手能力;为毕业设计和以后工作打下必要基础。2.题目:设计一个订户订阅报刊的应用系统。(1).处理要求接收并且处理订户的订阅要求回答订户的查询统计报刊的订阅情况(2).信息要求订单订户报刊目录投递卡具体数据参见附表数据语义:一个客户可以订阅多份报刊,一种报刊可以为多个客户订阅(客户-订阅-报刊,m:n)一种报刊可以投递给多个客户,一个客户一次可以接受多种报刊的投递(报刊-投递-客户,m:n)(3).系统功能包括:(在查询和管理中各选一题)订户管理:订户的增加、修改、删除;报刊目录管理:报刊目录的增加、删除、修改;订单管理:订单的增加、删除、修改;查询订单:按订户查询订单的详细情况;统计查询:统计报刊的订阅数量及金额。3.要求:运用数据库基本理论与应用知识,在微机RDBMS(SQLServer)的环境上建立一个数据库应用系统。要求把现实世界的事物及事物之间的复杂关系抽象为信息世界的实体及实体之间联系的信息模型,再转换为机器世界的数据模型和数据文件,并对数据文件实施检索、更新和控制等操作。(1).用E-R图设计选定题目的信息模型;(2).设计相应的关系模型,确定数据库结构;(3).分析关系模式各属于第几范式,阐明理由;(4).设计应用系统的系统结构图,确定系统功能;(5).通过设计关系的主码约束、外码约束和使用CHECK实现完整性控制;(6).为参照关系设计插入、删除、修改触发器;(7).实现应用程序设计、编程、优化功能;(8).对系统的各个应用程序进行集成和调试,进一步优化系统功能、改善系统用户界面完成实验内容所指定的各项要求;(9).分析遇到的问题,总结并写出课程设计报告;(10).自我评价4.开发工具及技术:(1).开发工具数据库管理系统:SQLServer2000应用程序:C/C++(2).开发技术ODBCAPI(参考课本8.3ODBC编程)二、系统的分析与设计1.系统功能结构2.主要功能模块设计/*各模块的程序流程图、类定义*/1)初始化环境和数据库连接:classorder{public:intselect1();intselect2();intinsert1();intupdate1();intremove1();intinsert2();intupdate2();intremove2();intinsert3();intupdate3();intremove3();};/*Step1初始化环境*/ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&serverhenv);ret=SQLSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);/*Step2:建立连接*/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;/*Step3:初始化语句句柄*/ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc,&serverhstmt);YESNO程序初始化连结数据库初始化图形界面功能选择报刊数目金额统计模块订户、报刊及订单管理模块订户订单查询模块退出程序ret=SQLSetStmtAttr(serverhstmt,SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_INTEGER);2)查询:ret=SQLPrepare(serverhstmt,(SQLCHAR*)selectname,sorder.cno,addr,sdate,nmno,start,term,qtyfromcustomer,sorderwherecustomer.cno=sorder.cnoandcustomer.cno=?,SQL_NTS);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(serverhstmt,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);cout输入订户编号:cno=;cinccno;}ret=SQLExecute(serverhstmt);//执行while((ret=SQLFetch(serverhstmt))!=SQL_NO_DATA_FOUND){coutccno''cname''caddr''osdate''nnmno''ostart''oterm''oqtyendl;}ret=SQLExecDirect(serverhstmt,(SQLCHAR*)selectsorder.nmno,sum(qty),sum(qty*price)fromsorder,nmtablewherenmtable.nmno=sorder.nmnogroupbysorder.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)//从查询结果中取出数据{if(ret==SQL_ERROR)coutFetcherror\n;elsecoutnnmno'\t'sum1'\t'sum2endl;}3)管理:输入订户号输出相应订单ret=SQLPrepare(serverhstmt,(SQLCHAR*)insertintocustomer(cno,name,addr)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,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);cout输入插入值:;cinccnocnamecaddr;}ret=SQLExecute(serverhstmt);ret=SQLPrepare(serverhstmt,(SQLCHAR*)updatecustomersetname=?,addr=?wherecno=?,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,0,&cbaddr);ret=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno,0,&cbcno);cout输入修改值:;cincnamecaddr;cout输入修改要求:;cinccno;}ret=SQLExecute(serverhstmt);ret=SQLPrepare(serverhstmt,(SQLCHAR*)deletefromcustomerwherecno=?,SQL_NTS);if(!(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)){SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);returnret;}ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,ccno,0,&cbcno);cout输入删除要求:cno=;cinccno;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(serverhstmt,(SQLCHAR*)select*fromcustomer,SQL_NTS);if(ret==SQL_SU