实验6嵌入式SQL应用1实实实验验验666嵌嵌嵌入入入式式式SSSQQQLLL应应应用用用实验目的掌握第三代高级语言如C语言中嵌入式SQL的数据库数据操作方法,能清晰地领略到SQL命令在第三代高级语言中操作数据库数据的方式方法,这种方式方法在今后各种数据库应用系统开发中将被广泛采用。掌握嵌入了SQL语句的C语言程序的上机过程:包括编辑、预编译、编译、连接、修改、调试与运行等内容。背景知识国际标准数据库语言SQL应用广泛。目前,各商用数据库系统均支持它,各开发工具与开发语言均以各种方式支持SQL语言。涉及数据库的各类操作如插入、删除、修改与查询等主要是通过SQL语句来完成的。广义来讲,各类开发工具或开发语言,其通过SQL来实现的数据库操作均为嵌入式SQL应用。但本实验主要介绍SQL语言嵌入到第三代过程式高级语言(如C、COBOL、FORTRAN等)中的使用情况。不同数据库系统一般都提供能嵌入SQL命令的高级语言,并把其作为应用开发工具之一。如SQLServer支持的嵌入式ANSIC;UDB/400支持的RPGⅣ、ILECOBOL/400、PL/1等;Oracle支持的Pro*C等。本实验主要基于sqlserver支持的Pro*C中嵌入了SQL命令实现的简易数据库应用系统——“学生学习管理系统”来展开的。实验示例Sqlserver支持的详细语法等请参阅Oracle网站提供的帮助资料。这里只是示范性介绍对数据库数据进行插入、删除、修改、查询、统计等的基本操作的具体实现,通过一个功能的示范与介绍能体现出用嵌入式C实现一个简单系统的概况。数据库原理与应用实验指导26.1应用系统背景情况应用系统开发环境是:采用sqlserver2005,具体包括:(1)编译与连接工具:VC98编译器。(2)子语言:MSSQLServer嵌入式SQL。(3)数据库管理系统:sqlserver2005、sqlserver2008。(4)源程序编辑环境:文本编辑器,如记事本或其它源程序编辑器。(5)运行环境:MSDOS或MSDOS子窗口。本应用系统也可采用其它大型数据库系统所提供的嵌入式第三代语言环境的。6.2系统的需求与总体功能要求为简单起见,假设该学生学习管理系统要处理的信息只涉及到学生、课程与学生选课方面的信息。为此,系统的需求分析是比较简单明了的。本系统只涉及学生信息、课程信息及学生选修课程信息等。本系统功能需求有:(1)在sqlserver中,建立各关系模式对应的库表并初始化各表,确定各表的主键、索引、参照完整性、用户自定义完整性等。(2)能对各库表提供输入、修改、删除、添加、查询、打印显示等基本操作。(3)能明细实现如下各类查询:1)能查询学生基本情况、能查询学生选课情况及各课考试成绩情况;2)能查询课程基本情况、能查询课程学生选修情况、能查询课程成绩情况;3)能实现动态输入SQL命令查询。(4)能统计实现如下各类查询:1)能统计学生选课情况及学生的成绩单(包括总成绩、平均成绩、不及格门数等)情况;2)能统计课程综合情况、能统计课程选修综合情况如课程的选课人数、最高、最低、平均成绩等、能统计课程专业使用状况;3)能动态输入SQL命令统计。(5)用户管理功能,包括用户登陆、注册新用户、更改用户密码等功能。(6)所设计系统采用MSDOS操作界面,按字符实现子功能切换操作。系统的总体功能安排如系统功能菜单所示:0-exit.1-创建学生表7-修改学生记录d-按学号查学生i-统计某学生成绩2-创建课程表8-修改课程记录e-显示学生记录j-学生成绩统计表3-创建成绩表9-修改成绩记录f-显示课程记录k-课程成绩统计表4-添加学生记录a-删除学生记录g-显示成绩记录l-通用统计功能5-添加课程记录b-删除课程记录h-学生课程成绩表m-数据库用户表名6-添加成绩记录c-删除成绩记录n-动态执行SQL命令实验6嵌入式SQL应用36.3系统概念结构设计与逻辑结构设计1、数据库概念结构设计本简易系统的E-R图(不包括登录用户实体)如图7-1所示。学生课程mn选修学号姓名性别年龄所在系学分课程号课程名先修课号成绩图7-1系统E-R图2、数据库逻辑结构设计(1)数据库关系模式按照实体-联系图转化为关系模式的规则,本系统的E-R图可转化为如下3个关系模式:1)学生(学号、姓名、性别、年龄、所在系)2)课程(课程号、课程名、先修课号、学分)3)选修(学号、课程号、成绩)另需辅助表:4)用户表(用户编号、用户名、口令、等级)表名与属性名对应由英文表示,则关系模式为:1)student(sno、sname、ssex、sage、sdept)2)course(cno、cname、cpno、ccredit)3)sc(sno、cno、grade)4)users(uno、uname、upassword、uclass)(2)数据库及表结构的创建设本系统使用的数据库名为xxgl,根据已设计出的关系模式及各模式的完整性的要求,现在就可以在sqlserver数据库系统中实现这些逻辑结构。下面是创建数据库及其表结构的PL/SQL命令:CREATETABLEstudent(snochar(5)NOTnullprimarykey,snamechar(6)null,ssexchar(2)null,数据库原理与应用实验指导4sageintnull,sdeptchar(2)null);CREATETABLEsc(snochar(5)NOTnull,cnochar(1)NOTnull,gradeintnull,primarykey(sno,cno),foreignkey(sno)referencesstudent(sno),foreignkey(cno)referencescourse(cno));CREATETABLEcourse(cnochar(1)NOTnullprimarykey,cnamechar(10)null,cpnochar(1)null,ccreditintnull);CREATETABLEusers(unochar(6)NOTNULLPRIMARYKEY,unameVARCHAR(10)NOTNULL,upasswordVARCHAR(10)NULL,uclasschar(1)DEFAULT('A'));6.4典型功能模块介绍1、数据库的连接(CONNECTION)数据库的连接在main()主程序中(篇幅所限,可能牺牲程序格式)main(intargc,char**argv,char**envp){intnum=0,nRet;charfu[2];EXECSQLBEGINDECLARESECTION;//用于连接的主变量说明VARCHARusername[10],password[10],server[10];EXECSQLENDDECLARESECTION;//installEmbeddedSQLforCerrorhandlerEXECSQLWHENEVERSQLERRORDOsql_error(Oracle错误--\n);printf(SampleEmbeddedSQLforCapplication\n);//getinfoforCONNECTTOstatement,输入用户名、口令以及服务器名printf(\n输入用户名:);gets(username.arr);username.len=(unsignedshort)strlen((char*)username.arr);printf(\n输入口令:);gets(password.arr);password.len=(unsignedshort)strlen((char*)password.arr);printf(\n输入服务器名:);gets(server.arr);实验6嵌入式SQL应用5server.len=(unsignedshort)strlen((char*)server.arr);/*连接到Oracle服务器上*/EXECSQLCONNECT:usernameIDENTIFIEDBY:passwordUSING:server;if(sqlca.sqlcode==0){printf(ConnectiontoSQLServerestablished\n);}else{//problemconnectingtoSQLServerprintf(ERROR:ConnectiontoSQLServerfailed\n);return(1);}if(check_username_password()==0){for(;;){//循环显示菜单,并调用功能子程序printf(Pleaseselectonefunctiontoexecute:\n\n);printf(0--exit.\n);printf(1--创建学生表7--修改学生记录d--按学号查学生i--统计某学生成绩\n);printf(2--创建课程表8--修改课程记录e--显示学生记录j--学生成绩统计表\n);printf(3--创建成绩表9--修改成绩记录f--显示课程记录k--课程成绩统计表\n);printf(4--添加学生记录a--删除学生记录g--显示成绩记录l--通用统计功能\n);printf(5--添加课程记录b--删除课程记录h--学生课程成绩表m--数据库用户表名\n);printf(6--添加成绩记录c--删除成绩记录n--动态执行SQL命令\n);printf(\n);fu[0]='0';scanf(%s,&fu);if(fu[0]=='0')break;if(fu[0]=='1')create_student_table();//含各种嵌入式SQL命令的子系统if(fu[0]=='2')create_course_table();if(fu[0]=='3')create_sc_table();if(fu[0]=='4')insert_rows_into_student_table();if(fu[0]=='5')insert_rows_into_course_table();if(fu[0]=='6')insert_rows_into_sc_table();if(fu[0]=='7')current_of_update_for_student();if(fu[0]=='8')current_of_update_for_course();数据库原理与应用实验指导6if(fu[0]=='9')current_of_update_for_sc();if(fu[0]=='a')current_of_delete_for_student();if(fu[0]=='b')current_of_delete_for_course();if(fu[0]=='c')current_of_delete_for_sc();if(fu[0]=='d')sel_student_by_sno();if(fu[0]=='e')using_cursor_to_list_student();if(fu[0]=='f')using_cursor_to_list_course();if(fu[0]=='g')using_cursor_to_list_sc();if(fu[0]=='h')using_cursor_to_list_s_sc_c();if(fu[0]=='i')sel_student_total_grade_by_sno();if(fu[0]=='j')using_cursor_to_total_s_sc();if(fu[0]=='k')using_cursor_to_total_c_sc();if(fu[0]=='l')using_cursor_to_total_ty();if(fu[0]=='m')using_cursor_to_list_table_names();if(fu[0]=='n')dynamic_exec_sql_command();paus