提示:源码资源可以点击下列地址:
源码链接: linux学校人员管理系统
🛠软件流程图和软件需求(仅供参考)
(一) 软件流程图
(二) 软件需求
1)增加管理员 教师 学生 三种权限字段(0,1,2)
0:管理员权限,可以操作所有的班级数据表
1:教师权限,可以操作自己管理的那个班的数据表
2:学生权限,只可以查看自己的数据,不能进行修改,删除,和新增
2)学生用户字段:学号(主键) 密码 姓名 年龄 性别 语文成绩 数学成绩 英语成绩
语文,数学,英语:都只显示最新的成绩
3)管理员和教师:用户名 密码 权限(所能操作的数据表)
student.db:CS123 CS456 CS789 ...
0:CS123 CS456 CS789
1:CS123
2:CS123--> 对应学号的信息。
📕内容讲解
1、代码入口 main.c
代码解释
(一) 预处理部分
1、#include <stdio.h> 和 #include <stdlib.h> 作为最基本头文件不多做赘述
2、#include“login.h” 和 #include“init.h”分别是登入界面函数和初始化函数(下文会有介绍)
(二) 函数部分
system("clear"); // 操作shell语句 “clear”,实现清屏功能
DatabaseInit(); // 此函数为init.h的数据库初始化代码(下文会有解释)
LoginOption(); // 此函数为login.h的登入界面显示代码(下文会有解释)
2、登入界面部分
1)、数据库初始化部分 init
代码解释
(一) 预处理部分
1、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
2、#include <unistd.h> 是操作系统API头文件
3、#include <fcntl.h> 是unix标准通用的头文件 // 通常讲(2)和(3)两个头文件结合使用
4、 #include“init.h”是初始化函数(下文会有介绍)
(二) 函数部分
1、数据库信息初始化函数 void InitUserInformation()
int InitUserInformation(); // 函数声明
if(access("SMS.db",F_OK)==0) // 查看当前文件夹下是否有有SMS.db文件
{
printf("已经存在数据库,无需初始化配置\n");
sleep(1);
}
else
{
if(InitUserInformation()==-1) // 没有对应的数据库文件就创建对应数据库文件,并且判断是否创建成功
{
printf("初始化配置失败\n");
}
else
{
printf("初始化配置成功\n");
}
}
puts("请按Enter键进行下一步..."); // 优化界面
getchar(); // 等待接收字符
system("clear");
-------------------------------------------------------------------------------------------------------------------------------------------
2、数据库初始化接口(API)函数 int DatabaseInit()
/*创建默认数据库*/
sqlite3 *db_point = NULL; // 定义一个sqlite3数据库连接对象指针
int r = sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(r != SQLITE_OK) // 判断是否创建成功
{
perror("数据库创建失败");
return -1; // 返回-1 ,表示初始化失败
}
/*执行创建用户并初始化默认用户语句*/
// SQL语句对象的原始SQL语句字符串
char *sql = "CREATE TABLE user(ip int(4) check(ip in(1,2,3)), // 创建标题ip(权限)【int】,并且限定只能在{1,2,3}当中
uid varchar(8), // 创建标题uid(用户id)【varchar】
upass varchar(8), // 创建标题upass(用户密码)【varchar】
primary key(uid));"; // 将uid标题设置为主键
r = sqlite3_exec(db_point,sql,NULL,NULL,NULL); // 执行对于的sql语句
if( r != SQLITE_OK ) // 判断是否执行成功
{
printf("创建用户表格失败\n");
return -1; // 返回-1 ,表示初始化失败
}
else
{
printf("创建用户表格成功\n");
}
sql = "insert into user values(1,'admin','admin');"; // 向user表当中插入一个admin用户,密码admin,权限为1【最高】
r = sqlite3_exec(db_point,sql,NULL,NULL,NULL); // 执行对于的sql语句
if( r != SQLITE_OK ) // 判断是否执行成功
{
printf("初始化默认用户失败\n");
return -1; // 返回-1 ,表示初始化失败
}
else
{
printf("初始化默认用户成功\n");
}
/*执行创建教师信息语句*/
// SQL语句对象的原始SQL语句字符串
sql = "CREATE TABLE teacher(uid int(4), // 创建标题uid(用户id)【int】
uname varchar(255), // 创建标题upass(密码)【varchar】
usex varchar(255) check(usex in ('男','女')), // 创建标题usex(性别)【varchar】,并且限定只能在{'男','女'}当中
uage varchar(255), // 创建标题uage(年龄)【varchar】
class int(4), // 创建标题iclass(教室)【int】
primary key(uid),foreign key(uid) references user(uid));"; // 将uid设置为主键时,又将teacher表的uid和user表的uid外部关联
r = sqlite3_exec(db_point,sql,NULL,NULL,NULL); // 执行对于的sql语句
if( r != SQLITE_OK ) // 判断是否执行成功
{
printf("创建教师信息表格失败\n");
return -1; // 返回-1 ,表示初始化失败
}
else
{
printf("创建教师信息表格成功\n");
}
/*执行创建学生信息语句*/
// SQL语句对象的原始SQL语句字符串
sql = "CREATE TABLE student(uid int(4), // 创建标题uid(用户id)【int】
uname varchar(255), // 创建标题uname(姓名)【varchar】
usex varchar(255) check(usex in ('男','女')), // 创建标题usex(性别)【varchar】
uage varchar(255), // 创建标题uage(年龄)【varchar】
Cgrade int(4), // 创建标题Cgrade(语文成绩)【int】
Mgrade int(4), // 创建标题Mgrade(数学成绩)【int】
Egrade int(4), // 创建标题Egrade(英语成绩)【int】
class int(4), // 创建标题class(用户)【int】
primary key(uid), // 将uid设置为主键
foreign key(class) references teacher(class), // 将student表的class与teacher表的class外部关联
foreign key(uid) references user(uid));"; // 将student表的uid与user表的uid外部关联
r = sqlite3_exec(db_point,sql,NULL,NULL,NULL); // 执行对于的sql语句
if( r != SQLITE_OK ) // 判断是否执行成功
{
printf("创建学生信息表格失败\n");
return -1; // 返回-1 ,表示初始化失败
}
else
{
printf("创建学生信息表格成功\n");
}
/*收尾处理*/
sqlite3_close(db_point); // 关闭打开了的数据库
return 0; // 表示没有错误
2)、登入UI界面部分 login
代码解释
(一) 预处理部分
1、#include <stdio.h> 作为最基本头文件不多做赘述
2、#include“login.h” 、 #include“menu.h”和#include“register.h”分别是登入界面函数、菜单功能函数、注册功能函数(下文会有介绍)
3、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
(二) 函数部分
1、登入界面选项函数 void LoginOption()
/* 初始化定义 */
int i;
char uid[MAXSIZE],passwd[MAXSIZE];
/* 登入界面UI设计 */
while(1)
{
printf("<-----登入界面----->\n");
printf("---------------------\n");
printf("1、登入账号\n");
printf("2、注册账号\n");
printf("3、退出系统\n");
printf("---------------------\n");
printf("请输入你想操作的序号:");
scanf("%d",&i);
switch(i)
{
case 1: // 登入账号操作
system("clear");
/*输入用户名和密码*/
printf("请输入你的学号/教工号/管理员用户名:");
scanf("%s",uid);
printf("请输入你的密码:");
scanf("%s",passwd);
CheckUser(uid,passwd); // 检测账号是否存在代码(下文会有介绍)
break;
case 2: // 注册账号操作
system("clear");
RegisterOption(); // 注册账号菜单代码【register.c文件中】(下文会有介绍)
break;
case 3:printf("欢迎下次使用系统...\n");sleep(1);system("clear");return 0; // 退出系统操作
default: printf("输入序号有误,请重新输入序号(按Enter键进行下一步)...\n");
getchar();system("clear");
}
}
--------------------------------------------------------------------------------------------------------------
2、/*存在回调函数*/ int IsExist_cal_handle(void *flag, int argc, char** argv, char **colname)
【注意:这个是数据库函数的回调函数,比较复杂,这里如果想要更多操作,需要大家搜索更多相关资料】
int i = *(int*)(flag);
*(int *)(flag) = i + 1;
return 0;
作用: 这里的操作是返回查询结果的个数
--------------------------------------------------------------------------------------------------------------
3、用户检查函数 int CheckUser(char *uid,char *passwd)
/*变量定义*/
sqlite3 *db_point=NULL; // 数据库连接对象指针(有点类似句柄)
char sql[100]; // 数据库语句缓存区
int rs; // 数据库操作状态返回值
int flag = 0; // 用于回调函数计数
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
/*执行创建用户并初始化默认用户语句*/
// 查询是否有查用户名和密码的结果
sprintf(sql,"select * from user where exists(select * from user where uid='%s' and upass='%s');",uid,passwd);
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle,&flag,NULL); // 执行数据库语句并且运用回调函数得到查询结果的次数
if( rs != SQLITE_OK )
{
printf("登入失败,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if (flag == 0 ) // 如果没有结果,直接退出
{ /* 结果不存在*/
printf("登入失败,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
}
else // 如果有结果,进入用户菜单界面
{ /* 结果存在*/
printf("登入成功,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
MenuOption(uid,passwd); // 用户菜单界面选项函数(下文有讲)
}
}
}
--------------------------------------------------------------------------------------------------------------
4、用户菜单界面选项函数 void MenuOption(char *uid,char *passwd)
【后面总结的时候觉得其实这个函数没有分装的必要,但也懒得改了,哈哈哈】
JudgeId(uid,passwd); // 判断登入用户的权限来进入不同的用户界面
--------------------------------------------------------------------------------------------------------------
5、用户权限判断函数 int JudgeId(char *uid,char *passwd)
sqlite3 *db_point=NULL; // 数据库连接对象指针(有点类似句柄)
char *errMsg; // 操作报错的字符串缓冲区
char **dbResult; // 操作后得到的数据库二维数组表格
char sql[100]; // 数据库语句缓存区
int rs,result,nRow = 0, nColumn = 0; // 操作结果状态标志位,行数,列数
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
sprintf(sql,"select * from user where uid='%s' and upass='%s';",uid,passwd);
/*数据库取出权限值*/
rs = sqlite3_get_table(db_point,sql,&dbResult,&nRow,&nColumn,&errMsg); // 获得数据库表格函数
if(rs == SQLITE_OK)
{
result = atoi(dbResult[1*nColumn+1-1]); // 获取(权限)ip的值,atoi函数是将字符串转换成对于的数字
sqlite3_free_table(dbResult); // 释放数据库表格
}
else
{
printf("取值失败(按Enter键进行下一步)...");
}
sqlite3_close(db_point);
switch(result) // 判断权限,进入对于的用户菜单
{
/*以下分别为管理员、教师、学生菜单函数【位于menu.c】*/
case 1:AdminMenuOption(uid);break;
case 2:TeacherMenuOption(uid);break;
case 3:studentMenuOption(uid);break;
default:printf("权限有误(按Enter键进行下一步)...\n");getchar();system("clear");
}
3)、注册UI界面部分 register
代码解释
(一) 预处理部分
1、#include <stdio.h> 作为最基本头文件不多做赘述
2、#include“register.h” 是注册界面函数(下文会有介绍)
3、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
4、#include <string.h> 是专门处理字符串的库函数
(二) 函数部分
1、教师注册函数 int RegisterTeacherUser()
/*变量定义*/
char uid[MAXSIZE],passwd[MAXSIZE],username[MAXSIZE],usex[MAXSIZE],uage[MAXSIZE];
sqlite3 *db_point=NULL;
char sql[100];
int rs,class;
/*设置用户*/
printf("请输入你的教工号[字符限制:1~7]:");
scanf("%s",uid);
printf("请设置你的密码[字符限制:1~7]:");
scanf("%s",passwd);
/* 判断是否超过了对于限制范围 */
if(strlen(uid)>8&&strlen(passwd)>7)
{
puts("不符合字符规定...");
return 0;
}
/*进行数据库操作*/
// 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
rs=sqlite3_open("SMS.db",&db_point);
if(rs != SQLITE_OK)
{
perror("数据库打开失败");
getchar();getchar();
system("clear");
return -1; // 返回-1 ,表示打开数据库失败
}
/*执行创建用户并初始化默认用户语句*/
sprintf(sql,"insert into user values(2,'%s','%s');",uid,passwd);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL); //执行对于表达式
if( rs != SQLITE_OK )
{
printf("添加用户失败\n");
getchar();getchar();
system("clear");
return -1; // 返回-1 ,表示初始化失败
}
/*设置用户信息*/
printf("请输入你的名字[字符限制:1~7]:");
scanf("%s",username);
printf("请输入你的性别[男/女]:");
scanf("%s",usex);
printf("请输入你的年龄:");
scanf("%s",uage);
printf("请输入你管理的班级号:");
scanf("%d",&class);
/*初始化语句,将数据库语句内容清空*/
strcpy(sql, "");
/*执行创建用户并初始化默认用户语句*/
sprintf(sql,"insert into teacher values('%s','%s','%s','%s',%d);",uid,username,usex,uage,class);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("添加用户失败\n");
getchar();getchar();
system("clear");
return -1; // 返回-1 ,表示初始化失败
}
puts("完成用户注册,按Enter键盘进行下一步...");getchar();getchar();system("clear");
sqlite3_close(db_point);
-------------------------------------------------------------------------------------------------------------
2、学生注册函数int RegisterStudentUser()【可以类比教师注册函数】
/*变量定义*/
char uid[MAXSIZE],passwd[MAXSIZE],username[MAXSIZE],usex[MAXSIZE],uage[MAXSIZE],Cgrade[MAXSIZE],Mgrade[MAXSIZE],Egrade[MAXSIZE];
sqlite3 *db_point=NULL;
char sql[100];
int rs,class;
/*设置用户*/
printf("请输入你的学号[字符限制:1~7]:");
scanf("%s",uid);
printf("请设置你的密码[字符限制:1~7]:");
scanf("%s",passwd);
if(strlen(uid)>8&&strlen(passwd)>8)
{
puts("不符合字符规定...");
return 0;
}
/*进行数据库操作*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败");
getchar();getchar();
system("clear");
return -1; // 返回-1 ,表示打开数据库失败
}
/*执行创建用户并初始化默认用户语句*/
sprintf(sql,"insert into user values(3,'%s','%s');",uid,passwd);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("添加用户失败\n");
getchar();getchar();
system("clear");
return -1; // 返回-1 ,表示初始化失败
}
/*设置用户信息*/
printf("请输入你的名字[字符限制:1~7]:");
scanf("%s",username);
printf("请输入你的性别[男/女]:");
scanf("%s",usex);
printf("请输入你的年龄:");
scanf("%s",uage);
printf("请输入你的班级号:");
scanf("%d",&class);
/*初始化语句*/
strcpy(sql, "");
/*执行创建用户并初始化默认用户语句*/
sprintf(sql,"insert into student values('%s','%s','%s','%s',NULL,NULL,NULL,%d);",uid,username,usex,uage,class);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("添加用户失败\n");
getchar();getchar();
system("clear");
return -1; // 返回-1 ,表示初始化失败
}
puts("完成用户注册,按Enter键盘进行下一步...");getchar();getchar();system("clear");
sqlite3_close(db_point);
--------------------------------------------------------------------------------------------------------------
3、注册UI菜单代码 void RegisterOption()
int i;
while(1)
{
printf("<-----注册界面----->\n");
printf("---------------------\n");
printf("1、学生注册\n");
printf("2、教师注册\n");
printf("3、退出注册\n");
printf("---------------------\n");
printf("请输入你想操作的序号:");
scanf("%d",&i);
switch(i)
{
case 1:
system("clear");
RegisterStudentUser();
break;
case 2:
system("clear");
RegisterTeacherUser();
break;
case 3:printf("3 quit\n");system("clear");return 0;
default: printf("输入序号有误,请重新输入序号(按Enter键进行下一步)...\n");getchar();getchar();system("clear");
}
}
3、用户运行界面部分
1)、用户菜单部分 menu
代码解释
(一)预处理部分
1、#include <stdio.h> 作为最基本头文件不多做赘述
2、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
3、#include "menu.h"、#include "update.h"、#include "insert.h"、#include "delete.h"、#include "select.h"自己写的关于”增删改查“的函数(下文会讲)
(二)函数部分
1、管理员UI界面 void AdminMenuOption(char *uid)
int i;
while(1)
{
printf("<------管理员界面------>\n");
printf("1、增加教师数据\n");
printf("2、删除教师数据\n");
printf("3、更改教师数据\n");
printf("4、查询教师数据\n");
printf("5、增加管理员数据\n");
printf("6、删除管理员数据\n");
printf("7、更改管理员数据\n");
printf("8、查询管理员数据\n");
printf("9、注销用户\n");
printf("10、退出系统\n");
printf("------------------------\n");
printf("请输入你想操作的序号:");
scanf("%d",&i);
switch(i)
{
case 1:
system("clear");
AddTeacher();
sleep(1);
system("clear");
break;
case 2:
system("clear");
DeleteAdmin(uid,2);
sleep(1);
system("clear");
break;
case 3:
system("clear");
UpdateAdmin(uid,2);
sleep(1);
system("clear");
break;
case 4:
system("clear");
ShowAdminTable(2);
sleep(1);
system("clear");
break;
case 5:
system("clear");
AddAdmin();
sleep(1);
system("clear");
break;
case 6:
system("clear");
DeleteAdmin(uid,1);
sleep(1);
system("clear");
break;
case 7:
system("clear");
UpdateAdmin(uid,1);
sleep(1);
system("clear");
break;
case 8:
system("clear");
ShowAdminTable(1);
sleep(1);
system("clear");
break;
case 9:
system("clear");
SelfDeleteAdmin(uid);
sleep(1);
system("clear");
exit(0);
case 10:system("clear");puts("欢迎下次使用本系统...");sleep(1);system("clear");exit(0);system("clear");
default: printf("输入序号有误,请重新输入序号...\n");
}
}
--------------------------------------------------------------------------------------------------------------
2、教师UI界面 void TeacherMenuOption(char *uid)
int i;
while(1)
{
printf("<-------教师界面------->\n");
printf("1、增加学生数据\n");
printf("2、删除学生数据\n");
printf("3、更改学生数据\n");
printf("4、查询学生数据\n");
printf("5、注销用户\n");
printf("6、退出系统\n");
printf("------------------------\n");
printf("请输入你想操作的序号:");
scanf("%d",&i);
switch(i)
{
case 1:
system("clear");
AddStudent();
sleep(1);
system("clear");
break;
case 2:
system("clear");
DeleteTeacher(uid);
sleep(1);
system("clear");
break;
case 3:
system("clear");
UpdateTeacher(uid);
sleep(1);
system("clear");
break;
case 4:
system("clear");
ShowTeacherTable(uid);
sleep(1);
system("clear");
break;
case 5:
system("clear");
SelfDeleteTeacher(uid);
sleep(1);
system("clear");
exit(0);
case 6:system("clear");puts("欢迎下次使用本系统...");sleep(1);system("clear");exit(0);system("clear");
default: printf("输入序号有误,请重新输入序号...\n");
}
}
-----------------------------------------------------------------------------------------------------------------
3、学生UI界面void studentMenuOption(char *uid)
int i;
while(1)
{
printf("<-------学生界面------->\n");
printf("1、查询成绩\n");
printf("2、修改密码\n");
printf("3、注销用户\n");
printf("4、退出系统\n");
printf("------------------------\n");
printf("请输入你想操作的序号:");
scanf("%d",&i);
switch(i)
{
case 1:
system("clear");
ShowStudentTable(uid);
sleep(1);
system("clear");
break;
case 2:
system("clear");
UpdateStudent(uid);
sleep(1);
system("clear");
break;
case 3:
system("clear");
SelfDeleteStudent(uid);
sleep(1);
system("clear");
exit(0);
case 4:system("clear");puts("欢迎下次使用本系统...");sleep(1);system("clear");exit(0);
default: printf("输入序号有误,请重新输入序号...\n");
}
}
【以上代码的本质框架就是基于switch-case的基本结构】
2)、“增” insert
代码解释
(一) 预处理部分
1、#include "insert.h" 自己写的"增"函数库
2、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
3、#include <stdio.h> 作为最基本头文件不多做赘述
4、#include <string.h> 专门处理字符串的函数库
(二) 函数部分
1、/*存在回调函数*/ int IsExist_cal_handle1(void *flag, int argc, char** argv, char **colname)
【注意:这个是数据库函数的回调函数,比较复杂,这里如果想要更多操作,需要大家搜索更多相关资料】
int i = *(int*)(flag);
*(int *)(flag) = i + 1;
return 0;
作用: 这里的操作是返回查询结果的个数
--------------------------------------------------------------------------------------------------------------
2、管理员添加函数 int AddAdmin()
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE],upass[MAXSIZE];
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
// 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
rs=sqlite3_open("SMS.db",&db_point); // 将数据库指针和db文件进行连接
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point); // 关闭数据库连接
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
printf("请添加管理员的用户名、密码[字符限定1~7]:\n");
scanf("%s%s",uid,upass);
sprintf(sql,"insert into user values(1,'%s','%s');",uid,upass); // 插入一个管理员的信息
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL); // 执行上述数据库语句
if( rs != SQLITE_OK )
{
printf("插入失败\n");
return 0; // 返回0 ,表示初始化失败
}
else
{
printf("插入成功\n");
}
sqlite3_close(db_point); // 关闭数据库连接
return 1;
}
--------------------------------------------------------------------------------------------------------------
3、教师添加函数 int AddTeacher()
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE],upass[MAXSIZE],uname[MAXSIZE],usex[MAXSIZE],uage[MAXSIZE],class[MAXSIZE];
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
// 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
rs=sqlite3_open("SMS.db",&db_point);
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
/*把教师的信息填入到user表格里*/
printf("请添加教师的信息:\n");
printf("信息[教工号[字符限定1~7]、默认密码[字符限定1~7]、姓名、性别(男/女)、年龄、管理班级]\n");
scanf("%s%s%s%s%s%s",uid,upass,uname,usex,uage,class);
sprintf(sql,"insert into user values(2,'%s','%s');",uid,upass);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("插入失败\n");
return 0; // 返回-1 ,表示初始化失败
}
/*清空数据库语句缓存的内容*/
strcpy(sql,"");
/*把教师的信息填入到teacher表格里*/
sprintf(sql,"insert into teacher values('%s','%s','%s','%s','%s');",uid,uname,usex,uage,class);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("插入失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("插入成功\n");
}
sqlite3_close(db_point);
return 1;
}
-------------------------------------------------------------------------------------------------------------
4、学生添加函数 int AddStudent()
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE],upass[MAXSIZE],uname[MAXSIZE],usex[MAXSIZE],uage[MAXSIZE],Cgrade[MAXSIZE],Mgrade[MAXSIZE],Egrade[MAXSIZE],class[MAXSIZE];
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
printf("请输入学生学号:");
scanf("%s",uid);
/*执行创建用户并初始化默认用户语句*/
sprintf(sql,"select * from user where exists(select * from user where uid='%s');",uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle1,&flag,NULL);
if( rs != SQLITE_OK )
{
printf("插入失败,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point); // 断开数据库连接
return 0; // 返回-1 ,表示初始化失败
}
else
{
if (flag == 0 )
{ /* 结果不存在*/
// 添加学生信息
printf("数据库里没有该名学生,请添加他/她的信息(如果没有成绩请输入NULL):\n");
printf("信息[默认密码[字符限定1~7]、姓名、性别(男/女)、年龄、班级(老师的管理班级)、语文成绩、数学成绩、英语成绩]\n");
scanf("%s%s%s%s%s%s%s%s",upass,uname,usex,uage,class,Cgrade,Mgrade,Egrade);
// 清除数据库缓存
strcpy(sql,"");
sprintf(sql,"insert into user values(3,'%s','%s');",uid,upass);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("插入失败\n");
return 0; // 返回-1 ,表示初始化失败
}
// 清除数据库缓存
strcpy(sql,"");
sprintf(sql,"insert into student values('%s','%s','%s','%s','%s','%s','%s','%s');",uid,uname,usex,uage,Cgrade,Mgrade,Egrade,class);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("插入失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("插入成功\n");
}
sqlite3_close(db_point); // 断开数据库连接
return 1;
}
else
{ /* 结果存在*/
printf("数据库里有该名学生,请添加他/她的成绩(如果没有成绩请输入NULL):\n");
printf("信息[语文成绩、数学成绩、英语成绩]\n");
scanf("%s%s%s",Cgrade,Mgrade,Egrade);
strcpy(sql,"");
sprintf(sql,"insert into student(Cgrade,Mgrade,Egrade) values('%s','%s','%s');",Cgrade,Mgrade,Egrade);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("插入失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("插入成功\n");
}
sqlite3_close(db_point); // 断开数据库连接
return 1;
}
}
3)、“删” delete
代码解释
(一) 预处理部分
1、#include "delete.h" 自己写的"删"函数库
2、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
3、#include <stdio.h> 作为最基本头文件不多做赘述
4、#include <string.h> 专门处理字符串的函数库
(二) 函数部分
1、/*存在回调函数*/ int IsExist_cal_handle2(void *flag, int argc, char** argv, char **colname)
【注意:这个是数据库函数的回调函数,比较复杂,这里如果想要更多操作,需要大家搜索更多相关资料】
int i = *(int*)(flag);
*(int *)(flag) = i + 1;
return 0;
作用: 这里的操作是返回查询结果的个数
--------------------------------------------------------------------------------------------------------------
2、管理员删除函数 int DeleteAdmin(char *Selfuid,int i)
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE];
char sql[100];
int rs;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
// 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
rs=sqlite3_open("SMS.db",&db_point);
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
if(i==1)
{
printf("请输入要删除的管理员用户名:\n");
}
if(i==2)
{
printf("请输入要删除的教师教工号:\n");
}
scanf("%s",uid);
// 不能在删除他人的功能里面能够注销自己
if(i==1&&strcmp(Selfuid,uid)==0)
{
printf("不能删除当前账号,若要删除当前账号,请在注销选项完成...\n");
return 0;
}
// 查询是否有想要的消息
sprintf(sql,"select * from user where exists(select * from user where uid='%s' and ip=%d);",uid,i);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle2,&flag,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败...\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此用户...\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(i==1) // 删除管理员操作
{
strcpy(sql,"");
sprintf(sql,"delete from user where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("删除成功\n");
}
sqlite3_close(db_point);
return 1;
}
if(i==2) // 删除教师操作
{
strcpy(sql,"");
sprintf(sql,"delete from user where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败\n");
return 0; // 返回-1 ,表示初始化失败
}
strcpy(sql,"");
sprintf(sql,"delete from teacher where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("删除成功\n");
}
sqlite3_close(db_point);
return 1;
}
}
}
}
--------------------------------------------------------------------------------------------------------------
3、教师删除函数 int DeleteTeacher(char *Selfuid)
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE];
char *zErrMsg = 0;
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
printf("请输入要删除的学生学号:\n");
scanf("%s",uid) ;
sprintf(sql,"select * from student,teacher x where exists(select * from student where student.uid='%s' and student.class=(select class from teacher y where y.uid='%s'));",uid,Selfuid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle2,&flag,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此学生\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
strcpy(sql,"");
sprintf(sql,"delete from student where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,&zErrMsg);
if( rs != SQLITE_OK )
{
//puts(zErrMsg);
printf("删除失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
strcpy(sql,"");
sprintf(sql,"delete from user where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("删除成功\n");
}
sqlite3_close(db_point);
return 1;
}
}
}
--------------------------------------------------------------------------------------------------------------
4、学生自我注销函数 int SelfDeleteStudent(char *uid)
/*变量定义*/
sqlite3 *db_point=NULL;
//char uid[MAXSIZE];
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
//printf("请输入要删除的学生学号:\n");
//scanf("%s",uid) ;
sprintf(sql,"select * from user where exists(select * from user where uid='%s');",uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle2,&flag,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此学生,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
strcpy(sql,"");
sprintf(sql,"delete from student where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("注销失败\n");
return 0; // 返回-1 ,表示初始化失败
}
strcpy(sql,"");
sprintf(sql,"delete from user where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("注销失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("注销成功\n");
}
sqlite3_close(db_point);
return 1;
}
}
}
--------------------------------------------------------------------------------------------------------------
5、教师自我注销函数 int SelfDeleteTeacher(char *uid)
{
/*变量定义*/
sqlite3 *db_point=NULL;
//char uid[MAXSIZE];
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
//printf("请输入要删除的学生学号:\n");
//scanf("%s",uid) ;
sprintf(sql,"select * from user where exists(select * from user where uid='%s');",uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle2,&flag,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此教师,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
strcpy(sql,"");
sprintf(sql,"delete from student where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("注销失败\n");
return 0; // 返回-1 ,表示初始化失败
}
strcpy(sql,"");
sprintf(sql,"delete from user where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("注销失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("注销成功\n");
}
sqlite3_close(db_point);
return 1;
}
}
}
}
--------------------------------------------------------------------------------------------------------------
6、管理员自我注销函数 int SelfDeleteAdmin(char *uid)
{
/*变量定义*/
sqlite3 *db_point=NULL;
//char uid[MAXSIZE];
char sql[100];
int rs,i;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
//printf("请输入要删除的学生学号:\n");
//scanf("%s",uid) ;
sprintf(sql,"select * from user where exists(select * from user where uid='%s');",uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle2,&flag,NULL);
if( rs != SQLITE_OK )
{
printf("删除失败,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此管理员,按Enter键进行下一步...\n");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
strcpy(sql,"");
sprintf(sql,"delete from student where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("注销失败\n");
return 0; // 返回-1 ,表示初始化失败
}
strcpy(sql,"");
sprintf(sql,"delete from user where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("注销失败\n");
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("注销成功\n");
}
sqlite3_close(db_point);
return 1;
}
}
}
}
4)、“改” update
代码解释
(一) 预处理部分
1、#include "update.h" 自己写的"改"函数库
2、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
3、#include <stdio.h> 作为最基本头文件不多做赘述
4、#include <string.h> 专门处理字符串的函数库
(二) 函数部分
1、/*存在回调函数*/ int IsExist_cal_handle3(void *flag, int argc, char** argv, char **colname)
【注意:这个是数据库函数的回调函数,比较复杂,这里如果想要更多操作,需要大家搜索更多相关资料】
int i = *(int*)(flag);
*(int *)(flag) = i + 1;
return 0;
作用: 这里的操作是返回查询结果的个数
--------------------------------------------------------------------------------------------------------------
2、管理员更新函数 int UpdateAdmin(char *Selfuid,int i)
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE],upass[MAXSIZE],uname[MAXSIZE],usex[MAXSIZE],uage[MAXSIZE],class[MAXSIZE];
char sql[100];
int rs,j;
char *zErrMsg = 0;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
if(i==1) // 管理员操作界面
{
printf("请输入要更改的管理员信息:\n");
puts("-------------------------------");
puts("1、用户名");
puts("2、密码");
puts("-------------------------------");
scanf("%d",&j);
switch(j)
{
case 1:
puts("请输入你更改后的用户名[字符限制:1~7]:");
scanf("%s",uid);
sprintf(sql,"update user set uid='%s' where uid='%s';",uid,Selfuid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
break;
case 2:
puts("请输入你更改后的密码[字符限制:1~7]:");
scanf("%s",upass);
sprintf(sql,"update user set upass='%s' where uid='%s';",upass,Selfuid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
default:puts("更改失败,请重新选择更改选项...");sleep(1);return 0;
}
}
if(i==2) // 教师操作界面
{
puts("请输入要更改信息的教工号:");
scanf("%s",uid);
sprintf(sql,"select * from teacher where uid='%s';",uid);
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle3,&flag,&zErrMsg);
if( rs != SQLITE_OK )
{
puts(zErrMsg);
printf("删除失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此老师信息\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("请输入要更改的教师信息:\n");
puts("-------------------------------");
puts("1、密码");
puts("2、姓名");
puts("3、年龄");
puts("4、性别");
puts("5、管理班级");
puts("-------------------------------");
scanf("%d",&j);
switch(j)
{
case 1:
puts("请输入你更改后的密码[字符限制:1~7]:");
scanf("%s",upass);
sprintf(sql,"update user set upass='%s' where uid='%s';",upass,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 2:
puts("请输入你更改后的姓名[字符限制:1~7]:");
scanf("%s",uname);
sprintf(sql,"update teacher set uname='%s' where uid='%s';",uname,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 3:
puts("请输入你更改后的年龄:");
scanf("%s",uage);
sprintf(sql,"update teacher set uage='%s' where uid='%s';",uage,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 4:
puts("请输入你更改后的性别:");
scanf("%s",usex);
sprintf(sql,"update teacher set usex='%s' where uid='%s';",usex,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 5:
puts("请输入你更改后的管理班级:");
scanf("%s",class);
sprintf(sql,"update teacher set class='%s' where uid='%s';",class,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
default:puts("更改失败,请重新选择更改选项...");sleep(1);return 0;
}
}
}
}
}
--------------------------------------------------------------------------------------------------------------
3、教师更新函数 int UpdateTeacher(char *Selfuid)
/*变量定义*/
sqlite3 *db_point=NULL;
char uid[MAXSIZE],upass[MAXSIZE],uname[MAXSIZE],usex[MAXSIZE],uage[MAXSIZE],class[MAXSIZE],Cgrade[MAXSIZE],Mgrade[MAXSIZE],Egrade[MAXSIZE];
char sql[200];
int rs,j;
char *zErrMsg = 0;
int flag = 0; /* 用于回调函数计数*/
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
puts("请输入要更改信息的学号:");
scanf("%s",uid);
sprintf(sql,"select * from student,teacher where student.uid='%s' and teacher.uid='%s' and student.class=teacher.class;",uid,Selfuid);
rs = sqlite3_exec(db_point,sql,IsExist_cal_handle3,&flag,&zErrMsg);
if( rs != SQLITE_OK )
{
puts(zErrMsg);
printf("删除失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
if(flag==0)
{
printf("不存在此学生\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("请输入要更改的学生信息:\n");
puts("-------------------------------");
puts("1、密码");
puts("2、姓名");
puts("3、年龄");
puts("4、性别");
puts("5、成绩");
puts("6、所在班级");
puts("-------------------------------");
scanf("%d",&j);
switch(j)
{
case 1:
puts("请输入你更改后的密码[字符限制:1~7]:");
scanf("%s",upass);
sprintf(sql,"update user set upass='%s' where uid='%s';",upass,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
return 1;
}
case 2:
puts("请输入你更改后的姓名[字符限制:1~7]:");
scanf("%s",uname);
sprintf(sql,"update student set uname='%s' where uid='%s';",uname,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 3:
puts("请输入你更改后的年龄:");
scanf("%s",uage);
sprintf(sql,"update student set uage='%s' where uid='%s';",uage,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 4:
puts("请输入你更改后的性别:");
scanf("%s",usex);
sprintf(sql,"update student set usex='%s' where uid='%s';",usex,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 5:
puts("请输入你更改后的语文、数学、英语成绩[没有成绩请输入NULL]:");
scanf("%s%s%s",Cgrade,Mgrade,Egrade);
sprintf(sql,"update student set Cgrade='%s',Mgrade='%s',Egrade='%s' where uid='%s';",Cgrade,Mgrade,Egrade,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
case 6:
puts("请输入你更改后的所在班级:");
scanf("%s",class);
sprintf(sql,"update teacher set class='%s' where uid='%s';",class,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
}
return 1;
default:puts("更改失败,请重新选择更改选项...");sleep(1);return 0;
}
}
}
}
--------------------------------------------------------------------------------------------------------------
4、学生更新函数 int UpdateStudent(char *uid)
/*变量定义*/
sqlite3 *db_point=NULL;
char upass[MAXSIZE];
char *zErrMsg = 0;
char sql[100];
int rs,i;
/*数据库查询*/
rs=sqlite3_open("SMS.db",&db_point); // 创建默认的数据库,并且将db_point数据库连接对象指针指向创建好且打开的数据库对象
if(rs != SQLITE_OK)
{
perror("数据库打开失败,按Enter键进行下一步...");
getchar();getchar();
system("clear");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示打开数据库失败
}
else
{
puts("请输入你更改后的密码[字符限制:1~7]:");
scanf("%s",upass);
sprintf(sql,"update user set upass='%s' where uid='%s';",upass,uid);
// SQL语句对象的原始SQL语句字符串
rs = sqlite3_exec(db_point,sql,NULL,NULL,NULL);
if( rs != SQLITE_OK )
{
printf("更新失败\n");
sqlite3_close(db_point);
return 0; // 返回-1 ,表示初始化失败
}
else
{
printf("更新成功\n");
sqlite3_close(db_point);
return 1;
}
}
5)、“查” select
代码解释
(一) 预处理部分
1、#include "insert.h" 自己写的"查"函数库
2、#include <sqlite3.h> 是一个小型的嵌入式数据库头文件
3、#include <stdio.h> 作为最基本头文件不多做赘述
4、#include <string.h> 专门处理字符串的函数库
(二) 函数部分
1、管理员信息展示函数 void ShowAdminTable(int k)
/*初始化定义*/
sqlite3 *db=NULL;
char *errMsg = 0;
int rs,nRow = 0, nColumn = 0,i,j;
char *sql;
char **dbResult;
/* 打开数据库连接 */
rs = sqlite3_open("SMS.db", &db);
if( rs ){
fprintf(stderr, "打不开数据库: %s\n", sqlite3_errmsg(db));
return 0;
}
if(k==1) // 查询user表的信息
{
strcpy(sql,"SELECT * from user;");
}
if(k==2) // 查询teacher表的信息
{
strcpy(sql,"SELECT * from teacher;");
}
/*数据库取出表里面的参数*/
rs = sqlite3_get_table(db,sql,&dbResult,&nRow,&nColumn,&errMsg);
if(rs == SQLITE_OK) // 如果成功,以下代码为数据库数据UI显示
{
printf("---------------------------------\n");
for(i=1;i<=nColumn;i++)
{
printf("%s \t",dbResult[0*nColumn+i-1]); // 输出每个的标题
}
printf("\n---------------------------------\n");
for(i=1;i<=nRow;i++)
{
for(j=1;j<=nColumn;j++)
{
printf("%s \t",dbResult[i*nColumn+j-1]); // 输出数据表二维数组每个参数
}
printf("\n---------------------------------\n");
}
sqlite3_free_table(dbResult); // 释放数据库的表格
}
else
{
printf("取值失败(按Enter键进行下一步)...");
getchar();
}
printf("\n请按Enter键进行下一步...\n");
getchar();getchar();
sqlite3_close(db); // 断开数据库连接
return 0;
--------------------------------------------------------------------------------------------------------------
2、学生信息展示函数 void ShowStudentTable(char *Selfuid) 【可以类比管理员信息展示函数】
sqlite3 *db=NULL;
char *errMsg = 0;
int rs,nRow = 0, nColumn = 0,i,j;
char *sql;
char **dbResult;
/* Open database */
rs = sqlite3_open("SMS.db", &db);
if( rs ){
fprintf(stderr, "打不开数据库: %s\n", sqlite3_errmsg(db));
return 0;
}
/* Create SQL statement */
sprintf(sql,"SELECT Cgrade,Mgrade,Egrade from student where student.uid='%s';",Selfuid);
/* Execute SQL statement */
/*数据库取出权限值*/
rs = sqlite3_get_table(db,sql,&dbResult,&nRow,&nColumn,&errMsg);
if(rs == SQLITE_OK)
{
printf("---------------------------------\n");
for(i=1;i<=nColumn;i++)
{
printf("%s \t",dbResult[0*nColumn+i-1]);
}
printf("\n---------------------------------\n");
for(i=1;i<=nRow;i++)
{
for(j=1;j<=nColumn;j++)
{
printf("%s \t",dbResult[i*nColumn+j-1]);
}
printf("\n---------------------------------\n");
}
sqlite3_free_table(dbResult);
}
else
{
printf("取值失败(按Enter键进行下一步)...");
getchar();
}
sqlite3_close(db);
printf("\n请按Enter键进行下一步...\n");
getchar();getchar();
return 0;
--------------------------------------------------------------------------------------------------------------
3、教师信息展示函数 void ShowTeacherTable(char *Selfuid) 【可以类比管理员信息展示函数】
sqlite3 *db=NULL;
char *errMsg = 0;
int rs,nRow = 0, nColumn = 0,i,j;
char *sql;
char **dbResult;
rs = sqlite3_open("SMS.db", &db);
if( rs ){
fprintf(stderr, "打不开数据库: %s\n", sqlite3_errmsg(db));
return 0;
}
sprintf(sql,"SELECT distinct student.* from student,teacher where student.class=(select class from teacher where uid='%s');",Selfuid);
/*数据库取出权限值*/
rs = sqlite3_get_table(db,sql,&dbResult,&nRow,&nColumn,&errMsg);
//printf("%d %d\n",nRow,nColumn);
if(rs == SQLITE_OK)
{
printf("-----------------------------------------------\n");
for(i=1;i<=nColumn;i++)
{
printf("%s \t",dbResult[0*nColumn+i-1]);
}
printf("\n-----------------------------------------------\n");
for(i=1;i<=nRow;i++)
{
for(j=1;j<=nColumn;j++)
{
printf("%s \t",dbResult[i*nColumn+j-1]);
}
printf("\n-----------------------------------------------\n");
}
sqlite3_free_table(dbResult);
}
else
{
printf("取值失败(按Enter键进行下一步)...");
getchar();
}
printf("\n请按Enter键进行下一步...\n");
getchar();getchar();
sqlite3_close(db);
return 0;