

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
//定义添加学生信息函数
int do_add(sqlite3 *ppDb)
{
int add_id; //要添加的ID号
char add_name[20]; //要添加的姓名
double add_score; //要添加的成绩
printf("请输入要添加学生的学号:");
scanf("%d", &add_id);
printf("请输入要添加学生的姓名:");
scanf("%s", add_name);
printf("请输入要添加学生的成绩:");
scanf("%lf", &add_score);
getchar();
//准备SQL语句
char sql[128] = "";
sprintf(sql, "insert into stuinfo values(%d, \"%s\", %.2lf);",
add_id, add_name, add_score);
printf("sql = %s\n", sql);
//执行SQL语句
char *errmsg = NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("添加失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("添加成功\n");
}
return 0;
}
//定义删除学生信息函数
int do_delete(sqlite3 *ppDb)
{
int del_id; //要删除的学生ID
printf("请输入要删除的学生学号:");
scanf("%d", &del_id);
getchar();
//准备SQL语句
char sql[128] = "";
sprintf(sql, "delete from stuinfo where id = %d;", del_id);
printf("sql = %s\n", sql);
//执行SQL语句
char *errmsg = NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("删除失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("删除成功\n");
}
else
{
printf("未找到该学号的学生信息,删除失败\n");
}
return 0;
}
//定义修改学生信息函数
int do_update(sqlite3 *ppDb)
{
int upd_id; //要修改的学生ID
char upd_name[20]; //新的姓名
double upd_score; //新的成绩
int choice; //选择修改的内容
printf("请输入要修改的学生学号:");
scanf("%d", &upd_id);
getchar();
//显示修改选项
printf("请选择要修改的内容:\n");
printf("1、修改姓名\n");
printf("2、修改成绩\n");
printf("3、修改姓名和成绩\n");
printf("请选择:");
scanf("%d", &choice);
getchar();
char sql[128] = "";
switch(choice)
{
case 1:
printf("请输入新的姓名:");
scanf("%s", upd_name);
getchar();
sprintf(sql, "update stuinfo set name = \"%s\" where id = %d;",
upd_name, upd_id);
break;
case 2:
printf("请输入新的成绩:");
scanf("%lf", &upd_score);
getchar();
sprintf(sql, "update stuinfo set score = %.2lf where id = %d;",
upd_score, upd_id);
break;
case 3:
printf("请输入新的姓名:");
scanf("%s", upd_name);
printf("请输入新的成绩:");
scanf("%lf", &upd_score);
getchar();
sprintf(sql, "update stuinfo set name = \"%s\", score = %.2lf where id = %d;",
upd_name, upd_score, upd_id);
break;
default:
printf("输入有误,取消修改\n");
return -1;
}
printf("sql = %s\n", sql);
//执行SQL语句
char *errmsg = NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("修改失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("修改成功\n");
}
else
{
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 = 1;
}
//输出内容
for(int i = 0; i < cols; i++)
{
printf("%s\t", msgtext[i]);
}
printf("\n");
return 0;
}
//定义查找函数
int do_search(sqlite3 *ppDb)
{
int search_choice;
printf("请选择查询方式:\n");
printf("1、查询所有学生信息\n");
printf("2、按学号查询\n");
printf("请选择:");
scanf("%d", &search_choice);
getchar();
char sql[128] = "";
switch(search_choice)
{
case 1:
strcpy(sql, "select * from stuinfo;");
break;
case 2:
{
int search_id;
printf("请输入要查询的学生学号:");
scanf("%d", &search_id);
getchar();
sprintf(sql, "select * from stuinfo where id = %d;", search_id);
break;
}
default:
printf("输入有误,查询取消\n");
return -1;
}
//执行SQL语句
char *errmsg = NULL;
int flag = 0;
if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("查询失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(flag == 0)
{
printf("未找到任何学生信息\n");
}
else
{
printf("查询成功\n");
}
return 0;
}
/******************************主程序****************************/
int main(int argc, const char *argv[])
{
//1、打开数据库并返回一个操作该数据库的句柄
sqlite3 * ppDb = NULL;
if(sqlite3_open("./my.db", &ppDb) != SQLITE_OK)
{
printf("my.db open error errcode=%d,errmsg=%s\n",
sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb));
return -1;
}
//程序执行至此,后期可以使用ppDb指针,进行数据库操作了
//2、创建一个学生信息表
//准备SQL语句
char *sql = "create table if not exists stuinfo(id int primary key,\
name text not NULL,\
score double);";
//定义指针接收执行SQL语句后的错误信息
char *errmsg = NULL;
//执行SQL语句
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("创建数据表失败:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
printf("学生信息表创建成功\n");
//循环做个菜单用于操作数据库
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==============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);
}
break;
case 0:
printf("退出系统\n");
sqlite3_close(ppDb);
exit(EXIT_SUCCESS);
default:
printf("输入有错,请重新输入\n");
}
printf("按任意键后,按回车清屏\n");
while(getchar() != '\n');
}
//关闭数据库(理论上不会执行到这里,因为上面有exit)
sqlite3_close(ppDb);
return 0;
}
8793

被折叠的 条评论
为什么被折叠?



