学生管理系统
#include <myhead.h>
// 封装添加学生信息函数
int do_add(sqlite3 *ppDb)
{
int numb;
char name[20];
double sorce;
printf("请输入要插入的信息:");
scanf("%d %s %lf", &numb, name, &sorce);
getchar();
char sql[128] = "";
sprintf(sql, "INSERT INTO Stu VALUES(%d,\"%s\",%lf)", numb, name, sorce);
// 定义接收错误信息的变量
char *errmsg = NULL;
// 执行sql语句
if (sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("exec error : %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("插入成功\n");
return 0;
}
// 删除学生信息函数
int do_delete(sqlite3 *ppDb)
{
int numb;
printf("请输入要删除学生的学号:");
scanf("%d", &numb);
getchar();
char sql[128];
snprintf(sql, sizeof(sql), "delete from Stu where numb=%d", numb);
char *errmsg = NULL;
if (sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("exec error : %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("删除成功\n");
return 0;
}
// 通过学号修改学生成绩函数
int do_update(sqlite3 *ppDb)
{
int numb;
double sorce;
printf("请输入要修改的学生学号:");
scanf("%d", &numb);
printf("请输入要修改的学生成绩:");
scanf("%lf", &sorce);
char sql[128];
snprintf(sql, sizeof(sql), "UPDATE Stu SET sorce=%lf where numb=%d;", sorce, numb);
char *errmsg = NULL;
if (sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("exec error : %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("修改成功\n");
return 0;
}
// 定义回调函数处理查询后的结果集
int callback(void *arg, int cols, char **msgText, char **msgHeader)
{
// 输出所有数据
// 输出表头
if (*((int *)arg) == 0)
{
for (int i = 0; i < cols; i++)
{
printf("%s\t", msgHeader[i]);
}
printf("\n");
(*((int *)arg))++;
}
// 输出当前记录的内容
for (int i = 0; i < cols; i++)
{
printf("%s\t", msgText[i]);
}
printf("\n");
return 0;
}
// 定义查找函数
int do_search(sqlite3 *ppDb)
{
// 准备sql语句
char sql[128] = "SELECT * FROM Stu";
// 定义错误信息容器
char *errmsg = NULL;
// 定义标识位
int flag = 0;
// 执行sql语句
if (sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("exec error : %s\n", errmsg);
sqlite3_free(errmsg); // 释放错误信息的空间
return -1;
}
return 0;
}
int do_search1(sqlite3 *ppDb)
{
char sql[128] = "SELECT * FROM Stu";
char *errmsg = NULL;
//准备接收结果集的相关变量
char **retPtr = NULL;
int rows = 0;
int cols = 0;
if (sqlite3_get_table(ppDb, sql, &retPtr, &rows, &cols, &errmsg) != SQLITE_OK)
{
printf("get table error : %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
//此时查询的结果集已经放入了retPtr作为起始地址的二维容器中
for (int i = 0; i < rows + 1; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%s\t", *(retPtr + (i * cols) + j));
}
printf("\n");
}
//释放结果集
sqlite3_free_table(retPtr);
return 0;
}
int do_downorder(sqlite3 *ppDb)
{
int key;
printf("请输入要排序的key(1 or 2):");
scanf("%d", &key);
int flag = 0;
switch (key)
{
case 1:
{
char sql[128] = "select * from Stu order by numb desc;";
char *errmsg = NULL;
if (sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("exec error : %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
sleep(2);
}
break;
case 2:
{
char sql[128] = "select * from Stu order by sorce desc;";
char *errmsg = NULL;
if (sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("exec error : %s\n", errmsg);
sqlite3_free(errmsg);
return -1;
}
sleep(2);
}
break;
default:
printf("您输入有误\n");
break;
}
return 0;
}
int main(int argc, char const *argv[])
{
// 1、定义数据库句柄指针
sqlite3 *ppDb = NULL;
// 2、打开(创建)数据库
if (sqlite3_open("./my.db", &ppDb) != SQLITE_OK)
{
fprintf(stderr, "sqlite3_open error:errmsg=%s,errcode=%d\n",
sqlite3_errmsg(ppDb), sqlite3_errcode(ppDb));
return -1;
}
printf("sqlite3_open success\n");
// 3、创建数据库表
// 3.1 准备sql语句
char sql[128] = "create table if not exists Stu(numb int, name char, sorce double);";
char *errmsg = NULL; // 用于接收出错时的错误信息
// 3.2 执行sql语句
if (sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("exec error:%s\n", errmsg);
sqlite3_free(errmsg); // 释放错误信息的空间
return -1;
}
printf("create table Stu success\n");
// 4、对数据表进行操作
int menu = -1;
while (1)
{
system("clear");
printf("\t\t=============xxx 学生管理系统===============\n");
printf("\t\t=============1、 添加学生信息===============\n");
printf("\t\t=============2、 删除学生信息===============\n");
printf("\t\t=============3、 修改学生信息===============\n");
printf("\t\t=============4、 查找学生信息===============\n");
printf("\t\t=============5、 学生信息排序===============\n");
printf("\t\t=============0、 退出系统===============\n");
printf("请输入操作码:"); // 提示并输入信息
scanf("%d", &menu);
getchar(); // 吸收回车
// 对功能多分支选择
switch (menu)
{
case 1:
{
do_add(ppDb);
}
break;
case 2:
{
do_delete(ppDb);
}
break;
case 3:
{
do_update(ppDb);
}
break;
case 4:
{
do_search(ppDb);
// do_search1(ppDb);
}
break;
case 5:
{
do_downorder(ppDb);
}
break;
case 0:
goto END;
default:
printf("您输入的功能有误,请重新输入!!!\n");
}
printf("请输入任意键,按回车清屏\n");
while (getchar() != '\n');
}
END:
// 关闭数据库
sqlite3_close(ppDb);
return 0;
}