数据库课程设计源代码
- 格式:doc
- 大小:33.74 KB
- 文档页数:11
python 数据库课程设计一、课程目标知识目标:1. 理解数据库的基本概念,掌握Python数据库操作的基本原理;2. 学会使用Python中的SQLite数据库,掌握基本的数据库创建、查询、更新和删除操作;3. 了解数据库的规范化和数据完整性,能够对数据库进行合理的设计。
技能目标:1. 能够独立使用Python编程实现对数据库的连接、操作和关闭;2. 能够运用SQL语句实现对数据库的增、删、改、查功能;3. 能够分析和解决数据库操作过程中遇到的问题,具备一定的数据库编程调试能力。
情感态度价值观目标:1. 培养学生对数据库技术的兴趣,激发他们探索数据世界的热情;2. 培养学生的团队协作精神,使他们学会在项目中进行有效沟通和分工合作;3. 培养学生具备良好的数据伦理意识,尊重和保护个人隐私。
本课程针对高年级学生,结合Python编程和数据库知识,注重实践操作和实际应用。
通过本课程的学习,使学生掌握Python数据库操作技能,培养他们解决实际问题的能力,同时提高他们的团队协作和数据伦理素养。
课程目标具体、可衡量,便于教学设计和评估。
二、教学内容1. 数据库基本概念:数据库的定义、分类及用途;关系型数据库和非关系型数据库的特点;SQL语言的基本概念和用法。
教材章节:第一章 数据库概述2. Python数据库操作:SQLite数据库的安装与使用;Python中数据库连接、游标对象的创建与操作;基本的SQL语句(SELECT、INSERT、UPDATE、DELETE)在Python中的实现。
教材章节:第二章 Python数据库操作3. 数据库设计:数据库规范化理论;实体-关系模型;数据完整性约束;关系数据库设计方法。
教材章节:第三章 数据库设计4. 数据库编程实践:项目案例分析与实现;数据库操作综合应用;团队协作完成项目任务。
教材章节:第四章 数据库编程实践5. 数据库安全与伦理:数据库安全策略;数据备份与恢复;数据隐私保护;数据伦理原则。
数据库课程设计-图书管理系统-附源代码(总54页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March毕业设计(论文)( 2013 届本科)题目:图书馆管理系统学院:信息学院专业:信息管理与信息系统班级:姓名:学号:指导教师:2013年 6 月目录1 绪论 ......................................................................................................................... 错误!未定义书签。
课题背景 ..................................................................................................... 错误!未定义书签。
本课题研究的意义和目的.......................................................................... 错误!未定义书签。
2 图书馆管理系统的分析.......................................................................................... 错误!未定义书签。
现状分 ......................................................................................................... 错误!未定义书签。
可行性分析 ................................................................................................. 错误!未定义书签。
xml课程设计报告源代码一、课程目标知识目标:1. 让学生掌握XML(可扩展标记语言)的基本概念,理解其语法结构和文档类型定义(DTD);2. 帮助学生学会使用XML编写和解析数据,并能将其应用于实际项目中;3. 引导学生了解XML与数据库、网络服务等技术的关联,拓展知识视野。
技能目标:1. 培养学生运用XML编写和修改文档的能力;2. 提高学生使用XML解析器进行数据解析的技能;3. 培养学生将XML技术应用于实际问题的解决能力。
情感态度价值观目标:1. 激发学生对计算机编程和数据分析的兴趣,培养其主动学习和探究的精神;2. 培养学生具备良好的团队合作意识,学会与他人共同解决问题;3. 增强学生的信息素养,使其认识到XML在现代信息技术中的重要性。
本课程针对高年级学生,课程性质为理论与实践相结合。
在教学过程中,需注重对学生实际操作能力的培养,同时结合学生特点和教学要求,将课程目标分解为具体的学习成果。
教学设计和评估将以此为基础,确保学生能够达到预期学习效果。
二、教学内容1. XML基本概念与语法- XML定义与作用- XML声明与文档结构- 元素、属性、实体与命名空间2. 文档类型定义(DTD)- DTD的基本概念与用途- DTD规则的编写与引用- 验证XML文档与DTD的一致性3. XML解析技术- DOM解析与SAX解析原理- 使用DOM4J解析XML文档- 使用JAXP和JDOM解析XML文档4. XML与数据库- XML与数据库的关联- 使用XML进行数据库数据的导入导出- XML数据查询与更新5. XML应用案例- XML在Web服务中的应用- XML在移动开发中的应用- XML在数据交换与存储中的应用教学内容按照上述五个方面进行组织,确保学生能够系统地学习和掌握XML 技术。
教学大纲将明确教学内容安排和进度,关联课本相应章节,如:- XML基本概念与语法:第1章- 文档类型定义(DTD):第2章- XML解析技术:第3章- XML与数据库:第4章- XML应用案例:第5章三、教学方法为了提高教学效果,激发学生的学习兴趣和主动性,本课程将采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言和形象的比喻,对XML的基本概念、语法、DTD等理论知识进行讲解,帮助学生建立扎实的理论基础。
高校程序设计课程设计源代码与文档范例源代码与文档范例在高校的程序设计课程中,学生们通常需要进行项目设计和编码实现。
正确编写源代码和撰写文档是一个程序开发过程中非常重要的环节。
本文将为大家提供一份高校程序设计课程设计源代码与文档的范例,以供参考。
源代码范例下面是一个简单的源代码范例,用Python编写一个求解斐波那契数列的函数:```pythondef fibonacci(n):if n <= 0:return "Input must be a positive integer."elif n == 1:return 0elif n == 2:return 1else:fib_list = [0, 1]for i in range(2, n):fib_list.append(fib_list[i-1] + fib_list[i-2])return fib_list[n-1]# 测试代码n = 10print(f"The {n}th fibonacci number is: {fibonacci(n)}")```上述代码定义了一个名为fibonacci的函数,用于计算斐波那契数列中的第n个数。
代码中使用了循环和列表等基本编程概念,力求简洁明了。
同时,还包含了测试代码,用于验证函数的正确性。
文档范例除了源代码外,编写完善的文档也是程序设计中必不可少的一部分。
下面是一个文档范例,包含了对上述源代码的说明和使用指南:```# 斐波那契数列计算器## 简介本程序用于计算斐波那契数列中的第n个数。
## 源代码```pythondef fibonacci(n):if n <= 0:return "Input must be a positive integer."elif n == 1:return 0elif n == 2:return 1else:fib_list = [0, 1]for i in range(2, n):fib_list.append(fib_list[i-1] + fib_list[i-2])return fib_list[n-1]```## 使用方法用户需要提供一个正整数n作为输入参数,函数将返回斐波那契数列中的第n个数。
信息工程学院课程设计报告设计名称:数据库课程设计姓名:学号:专业班级:系(院):设计时间:设计地点:指导老师:userName Varchar(16) Not null(主键) 用户名userPassword Varchar(16) Not null 密码userPurview Varchar(8) null 用户权限4 关系图4-15 物理设计数据库物理设计阶段的任务是根据具体计算机系统(DBMS和硬件等)的特点,为给定的数据库模型确定合理的存储结构和存取方法。
所谓的“合理”主要有两个含义:一个是要使设计出的物理数据库占用较少的存储空间,另一个对数据库的操作具有尽可能高的速度。
主要体现在后者。
(1)建立索引:①对课程表在Cno属性列上建立聚集索引,在Cname,Ccredt,Csemester,Cperiod属性列上建立非聚集索引。
②对学生表在Sno属性列上建立聚集索引,在Sname,Ssex,Sage,Sdept属性列上建立非聚集索引③对成绩表在Cno,Sno属性列上建立聚集索引,在grade属性列上建立非聚集索引④对用户表在userName属性列上建立聚集索引,在userPassword,userPurview属性列上建立非聚集索引(2)存储结构确定数据库的存储结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、日志、备份等的存储安排与存储结构,以与确定系统存储参数的配置。
将日志文件和数据库对象(表、索引等)分别放在不同的磁盘可以改进系统的性能。
所以系统将日志文件和数据文件存放在不同磁盘上。
6.数据库建立(1)创建数据库图10-2学生选课系统登录界面图登陆代码为:try{DataBase db = new DataBase();DataSet ds = new DataSet();string sqlStr = "select userPassword,userPurview from 用户表 where userName='" + txtuserName.Text.Trim() + "'"; ds = db.GetDataFormDB(sqlStr);string str1, str2,str3;str1 = ds.Tables[0].Rows[0].ItemArray[0].ToString().Trim();str3 = ds.Tables[0].Rows[0].ItemArray[1].ToString().Trim();str2 = txtPassWord.Text.Trim();if (str1 == str2){if (str3 == comboBox1.Text.ToString().Trim()){Form2 ob_Form2 = new Form2();erInfo[0] = txtuserName.Text.Trim();erInfo[1] = ds.Tables[0].Rows[0].ItemArray[1].ToString();ob_Form2.Show();this.Hide();}else{MessageBox.Show("用户权限错误,请重新输入");comboBox1.Text = "";comboBox1.Focus();}}else{MessageBox.Show("用户名或密码错误,请重新输入");txtuserName.Text = "";txtPassWord.Text = "";txtuserName.Focus();}}catch{MessageBox.Show("用户名或密码错误","错误");}②学生选课系统主界面如图10-3略图10-3学生选课系统主界面③学生信息管理界面如图10-4图10-4学生信息管理界面可以进行学生信息的添加、修改、删除操作。
好的,我可以为你提供一个简单的数据库课程设计源码的示例。
请注意,以下代码只是一个简单的示例,仅供参考。
你可以根据具体的需求和实际情况进行修改和扩展。
数据库设计目的:创建一个简单的课程管理系统,包括学生、教师、课程和成绩等数据。
数据库结构1. 学生表(students):* student_id(学生ID):主键* name(学生姓名)* age(学生年龄)* major(所学专业)2. 教师表(teachers):* teacher_id(教师ID):主键* name(教师姓名)* department(所属部门)3. 课程表(courses):* course_id(课程ID):主键* course_name(课程名称)* teacher_id(教师ID,外键,关联教师表)* course_desc(课程描述)4. 成绩表(grades):* grade_id(成绩ID):主键* student_id(学生ID,外键,关联学生表)* course_id(课程ID,外键,关联课程表)* grade(成绩)数据库操作函数实现:1. 学生添加、修改和删除操作:需要先通过学号对学生信息进行查询,然后更新数据库中的数据。
函数示例如下:```pythondef add_student(name, age, major):# 插入学生数据到students表中pass```2. 教师添加、修改和删除操作:需要先通过姓名对教师信息进行查询,然后更新数据库中的数据。
函数示例如下:```pythondef add_teacher(name, department):# 插入教师数据到teachers表中pass```3. 课程添加、修改和删除操作:需要先通过课程名称对课程信息进行查询,然后更新数据库中的数据。
函数示例如下:```pythondef add_course(course_name, teacher_id, course_desc):# 插入课程数据到courses表中,关联教师数据和课程描述信息需要调用关联表的添加方法来实现。
算法与数据结构课程设计报告设计题目:专业班级学生学号指导教师2014年第1学期第一部分:需求分析1、系统名称:航空客运订票系统航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。
要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
2、要求:(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。
(2)作为模拟系统,全部数据可以只存放在内存中。
(3)通过此系统可以实现如下功能:①录入功能:可以录入航班情况②查询功能:根据客户提供的终点站名进行查询,可以输出以下信息:航班号、飞机号、星期几飞行和余票量等。
也可以根据航班号,查询飞机某个航线的情况。
③订票功能:根据客户提出的要求(姓名、终点站名、订票数量)查询该航班的余票量情况。
如尚有足够的余票,则为客户办理订票手续;若已满员或余票量少于订票数量,则需要重新询问客户要求,如需要,可登记排队候补。
④退票功能:根据客户提供的情况(姓名、日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续。
第二部分:系统设计图样一:设计说明1:添加航班:整个航班的信息保存在一个结构体flight中,采用结构体数组,每一个航班信息包含航班号、起飞时间、起飞城市、降落时间、降落城市、余票数量。
航班信息通过lulu()函数进行添加。
添加的信息保存在航班flight结构体数组中。
2:查询航班:查询板块分为两个部分,按姓名查找和按站名查找。
按姓名查找:通过所输入的姓名和已定客户的姓名相匹配,匹配成功则查找成功。
按站名查找:通过所输入的起始站名和终点站名进行匹配,匹配成功则查找成功。
3:订票功能:根据用户的姓名和航班号进行订票,如果所查找的航班号的余票满足用户需要的票数,则订票成功,该信息保存在Customer中,才用结构体数组,包含已定客户的姓名、客户ID、订的票数、起飞时间、起飞城市、降落时间、降落城市、航班号。
系统建设详细设计1.数据库设计管理员用户表信息:学生用户表:学生信息表:班级文本50 所在班级专业文本50 所学专业2 系统程序文件设计与编写与数据库连接的代码:<% db="message.mdb"set Conn=server.createobject("adodb.Connection")conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&server.mappath(db)%>登陆界面代码:代码为:<!--#include file="conn.inc" --><%if request("Submit")<>"" thenset rs=server.createobject("adodb.recordset")sql="SELECT username,password from users where username='"&request("username")&"'"rs.open sql,conn,1,3if rs.bof and rs.eof thenmsg="错误:用户名不存在"elseif rs("password")=request("password") thenSession("admin")=trueresponse.redirect "index.asp?users=admin"elsemsg="错误:密码不正确"end ifend ifrs.closeset rs=nothingConn.closeSet conn = Nothingend if%><html><head><title>管理员</title><script language="JavaScript" type="text/JavaScript"><!--function MM_jumpMenu(targ,selObj,restore){ //v3.0eval(targ+".location='"+selObj.options[selObj.selectedIndex].va lue+"'");if (restore) selObj.selectedIndex=0;}//--></script><LINK href="style.css" rel=Stylesheet type=text/css></head><center><span class="style1”>学生信息管理系统</span></center></td></tr><tr><td colspan="2"><center>管理员:<input name="username" type="text" maxlength="10">密码:<input name="password" type="password" > <input type="submit" name="Submit" value="登录"><input type="reset" name="Submit2" value="重置">用户类型:<select name="menu1" onChange="MM_jumpMenu('parent',this,0)"><option value="admin_login.asp" selected>管理员</option><option value="student_login.asp">学生</option></select> <br> <fontcolor=red><%=msg%></font> </center> </td></tr></table></form></body></html>显示信息:代码为:<!--#include file=”conn.inc”<%if Session(“admin”)<>true and Session(“student”)<>true then Response.Redirect “student_login.asp”end if%><!doctype html public “-//W3C//DTD HTML 4.0 Transitional//EN”><html><head><title>学生信息</title><LINK href=”style.css” rel=Stylesheet type=text/css></style></head><table align=center><tr><td colspan=”2”><center><span class=”style1”>学生信息管理系统</span></center></td></tr><tr><td colspan=”5”><a href=”#”>[<b>首页</b>]</a><a href=”search.asp”>[查询]</a><a title=”需要管理员权限”href=”post.asp”>[添加]</a><a href=”admin_login.asp”>[管理]</a><a href=”logout.asp”>[退出]</a></td></tr></table><%users = Request(“users”)If request(“PageNo”)=”” thenPageNo=1ElsePageNo=int(request(“PageNo”))End Ifsql=”SELECT * from liuyan order by ID desc”set rs=server.createobject(“adodb.recordset”)rs.open sql,conn,1,3if not(rs.eof and rs.bof) thenrs.Pagesize=3rs.absolutepage=PageNox = 0For x = 1 to rs.Pagesizeif x mod 2 thentr_color=”#EBEBEB”elsetr_c olor=”#ffffff”end ifIf rs.eof thenExit ForElseif isNull(Rs(“Dateandtime”)) thenstrDateandtime = “”elsestrDateandtime = Cstr(Rs(“Dateandtime”))end if‘Username,Email,Content,Sex,DateandtimeResponse.Write “<tabl e width=50% border=0 align=center cellpadding=0 cellspacing=0 bgcolor=” + tr_color+ “>”Response.Write “<tr>”Response.Write “<td width=20% nowrap>姓名:</td>”Response.Write “<td width=60% class=Tab>” + Rs(“Username”) + “</td>”‘修改删除链接if us ers = “admin” thenResponse.Write “<td width=20% class=Tab align=right>” + “<a href=post.asp?users=” + users + “&id=” + cstr(Rs(“ID”)) + “><font color=blue>修改</font></a> <a href=delete.asp?users=” + users + “&id=”+ cstr(Rs(“ID”)) + “><font color=blue>删除</font></a>” + “</td>”elseResponse.Write “<td width=20% class=Tab></td>”end ifResponse.Write “</tr>”Response.Write “<tr>”Response.Write “<td>性别:</td>”Response.Write “<td colspan=2>” + Rs(“Sex”) + “</td>”Response.Write “</tr>”Response.Write “<tr>”Response.Write “<td>班级:</td>”Response.Write “<td colspan=2>” + Rs(“Class”) + “</td>”Response.Write “</tr>”Response.Write “<tr>”Response.Write “<td>专业:</td>”Response.Write “<td colspan=2>” + Rs(“Major”) + “</td>”Response.Write “</tr>”Response.Write “<tr>”Response.Write “<td>入学时间:</td>”Response.Write “<td colspan=2>” + strDateandtime + “</td>”Response.Write “</tr>”Response.Write “<tr>”Response.Write “<td>评语:</td>”Response.Write “<td colspan=2>” + Rs(“Content”) + “</td>”Response.Write “</tr>”Response.Write “<tr>”Response.Write “<td>E-mail:</td>”Response.Write “<td colspan=2>” + Rs(“Email”) + “</td>”Response.Write “</tr>”Response.Write “</table>”Response.Write “<table border=0 align=center>”‘if users = “admin” then‘Response.Write “<tr>”‘Response.Write “<td align=right bgcolor=”+ tr_color+ “><a href=delete.asp?users=”+ users + “&id=”+ cstr(Rs(“ID”)) + “><font color=red>删除</font></a></td>”‘Response.Writ e “</tr>”‘end ifResponse.Write “<tr>”Response.Write “<td height=1></td>”Response.Write “</tr>”Response.Write “</table>”rs.MoveNextEnd IfNext。
学生选课系统数据库设计代码设计一个学生选课系统的数据库涉及多个方面,包括定义表结构、创建关系和索引等。
下面是一个简化版的MySQL数据库设计代码,该代码旨在支持一个基础的学生选课系统。
首先,我们定义三个基本表:学生、课程和选课记录。
sql复制代码-- 创建学生表CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE NOT NULL,password VARCHAR(255) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);-- 创建课程表CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(100) NOT NULL,description TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);-- 创建选课记录表CREATE TABLE course_enrollments (id INT PRIMARY KEY AUTO_INCREMENT,student_id INT,course_id INT,enrollment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (student_id) REFERENCES students(student_id),FOREIGN KEY (course_id) REFERENCES courses(course_id));这个设计非常基础,并且可以根据实际需求进行扩展。
例如,你可能需要添加更多的字段到学生和课程表中,如地址、电话号码、课程学分等。
//选择一种高级语言实现下列语句的功能。
//CREATE TABLE <表名> (<列名><数据类型>[<列完整性约束条件>][,<列名><数据//类型>[<列完整性约束条件>]…][,<表完整性约束条件>] )//ALTER TABLE <表名> [ADD <新列名><数据类型>[<列完整性约束>]] [DROP<列完整//性约束名>][MODIFY <列名><数据类型>]//使用说明//1、将程序文件table.sql放在D盘根目录下。
//2、在C盘根目录下建立一个名为"数据库"的文件夹,用于存储表。
//3、建立的表存储路径为C:\数据库:\table.dbf。
//4、在程序文件table.sql中只有一条建表语句和三条修改表语句,在以程序方式执//行时注意执行的次数,慎重选择“是否继续执行”。
//5、程序输入的SQL语句格式如下://create table student//(//SNO int PRIMARY KEY,//SNAME char(10) UNIQUE,//SAGE int,//SDEPT char(20) NOT NULL,//COURSE char(20),//GRADE int//);//alter table student add CNO int NOT NULL;//alter table student alter column SAGE short;//alter table student drop SDEPT;#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>//宏定义#define YEAR 0#define MONTH 1#define DAY 2#define FOX_VERISON_INFO 262#define MAX 40//字段类型#define DATE 0x44#define DOUBLE 0x45#define FLOAT 0x46#define SHORT 0x47#define INT 0x48#define TRUE 1#define FALSE 0//文件头结构体定义struct DbfHead{char dbFlag;char year;char month;char day;int recCounts;short firstRecAddr;short recLen;char undo[20];};typedef struct DbfHead DbfHead, *pDbfHead; //字段描述结构体定义struct FieldDcp{char fieldName[10];char undo1;char fieldType;short offset;char undo2[2];char fieldLen;char numDecis;char undo3[14];};typedef struct FieldDcp FieldDcp, *pFieldDcp; //字段数据结构体定义struct DbfField{char *fieldData;char fieldName[10];char fieldType;char fieldLen;char fieldDcis;short offset;};typedef struct DbfField DbfField, *pDbfField; //记录结构体定义struct DbfRecchar delFlag;DbfField field[MAX];int realCounts;};typedef struct DbfRec DbfRec, *pDbfRec;//dbf文件句柄定义struct DbfHand{char filename[50];DbfHead header;DbfRec rec;long curRecNo;long curFpAddr;FILE *fd;};typedef struct DbfHand DbfHand, *pDbfHand;//约束条件typedef struct Condition{int flag;//flag 用于区分约束条件(PARIMARY KEY 1 UNIQUE 2 NOT NULL 3) }Condition;pDbfHand f;DbfRec rec;char table_name[20];char sql[300],sql1[300];char GetDate(int getMode)//获取日期{if( DAY ==getMode)return 01;if(MONTH == getMode)return 06;if(YEAR == getMode)return 10;elseexit(0);}short GetHeadLength(pDbfRec rec)//获得文件头长度{return rec->realCounts*32+32+2;}short GetRecLength(pDbfRec rec)//获得文件体长度register int i=0;int count=0;for(i=0;i<rec->realCounts;i++){if(rec->field[i].fieldType=='D'){count+=8;continue;}else if(rec->field[i].fieldType=='I'){count+=4;continue;}else if(rec->field[i].fieldType=='T'){count+=6;continue;}count+=rec->field[i].fieldLen;}return count+1;}pDbfHand NewDbfHead(pDbfHand hand, pDbfRec rec)//新建文件头{int ret = -1;hand-> header.dbFlag = 0x03;hand-> header.day = GetDate(DAY);hand-> header.month = GetDate(MONTH);hand-> header.year = GetDate(YEAR);hand-> header.recLen = GetRecLength(rec);hand-> header.recCounts = 0;hand-> header.firstRecAddr = GetHeadLength(rec);if (0!= fseek(hand-> fd, 0, SEEK_SET))return NULL;ret = fwrite((char*)&hand->header,sizeof(DbfHead) , 1 , hand->fd);if(ret != -1)return hand;elsereturn NULL;}pDbfHand UpdateHead(pDbfHand hand)//更新文件头{if (0!= fseek(hand-> fd, 0, SEEK_SET))return NULL;if (-1== fwrite((char *)&hand-> header, sizeof(DbfHead) , 1 , hand->fd)) return NULL;fclose(hand->fd);return hand;}pDbfHand WriteFieldDicsribe(pDbfHand hand, pDbfRec rec)//写字段描述部分{int i = 0;FieldDcp field={0};field.offset = 0x01;for ( i = 0; i < rec-> realCounts; i++){field.fieldType = rec-> field[i].fieldType;field.numDecis = 0;switch ( field.fieldType){case DOUBLE:field.fieldLen = 8;break;case FLOAT:field.fieldLen = 4;break;case INT:field.fieldLen = 4;break;case SHORT:field.fieldLen = 2;break;default:field.fieldLen = rec-> field[i].fieldLen;break;}strcpy(field.fieldName, rec-> field[i].fieldName);field.offset +=( short)rec-> field[i].fieldLen;if(-1 ==fwrite((char*)&field, sizeof(FieldDcp) , 1 , hand->fd))return NULL;}hand-> rec.delFlag = 0x20;hand-> rec.realCounts = rec-> realCounts;for (i = 0; i < rec-> realCounts; i++ )hand-> rec.field[i] = rec-> field[i];return hand;void WriteFieldEnd(pDbfHand hand)//写文件头结束标志{int i = 0;char buf[2] = {0x0D, 0x00};char versionBuf[FOX_VERISON_INFO] = {0};if (0 == fseek(hand-> fd, 0, SEEK_END)){if (-1== fwrite(buf, 2 , 1 , hand->fd))return;}return ;}pDbfHand ReadDbfHead(pDbfHand hand)//读文件头信息{int i=0,j=0;if (-1 != (fseek(hand-> fd, 0, SEEK_SET))){if (0 != fread((char*)&hand-> header, 32 , 1 , hand->fd))return hand;}return NULL;}int GetFieldCount(pDbfHand hand)//得到字段个数{int i = 0;int offset = 1;FieldDcp field ={0};char cEnd = 0;for (i=0;i<MAX;i++){memset((char *)&field,0,sizeof(FieldDcp));if ( -1 == fseek(hand-> fd, (i+1)*32, SEEK_SET))return -1;if ( 0 != fread((char*)&field, 32 , 1 , hand->fd)){fread(&cEnd,1 , 1 , hand->fd);if (0x0D == cEnd)return (i + 1);}}return -1;}pDbfHand ReadFieldDiscribe(pDbfHand hand)//读字段描述信息int i = 0,j=0;int fieldCount = GetFieldCount(hand);hand-> rec.realCounts = fieldCount;for ( i = 0; i < hand-> rec.realCounts; i++){FieldDcp field = {0};if (-1 == fseek(hand-> fd, (i+1)*32, SEEK_SET))return NULL;if (-1 == fread((char*)&field, 32 , 1 , hand->fd))return NULL;memcpy(hand-> rec.field[i].fieldName,field.fieldName,sizeof(field.fieldName));hand-> rec.field[i].fieldLen = field.fieldLen;hand-> rec.field[i].fieldType = field.fieldType;hand-> rec.field[i].fieldDcis = field.numDecis;hand-> rec.field[i].offset = field.offset;}for(i=0;i<hand->rec.realCounts;i++){for(j=0;hand->rec.field[i].fieldName[j]!='\0';j++){hand->rec.field[i].fieldName[j]=tolower(hand->rec.field[i].fieldName[j]);}}return hand;}char *SaveDate( char *str)//保存内容为日期时,格式华{int i=0, j=0;char temp[9]={0};if (strlen(str) != 10) //日期格式输入不合法return NULL;for ( i=0, j=0; i <10; i++ ){if ( i == 4 || i ==7 )continue;else{if(*(str+i) >= '0' && *(str+i) <= '9'){temp[j]=*(str+i);j++;}elsereturn NULL;}}str=NULL;str=( char *)realloc(str, 8);memset(str, 0x00, 8);memcpy(str, temp, 8);return str;}int WriteRecord(pDbfHand hand, pDbfRec record)//在当前位置写一条纪录,覆盖原有内容{int i = 0;char *buf = NULL;int curFieldLen = 0;int actDataLen = 0;int nPos = 1;int nFiledCount = 0;int rest = TRUE;nFiledCount = hand-> rec.realCounts;buf = ( char*)malloc(hand-> header.recLen + 1 );memset(buf,0x20,hand-> header.recLen + 1);buf[0] = ' ';for ( i = 0; i < nFiledCount; i++ ){if (hand-> rec.field[i].fieldType == DATE && record-> field[i].fieldData != NULL ) record-> field[i].fieldData = SaveDate(record-> field[i].fieldData);curFieldLen = hand-> rec.field[i].fieldLen;actDataLen = strlen(record-> field[i].fieldData);if ( actDataLen > curFieldLen)actDataLen = curFieldLen;memcpy(&buf[nPos], record-> field[i].fieldData, actDataLen);nPos += hand-> rec.field[i].fieldLen;}buf[hand-> header.recLen] = '\0 ';if ( -1 == fwrite(buf, hand-> header.recLen , 1 , hand->fd))rest = FALSE;return rest;}char *ReadDbfDate( char *str)//读日期时,格式化{int i=0, j=0;char temp[11] = {0};char *strRest = NULL;for ( i=0, j=0; i < 8; i++, j++ ){if ( i==4 || i==6){temp[j] = '/';j++;}temp[j]=*(str+i);}str = (char *)calloc(11,sizeof(char));memset(str, 0x00, 11);memcpy(str,temp,10);return str;}char *DsdStrEndSpace(char *str, int size)//去掉字符串的后面空格{int i=0,flag=0;for(i=size-1; i>= 0; i--){if (*(str+i) != 0x20)break;str[i] =0x00;}return str;}/*pDbfField GetCurrentField(pDbfHand handle, pDbfRec rec ,int fieldId)//得到当前文件{return (pDbfField)&(rec-> field[fieldId]);}*/int GetFieldNum(pDbfHand hand,char* field_name)//得到文件个数{int flag=0;int j;for(j=0;j<hand->rec.realCounts;j++){if(0==strcmp(field_name,hand->rec.field[j].fieldName)){flag=1;break;}}if(flag)return j;elsereturn -1;}int IsBottomRecord(pDbfHand hand)//判断是否是第一条记录{int recCounts = hand-> header.recCounts;if (hand-> curRecNo != hand-> header.recCounts)return FALSE;return TRUE;}int GotoTop(pDbfHand hand)//返回顶部{hand-> curRecNo = 1;hand-> curFpAddr = hand-> header.firstRecAddr;if (-1 == fseek(hand-> fd, hand-> curFpAddr, SEEK_SET))return FALSE;return TRUE;}int GotoBottom(pDbfHand hand)//移动到最后一条记录{int recLen = hand-> header.recLen;long offset = 0;offset = recLen * (hand-> header.recCounts -1);hand-> curRecNo = hand-> header.recCounts;hand-> curFpAddr = hand-> header.firstRecAddr + offset;if (-1 == fseek(hand-> fd, hand-> curFpAddr, SEEK_SET))return FALSE;return TRUE;}int GoNextRecord(pDbfHand hand)//移动到下一条记录{if (TRUE == IsBottomRecord(hand))return TRUE;else{hand-> curRecNo += 1;hand-> curFpAddr += hand-> header.recLen;if (-1 == fseek(hand-> fd, hand-> header.recLen, SEEK_CUR)) return FALSE;}return TRUE;}int GetCurRecord(pDbfHand hand,pDbfRec rec)//得到当前记录{int i = 0,m;char curFieldLen = 0;long fieldOffset = 0;char pBuffData[1024] = {0};char *recData;(*rec)=hand->rec;for(m=0;m<hand->rec.realCounts;m++){rec->field[m].fieldData=(char*)malloc(hand->rec.field[m].fieldLen+1);memset(rec->field[m].fieldData, 0x00, hand->rec.field[m].fieldLen+1);}if (-1== fseek(hand->fd,hand->curFpAddr, SEEK_SET)) //Move file pointer return 0;recData = pBuffData;recData = recData + 1;if (-1 == fread(recData,hand->header.recLen , 1 , hand->fd))return 0;rec->delFlag = recData[0];recData = recData + 1;for (i = 0; i < hand->rec.realCounts; i++, fieldOffset += curFieldLen){curFieldLen = hand->rec.field[i].fieldLen;memcpy(rec->field[i].fieldData,recData+fieldOffset,curFieldLen);rec->field[i].fieldData = DsdStrEndSpace(rec->field[i].fieldData, curFieldLen);if (rec->field[i].fieldType == DATE && rec->field[i].fieldData[0] != 0x20 ) rec->field[i].fieldData =ReadDbfDate(rec->field[i].fieldData);}return 1;}pDbfHand AddRec(pDbfHand hand, pDbfRec record)//向文件尾中插入一条记录{char dataEndFlag = 0x1A;if ((hand-> fd =fopen("c:\\数据库\\table.dbf","r+b")) == NULL)return NULL;if ( hand-> header.recCounts == 0)fseek(hand-> fd, -0L, SEEK_END);elsefseek(hand-> fd, -1L, SEEK_END);if (FALSE == WriteRecord(hand, record))return NULL;if ( -1 == fwrite(&dataEndFlag, 1 , 1 , hand->fd))return NULL;hand-> curRecNo += 1;hand-> header.recCounts += 1;hand-> curFpAddr += hand-> header.recLen;if (NULL == UpdateHead(hand))return hand;}pDbfHand AddField(pDbfHand hand,char* field_name,char type,int len,int dec)//在文件中插入一条记录{int i,reccounts;pDbfRec *rec;if(hand->header.recCounts){rec=(pDbfRec*)malloc(sizeof(pDbfRec)*hand->header.recCounts);hand->curFpAddr=hand->header.firstRecAddr;hand->curRecNo=1;if (-1 == fseek(hand-> fd,hand->curFpAddr, SEEK_SET))return FALSE;for(i=0;i<hand->header.recCounts;i++){rec[i]=(pDbfRec)malloc(sizeof(DbfRec));GetCurRecord(hand,rec[i]);GoNextRecord(hand);}for(i=0;i<hand->header.recCounts;i++){rec[i]->field[hand->rec.realCounts].fieldData=(char*)malloc(len+1);memset(rec[i]->field[hand->rec.realCounts].fieldData, 0x00, len+1);rec[i]->realCounts++;}}strcpy(hand->rec.field[hand->rec.realCounts].fieldName,field_name);hand->rec.field[hand->rec.realCounts].fieldName[strlen(field_name)]='\0';hand->rec.field[hand->rec.realCounts].fieldType=type;hand->rec.field[hand->rec.realCounts].fieldLen=len;hand->rec.field[hand->rec.realCounts].fieldDcis=dec;hand->rec.realCounts++;reccounts=hand->header.recCounts;hand->fd=fopen("c:\\数据库\\table.dbf","w");fclose(hand->fd);hand->fd=fopen("c:\\数据库\\table.dbf","w+b");if(NewDbfHead(hand, &hand->rec) == NULL)return NULL;if (NULL == WriteFieldDicsribe(hand, &hand->rec))return NULL;WriteFieldEnd(hand);if(0!=fclose(hand->fd))for(i=0;i<reccounts;i++)AddRec(hand,rec[i]);return hand;}pDbfHand AlterField(pDbfHand hand,char* field_name,char type,int len,int dec)//修改一条记录{int num,i,reccounts;pDbfRec *rec;num=GetFieldNum(hand,field_name);if(hand->header.recCounts){rec=(pDbfRec*)malloc(sizeof(pDbfRec)*hand->header.recCounts);hand->curFpAddr=hand->header.firstRecAddr;hand->curRecNo=1;if (-1 == fseek(hand-> fd,hand->curFpAddr, SEEK_SET))return FALSE;for(i=0;i<hand->header.recCounts;i++){rec[i]=(pDbfRec)malloc(sizeof(DbfRec));GetCurRecord(hand,rec[i]);GoNextRecord(hand);rec[i]->field[num].fieldDcis=dec;rec[i]->field[num].fieldLen=len;rec[i]->field[num].fieldType=type;}}hand->rec.field[num].fieldType=type;hand->rec.field[num].fieldLen=len;hand->rec.field[num].fieldDcis=dec;reccounts=hand->header.recCounts;hand->fd=fopen("c:\\数据库\\table.dbf","w");fclose(hand->fd);hand->fd=fopen("c:\\数据库\\table.dbf","w+b");if(NewDbfHead(hand, &hand->rec) == NULL)return NULL;if (NULL == WriteFieldDicsribe(hand, &hand->rec))return NULL;WriteFieldEnd(hand);if(0!=fclose(hand->fd))return NULL;for(i=0;i<reccounts;i++)AddRec(hand,rec[i]);return hand;}pDbfHand DropField(pDbfHand hand,char* field_name,int n)//删除一条记录{int num,i,j,reccounts;pDbfRec *rec;num=GetFieldNum(hand,field_name);if(hand->header.recCounts){rec=(pDbfRec*)malloc(sizeof(pDbfRec)*hand->header.recCounts);hand->curFpAddr=hand->header.firstRecAddr;hand->curRecNo=1;if (-1 == fseek(hand-> fd,hand->curFpAddr, SEEK_SET))return FALSE;for(i=0;i<hand->header.recCounts;i++){rec[i]=(pDbfRec)malloc(sizeof(DbfRec));GetCurRecord(hand,rec[i]);GoNextRecord(hand);rec[i]->field[num].fieldDcis=rec[i]->field[num+1].fieldDcis;rec[i]->field[num].fieldLen=rec[i]->field[num+1].fieldLen;rec[i]->field[num].fieldType=rec[i]->field[num+1].fieldType;num++;}}if(num==-1){for(j=0;j<10;j++)hand->rec.field[num].fieldName[j]=0;hand->rec.field[num].fieldType=0;hand->rec.field[num].fieldLen=0;hand->rec.field[num].fieldDcis=0;}else{for(;num<n;num++){strcpy(hand->rec.field[num].fieldName,hand->rec.field[num+1].fieldName);hand->rec.field[num].fieldType=hand->rec.field[num+1].fieldType;hand->rec.field[num].fieldLen=hand->rec.field[num+1].fieldLen;hand->rec.field[num].fieldDcis=hand->rec.field[num+1].fieldDcis;}}hand->header.recCounts--;reccounts=hand->header.recCounts;hand->fd=fopen("c:\\数据库\\table.dbf","w");fclose(hand->fd);hand->fd=fopen("c:\\数据库\\table.dbf","w+b");if(NewDbfHead(hand,&hand->rec) == NULL)return NULL;if (NULL == WriteFieldDicsribe(hand,&hand->rec))return NULL;WriteFieldEnd(hand);if(0!=fclose(hand->fd))return NULL;for(i=0;i<reccounts;i++)AddRec(hand,rec[i]);return hand;}pDbfHand CreateDbf(DbfRec rec)//建立DBF文件{pDbfHand hand = NULL;if ((hand = (pDbfHand)malloc(sizeof(DbfHand))) ==NULL) return NULL;memset(hand, 0x00, sizeof(DbfHand));if((hand->fd=fopen("c:\\数据库\\table.dbf","w+b"))!=NULL){if(NewDbfHead(hand, &rec) == NULL)return NULL;if(NULL == WriteFieldDicsribe(hand, &rec))return NULL;WriteFieldEnd(hand);}fclose(hand->fd);return hand;}pDbfHand OpenDbf()//打开DBF文件{pDbfHand hand = NULL;if ((hand = (pDbfHand) malloc(sizeof(DbfHand))) ==NULL) return NULL;memset(hand, 0x00, sizeof(DbfHand));if ((hand-> fd =fopen("c:\\数据库\\table.dbf","r+b")) == NULL) return NULL;if(NULL == ReadDbfHead(hand))return NULL;if(NULL == ReadFieldDiscribe(hand))return NULL;GotoTop(hand);return hand;}void ShowBeginning(){printf("+----------------------------------------------------------------------------+\n");printf("||\n");printf("| 欢迎进入SQL系统|\n");printf("||\n");printf("+----------------------------------------------------------------------------+\n");}void Show(){printf(" 输入语句格式如下:\n");printf(" create table student\n");printf(" (\n");printf(" SNO int PRIMARY KEY,\n");printf(" SNAME char(10) UNIQUE,\n");printf(" SAGE int,\n");printf(" SDEPT char(20) NOT NULL,\n");printf(" COURSE char(20),\n");printf(" GRADE int\n");printf(" );\n");printf(" alter table student add CNO int NOT NULL;\n");printf(" alter table student alter column SAGE short;\n");printf(" alter table student drop SDEPT;\n");}int Read()//用于读取从键盘键入的SQL语句{char c;int i,j;printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++\n");printf("请输入SQL语句:\n\n");for(i=0;(c=getch())!=';';i++){if(c==27)exit(0);if(c==8){i-=2;if(i<-1)i=-1;system("cls");Show();printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++\n");printf("请输入SQL语句:\n\n");for(j=0;j<=i;j++){if(sql1[j]==13){puts("");}printf("%c",sql1[j]);}continue;}sql1[i]=c;if(c==13){puts("");sql[i]=' ';}else if(c=='('||c==')'||c=='\''){printf("%c",c);sql[i]=' ';}else{printf("%c",c);sql[i]=c;}}sql[i]=';';sql[i+1]='\0';printf(";");puts("");return 0;}int position;//文件指针的位置int Read1()//用于读取从程序文件中读取的SQL语句{FILE *fp;char c;int i,j;printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++\n");printf("请输入SQL语句:\n\n");fp=fopen("d:\\table.sql","r");fseek(fp,position,0);for(i=0;(c=fgetc(fp))!=';';i++){if(c==27)exit(0);if(c==8){i-=2;if(i<-1)i=-1;system("cls");Show();printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++\n");printf("请输入SQL语句:\n\n");for(j=0;j<=i;j++){if(sql1[j]==13)puts("");printf("%c",sql1[j]);}continue;}sql1[i]=c;if(c==13){puts("");sql[i]=' ';}else if(c=='('||c==')'||c=='\''){printf("%c",c);sql[i]=' ';}else{printf("%c",c);sql[i]=c;}}sql[i]=';';sql[i+1]='\0';printf(";");puts("");position=ftell(fp);return 0;}int CREATE(){char type[6][10]={"char","int","short","float","double"};char Type1[6]={'C','N','S','F','D'};FILE *fp=NULL;Condition con[MAX];//约束条件结构体int i,j,num=0,error=1;//num 字段数error输入错误标志char temp[10],condition[10];//table_name 表名condition 约束条件memset(con,0,sizeof(con[0])*MAX);//结构体中各值初始化为空for(i=0;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=';';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"create")!=0)//判断create是否写错{error=0;printf("\n你输入的'create'有误,请重新创建!\n");}else{for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=';';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"table")!=0)//判断table是否写错{error=0;printf("\n你输入的'table'有误,请重新创建!\n");}else{for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=';';i++,j++)//提取表名table_name[j]=tolower(sql[i]);table_name[j]='.'; //加后缀.dbftable_name[j+1]='d';table_name[j+2]='b';table_name[j+3]='f';table_name[j+4]='\0';do{int field_lengtf=0,flag=1;//field_lengtf 字段长度for(;sql[i]==' '||sql[i]==',';i++);if(sql[i]==';')break;for(j=0;sql[i]!=' ';i++,j++)//提取列名rec.field[num].fieldName[j]=sql[i];rec.field[num].fieldName[j]='\0';for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=',';i++,j++)//提取列数据类型temp[j]=tolower(sql[i]);temp[j]='\0';for(j=0;j<5;j++){if(strcmp(temp,type[j])==0){rec.field[num].fieldType=Type1[j];break;}}if(j==5)//列数据类型有误{error=0;printf("\n你输入的列数据类型有误(务必是char,int,short,float,double),请重新创建!\n");break;}else{/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++*/if(rec.field[num].fieldType=='C'){//如果类型是char需要提取列长度,如果是int、float则固定列长度为4,double则固定列长度为8for(;sql[i]==' ';i++);for(;sql[i]!=' ';i++)//提取长度{if(sql[i]<48||sql[i]>58)//列长度必须是数字{flag=0;break;}elsefield_lengtf=field_lengtf*10+(sql[i]-48);}if(flag==0){error=0;printf("\n你输入的列长度有误,请重新创建!\n");break;}elserec.field[num].fieldLen=field_lengtf;}else if(rec.field[num].fieldType=='N'||rec.field[num].fieldType=='F') rec.field[num].fieldLen=4;else if(rec.field[num].fieldType=='D')rec.field[num].fieldLen=8;else if(rec.field[num].fieldType=='S')rec.field[num].fieldLen=2;field_lengtf=0,flag=1;for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=','&&sql[i]!=';';i++,j++)//提取列完整性约束condition[j]=tolower(sql[i]);condition[j]='\0';if(condition[0]!=','&&condition[0]!='\0'){if(strcmp(condition,"primary")==0)//判断是否为主键{for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=',';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"key")==0)con[num].flag=1;else{error=0;printf("\n你输入的'KEY'有误,请重新创建!\n");break;}}else if(strcmp(condition,"unique")==0)//判断是否取唯一值con[num].flag=2;else if(strcmp(condition,"not")==0)//判断是否非空{for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=',';i++,j++)condition[j]=tolower(sql[i]);condition[j]='\0';if(strcmp(condition,"null")==0)con[num].flag=3;else{error=0;printf("\n你输入的约束条件'NOT NULL'有误,请重新创建!\n");break;}}else//列完整性约束出错{error=0;printf("\n你输入的约束条件有误(必须PARIMARY KEY,UNIQUE,NOT NULL),请重新创建!\n");break;}}}rec.field[num].fieldDcis=0;rec.field[num].offset=0;rec.realCounts=num+1;num++;//下一字段}while(sql[i]!=';');if((fp=fopen("d:\\student.dat","w+b"))==NULL)//将列完整性约束条件写入文件中{printf("打开文件失败!\n");error=0;}fwrite(&con,sizeof(Condition)*num,1,fp);fclose(fp);fp=NULL;}}if(error==0){memset(sql,0,sizeof(char)*300);//出错时清空输入的语句return 0;}else{if(f!=CreateDbf(rec))//建立.dbf文件return 1;elsereturn 0;}return 1;}int ALTER(){char type[6][10]={"char","int","short","float","double"};char Type1[6]={'C','N','S','F','D'};FILE *fp;int i,j,num,error=1;char T; //列数据类型的简写Condition con[MAX];//约束条件结构体char temp[10],field_name[10],f_type[10],condition[10];// field_name 列名f_type 列数据类型memset(&con,0,sizeof(con));//结构体中各值初始化为空for(i=0;sql[i]==' ';i++);for(j=0;sql[i]!=' ';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"alter")!=0)//判断alter是否写错{error=0;printf("\n你输入的'alter'有误,请重新输入SQL语句!\n");}else{for(;sql[i]==' ';i++);for(j=0;sql[i]!=' ';i++,j++)temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"table")!=0)//判断table是否写错{error=0;printf("\n你输入的'table'有误,请重新输入SQL语句!\n");}else{for(;sql[i]==' ';i++);for(j=0;sql[i]!=' ';i++,j++)//提取表名table_name[j]=tolower(sql[i]);table_name[j]='.'; //加后缀.dbftable_name[j+1]='d';table_name[j+2]='b';table_name[j+3]='f';table_name[j+4]='\0';if((f=OpenDbf())==0) //判断该表是否存在{printf("\n你输入的表%s不存在,请重新输入SQL语句!\n",table_name);error=0;}else{for(;sql[i]==' ';i++);if(tolower(sql[i])=='a')//增加属性{for(j=0;sql[i]!=' ';i++,j++)//判断add是否写错temp[j]=tolower(sql[i]);temp[j]='\0';if(strcmp(temp,"add")==0){int field_lengtf=0,flag=1; //field_lengtf 列长度for(;sql[i]==' ';i++);for(j=0;sql[i]!=' ';i++,j++)//提取添加的列名field_name[j]=sql[i];field_name[j]='\0';for(;sql[i]==' ';i++);for(j=0;sql[i]!=' '&&sql[i]!=';';i++,j++)//提取列数据类型f_type[j]=tolower(sql[i]);f_type[j]='\0';for(j=0;j<5;j++){if(strcmp(f_type,type[j])==0){T=Type1[j];break;}。
use kjq111007307/*创建一个部门信息表包含“部门号,部门名,部门经理,人数”属性列*/create table department(depart_no char(2)primary key,depart_name char(30)not null,depart_manage char(6)not null,depart_people int not null)/*创建一个职位信息表包含“职位,基本薪资,福利,失业保险,住房公积金”属性列*/create table position(pos char(30)primary key,basesalary float not null,benefits float not null,insurances float not null,housing_funds float not null)/*创建一个职工信息表包含"职工号,职工名,性别,年龄,学历,部门号,职位"属性列*/create table staff_message(staff_no char(4)primary key,staff_name char(10)not null,staff_sex char(2)check(staff_sex in('男','女')),staff_age int not null,staff_edu char(10)not null,staff_dep char(2)not null,staff_job char(30)not null,foreign key(staff_dep)references department(depart_no),foreign key(staff_job)references position(pos))/*创建一个员工考勤表包含“职工号,年月,迟到,缺勤,加班”属性列*/create table staff_days(staff_no char(4),month_date char(6),staff_late int not null,staff_absent int not null,workoverdays int not null,primary key(staff_no,month_date))/*创建一个薪资表包含“职工号,年月,奖金,罚金,真实薪资”属性列*/create table salary(staff_no char(4),month_date char(6),addsalary float not null,subsalary float not null,relsalary float not null,primary key(staff_no,month_date))create index salary_index on salary(month_date asc,staff_no asc); /*部门表信息的录入*//*经理室*/insertinto departmentvalues('01','manage_department','王栋','1');/*财务科*/insertinto departmentvalues('02','financial_department','张鹏','3');/*技术科*/insertinto departmentvalues('03','plan_department','代淑英','5');/*销售科*/insertinto departmentvalues('04','market_department','金加容','6');/*职位表信息的录入*//*经理*/insertinto positionvalues('manager','4500','1125','-45','-36');/*副经理*/insertinto positionvalues('assistant_manager','4000','1000','-40','-32');/*办事*/insertinto positionvalues('clerk','3500','875','-35','-28');/*助理*/insertinto positionvalues('assistant','2000','500','-20','-16');/*职工信息表信息的录入*/insertinto staff_messagevalues('0101','王栋','男','38','硕士','01','manager'); insertinto staff_messagevalues('0201','张鹏','男','35','硕士','02','manager'); insertinto staff_messagevalues('0202','程雷','男','30','本科','02','clerk');insertinto staff_messagevalues('0203','王晶晶','女','29','本科','02','assistant');insertinto staff_messagevalues('0301','代淑英','女','35','硕士','03','manager');insertinto staff_messagevalues('0302','刘燕','女','30','本科','03','assistant_manager'); insertinto staff_messagevalues('0303','杨浩','男','27','本科','03','clerk');insertinto staff_messagevalues('0304','程伟','男','31','本科','03','clerk');insertinto staff_messagevalues('0305','唐琦','女','25','本科','03','assistant');insertinto staff_messagevalues('0401','金加容','女','34','本科','04','manager');insertinto staff_messagevalues('0402','吴辉','男','35','本科','04','assistant_manager'); insertinto staff_messagevalues('0403','陈睿','男','32','本科','04','clerk');insertinto staff_messagevalues('0404','万莉','女','36','本科','04','clerk');insertinto staff_messagevalues('0405','方冬雨','女','31','本科','04','clerk');insertinto staff_messagevalues('0406','陈晨','女','27','专科','04','assistant');insertinto staff_daysvalues('0101','201205','0','0','0');insertinto staff_daysvalues('0201','201205','0','0','0');insertinto staff_daysvalues('0202','201205','0','0','0');insertinto staff_daysvalues('0203','201205','0','0','0');insertinto staff_daysvalues('0301','201205','0','0','0');insertinto staff_daysvalues('0302','201205','0','0','0');insertinto staff_daysvalues('0303','201205','0','0','0'); insertinto staff_daysvalues('0304','201205','0','0','0'); insertinto staff_daysvalues('0305','201205','0','0','0'); insertinto staff_daysvalues('0401','201205','0','0','0'); insertinto staff_daysvalues('0402','201205','0','0','0'); insertinto staff_daysvalues('0403','201205','0','0','0'); insertinto staff_daysvalues('0404','201205','0','0','0'); insertinto staff_daysvalues('0405','201205','0','0','0'); insertinto staff_daysvalues('0406','201205','0','0','0'); insertinto salaryvalues('0101','201205','0','0','5544'); insertinto salaryvalues('0201','201205','0','0','5544'); insertinto salaryvalues('0202','201205','0','0','4312'); insertinto salaryvalues('0203','201205','0','0','2464'); insertinto salaryvalues('0301','201205','0','0','5544'); insertinto salaryvalues('0302','201205','0','0','4928'); insertinto salaryvalues('0303','201205','0','0','4312'); insertinto salaryvalues('0304','201205','0','0','4312'); insertinto salaryvalues('0305','201205','0','0','2464'); insertinto salaryvalues('0401','201205','0','0','5544'); insertinto salaryvalues('0402','201205','0','0','4928');insertinto salaryvalues('0403','201205','0','0','4312');insertinto salaryvalues('0404','201205','0','0','4312');insertinto salaryvalues('0405','201205','0','0','4312');insertinto salaryvalues('0406','201205','0','0','2464');/*******************触发器***********************//*创建一个触发器当修改考勤表中的加班或迟到或缺勤时,薪资表中的数据有自动更新的功能*/ create trigger xinzi1on staff_daysfor updateas/*定义三个变量late,absent,overdays当考勤表有更新时用来记录新的数据*/declare @late int,@absent int,@overdays int/*给变量赋值*/select @late=staff_late from insertedselect @absent=staff_absent from insertedselect @overdays=workoverdays from inserted/*定义变量来记录组成最终真实薪资的各项薪资*/declare @kkbasesalary float,@kkaddsalary float,@kksubsalary float,@kkbenefits float,@kkinsurances float,@kkhousing_funds float,@kkrelsalarys float/*给组成最终真实薪资的各项薪资赋值*/select @kkbasesalary=(select basesalaryfrom positionwhere pos=(select staff_jobfrom staff_messagewhere staff_no=(select staff_no from inserted)))select @kkaddsalary=(select workoverdays from inserted)*30select @kksubsalary=(select staff_late from inserted)*(-10)+(selectstaff_absent from inserted)*(-30)select @kkbenefits=@kkbasesalary*(0.25)select @kkinsurances=@kkbasesalary*(-0.01)select @kkhousing_funds=@kkbasesalary*(-0.008)/*用组成真实薪资的各项薪资来给真实薪资赋值*/select@kkrelsalarys=@kkbasesalary+@kkaddsalary+@kksubsalary+@kkbenefits+@kkinsurances+@kkhousing_funds/*利用变量对薪资表中的'加班费,迟到缺勤扣除费'进行更新*/update salaryset addsalary=@kkaddsalarywhere staff_no=(select staff_no from inserted)and month_date=(select month_date from inserted)update salaryset subsalary=@kksubsalarywhere staff_no=(select staff_no from inserted)and month_date=(select month_date from inserted)update salaryset relsalary=@kkrelsalaryswhere staff_no=(select staff_no from inserted)and month_date=(select month_date from inserted)/*创建一个触发器当对考勤表插入新数据时,薪资表有自动对应插入新数据的功能*/ create trigger xinzi2on staff_daysfor insertasbegin/*定义变量来记录薪资表中应插入的各项数据*/declare @jjstaff_no char(4),@jjmonth_date char(6)declare @jjbasesalary float,@jjaddsalary float,@jjsubsalary float,@jjbenefits float,@jjinsurances float,@jjhousing_funds float,@jjrelsalarys float /*给各个变量赋值*/select @jjstaff_no=(select staff_nofrom inserted)select @jjmonth_date=(select month_datefrom inserted)select @jjbasesalary=(select basesalaryfrom positionwhere pos=(select staff_jobfrom staff_messagewhere staff_no=(select staff_no from inserted)))select @jjaddsalary=0select @jjsubsalary=0select @jjbenefits=@jjbasesalary*(0.25)select @jjinsurances=@jjbasesalary*(-0.01)select @jjhousing_funds=@jjbasesalary*(-0.008)select @jjrelsalarys=@jjbasesalary+@jjbenefits+@jjinsurances+@jjhousing_funds/*将新值插入到薪资表中*/insertinto salaryvalues(@jjstaff_no,@jjmonth_date,@jjaddsalary,@jjsubsalary,@jjrelsalarys)end/*对员工信息表创建一个触发器实现当登记新来员工信息时,薪资表和考勤表中自动对应增加新记录的功能*/create trigger staffmessage1on staff_messagefor insertasbegin/*定义变量来记录待插入薪资表和考勤表的数据*/declare @hhstaff_no char(4)select @hhstaff_no=(select staff_no from inserted)/*向考勤表中自动插入新员工的薪资数据,同时薪资表也会自动插入新数据*/insertinto staff_daysvalues(@hhstaff_no,'201206',0,0,0)end/*对员工信息表创建一个触发器来实现当某员工信息从信息表中删除时,薪资表和考勤表能自动删除关于该员工的信息的功能*/create trigger staffmessage2on staff_messagefor deleteasbegin/*删除辞职员工在薪资表中的记录*/deletefrom salarywhere staff_no=(select staff_no from deleted)/*删除辞职员工在考勤表中的记录*/deletefrom staff_dayswhere staff_no=(select staff_no from deleted)end/******************存储过程********************//*创建一个存储过程实现向部门表录入新数据的功能*/create procedure department_insert@aadepart_no char(2),@aadepart_name char(30),@aadepart_manage char(6),@aadepart_people intasbegininsertinto departmentvalues(@aadepart_no,@aadepart_name,@aadepart_manage,@aadepart_people) end/*创建一个存储过程实现向职位表录入新数据的功能*/create procedure position_insert@bbpos char(30),@bbbasesalary float,@bbbenefits float,@bbinsurances float, @bbhousing_funds floatasbegininsertinto positionvalues(@bbpos,@bbbasesalary,@bbbenefits,@bbinsurances,@bbhousing_funds) end/*创建一个存储过程实现向职工信息表录入新数据的功能*/create procedure staffmessage_insert@ccstaff_no char(4),@ccstaff_name char(10),@ccstaff_sex char(2),@ccstaff_age int,@ccstaff_edu char(10),@ccstaff_dep char(2),@ccstaff_job char(30)asbegininsertinto staff_messagevalues(@ccstaff_no,@ccstaff_name,@ccstaff_sex,@ccstaff_age,@ccstaff_edu,@ccstaff_dep, @ccstaff_job)end/*创建一个存储过程实现在新的一月时向考勤表中插入新数据的功能*/create procedure kaoqin_insert@qqstaff_no char(4),@qqmonth_date char(6),@qqstaff_late int,@qqstaff_absent int,@qqworkoverdays intasbegininsertinto staff_daysvalues(@qqstaff_no,@qqmonth_date,@qqstaff_late,@qqstaff_absent,@qqworko verdays)end/*创建一个存储过程实现只能查看自己的基本信息的功能*/create proc select_staffmessage@staff_number char(4)asselect*from staff_messagewhere staff_no=@staff_number;/*创建一个存储过程实现只能查看自己的工资情况的功能*/create proc select_salary@staff_num char(4)as/*查看自己某年某月的福利,失业保险,住房公积金,奖金,罚金,最终真实工资*/selectsalary.staff_no,salary.month_date,position.benefits,position.insurances,position.housing_funds,salary.addsalary,salary.subsalary,salary.relsala ryfrom salary,staff_message,positionwhere salary.staff_no=@staff_numand salary.staff_no=staff_message.staff_noand staff_message.staff_job=position.pos;/*创建一个存储过程实现只能查看自己的考勤信息的功能*/create proc select_staffdays@staff_no char(4)asselect*from staff_dayswhere staff_no=@staff_no;/*****************实现功能的代码********************//*查看五个基本表*/select*from department;select*from position;select*from staff_message;select*from staff_daysselect*from salary;/*查看某员工自己的信息*/exec select_staffmessage'0202';/*查看某员工自己的考勤记录*/exec select_staffdays'0202';/*查看某员工自己的薪资*/exec select_salary'0202';/*更新考勤表薪资表会自动对应更新,*/update staff_daysset staff_late=3where staff_no='0101'and month_date='201205';select*from staff_days;select*from salary;/*向考勤表插入信息,薪资表也会自动对应插入信息*/exec kaoqin_insert'0101','201206','0','0','0';select*from staff_days;select*from salary;/*向员工信息表插入信息,考勤表和薪资表也会自动对应插入新信息*/ exec staffmessage_insert'0204','陈珍','女','29','本科','02','clerk';select*from staff_message;select*from staff_days;select*from salary;/*删除员工信息表的信息,考勤表和信息表也会自动删除对应信息*/ deletefrom staff_messagewhere staff_no='0204';select*from staff_message;select*from staff_days;select*from salary;/*按部门查询员工的基本信息*/select*from staff_messagewhere staff_dep='03';/*按年月查看员工的考勤记录*/select*from staff_dayswhere month_date='201205';/*按部门查看所有员工薪资总数*/select sum(relsalary)from staff_message,salarywhere salary.staff_no=staff_message.staff_noand staff_dep='04';/*按职位查看所有员工薪资总数*/select sum(relsalary).from staff_message,salarywhere salary.staff_no=staff_message.staff_no and staff_job='clerk';.。