#include <myhead.h>
#include <sqlite3.h>
typedef struct {
int num;
char name[20];
double salary;
} Worker;
// 查询结果的回调函数
int call_back(void *arg, int n, char **a, char **b) {
for (int i = 0; i < n; i++) {
printf("%s\t", b[i]); // 输出列名
}
printf("\n");
for (int i = 0; i < n; i++) {
printf("%s\t", a[i] ? a[i] : "NULL"); // 输出每一行的值
}
printf("\n");
return 0;
}
// 查找工人信息
int do_select(sqlite3 *ppDb) {
char *errmsg = NULL;
char sql_select[100];
char key[20];
printf("请输入你要查找的工人姓名:\n");
scanf("%s", key);
snprintf(sql_select, sizeof(sql_select), "select * from work where name = \"%s\";", key);
if (sqlite3_exec(ppDb, sql_select, call_back, NULL, &errmsg) != 0) {
perror("sqlite3_select");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
printf("查找成功\n");
return 0;
}
// 插入工人信息
int do_insert(sqlite3 *ppDb) {
Worker work;
char *errmsg = NULL;
char sql_insert[200];
printf("请输入插入的工号:\n");
scanf("%d", &work.num);
printf("请输入插入的姓名:\n");
scanf("%s", work.name);
printf("请输入插入的薪资:\n");
scanf("%lf", &work.salary);
snprintf(sql_insert, sizeof(sql_insert),
"insert into work values(%d, \"%s\", %lf);",
work.num, work.name, work.salary);
if (sqlite3_exec(ppDb, sql_insert, NULL, NULL, &errmsg) != 0) {
perror("sqlite3_insert");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
printf("添加成功\n");
return 0;
}
// 删除工人信息
int do_delete(sqlite3 *ppDb) {
char key[20];
char *errmsg = NULL;
char sql_delete[100];
printf("请输入你要删除的工人姓名:\n");
scanf("%s", key);
snprintf(sql_delete, sizeof(sql_delete),
"delete from work where name = \"%s\";", key);
if (sqlite3_exec(ppDb, sql_delete, NULL, NULL, &errmsg) != 0) {
perror("sqlite3_delete");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
printf("删除成功\n");
return 0;
}
// 修改工人信息
int do_update(sqlite3 *ppDb) {
char key[20];
char new_name[20];
double new_salary;
char *errmsg = NULL;
char sql_update[200];
printf("请输入你要修改的工人姓名:\n");
scanf("%s", key);
printf("请输入新的姓名:\n");
scanf("%s", new_name);
printf("请输入新的薪资:\n");
scanf("%lf", &new_salary);
snprintf(sql_update, sizeof(sql_update),
"update work set name = \"%s\", salary = %lf where name = \"%s\";",
new_name, new_salary, key);
if (sqlite3_exec(ppDb, sql_update, NULL, NULL, &errmsg) != 0) {
perror("sqlite3_update");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
printf("更新成功\n");
return 0;
}
// 输出所有工人信息的回调函数
int flag = 0; //记录表头是否已经输出
int show_all(void *arg, int n, char **msgtext, char **msgtable) {
// 如果表头尚未输出,则输出列名
if (flag == 0) {
for (int i = 0; i < n; i++) {
printf("%s\t", msgtable[i]); // 输出列名
}
printf("\n");
flag = 1; // 标志位设为1,表示表头已输出
}
// 输出每一行的值
for (int i = 0; i < n; i++) {
if (msgtext[i] == NULL) {
printf("NULL\t");
} else {
printf("%s\t", msgtext[i]); // 输出值
}
}
printf("\n");
printf("\n");
return 0;
}
// 显示所有工人信息
void do_showall(sqlite3 *ppDb) {
char *errmsg = NULL;
char sql[100] = "select * from work";
if (sqlite3_exec(ppDb, sql, show_all, NULL, &errmsg) != 0) {
perror("sqlite3_showall");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
}
// 菜单
void menu(sqlite3 *ppDb) {
int ch;
while (1) {
printf("\n\t*********** 工人信息管理系统 ***********\n");
printf("\t1. 插入一个工人信息\n");
printf("\t2. 删除一个工人信息\n");
printf("\t3. 修改一个工人信息\n");
printf("\t4. 查找一个工人信息\n");
printf("\t5. 输出所有工人信息\n");
printf("\t0. 退出\n");
printf("请输入你的选择:\n");
scanf("%d", &ch);
getchar(); // 清除缓冲区的回车
switch (ch) {
case 1:
do_insert(ppDb);
break;
case 2:
do_delete(ppDb);
break;
case 3:
do_update(ppDb);
break;
case 4:
do_select(ppDb);
break;
case 5:
flag = 0;
do_showall(ppDb);
break;
case 0:
sqlite3_close(ppDb);
exit(0);
default:
printf("输入有误,请重新输入\n");
}
}
}
int main(int argc, const char *argv[]) {
sqlite3 *ppDb;
int k = sqlite3_open("./test.db", &ppDb); // 打开或者创建数据库
if (k != 0) {
perror("sqlite3_open");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
printf("数据库打开成功\n");
char *errmsg = NULL;
char sql_create[] = "create table if not exists work(num int primary key, name char(20), salary double);";
if (sqlite3_exec(ppDb, sql_create, NULL, NULL, &errmsg) != 0) {
perror("sqlite3_create");
printf("错误码:%d错误信息:%s,出错行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
return -1;
}
// 调用菜单函数
menu(ppDb);
return 0;
}
数据库工人信息
于 2024-09-11 09:09:22 首次发布