9.10 SQLITE3数据库

cs 复制代码
#include <myhead.h>
#include <sqlite3.h>

typedef struct
{
    int num;
    char name[20];
    double salary;
} Worker;
int callback(void *arg, int n, char **msgtext, char **msgtable)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        printf("%s\t", *(msgtable + i));
    }
    printf("\n");
    for (j = 0; j < n; j++)
    {
        printf("%s\t", *(msgtext + j));
    }
    printf("\n");
    printf("查找成功\n");
    return 0;
}

int do_delete(sqlite3 *ppDb)
{
    int key;
    printf("请输入要删除的工号:");
    scanf("%d", &key);
    char *errmsg = NULL; //储存错误信息
    char sqlite[100];
    snprintf(sqlite, sizeof(sqlite), "delete from Work where num==%d;", key);
    if (sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != 0)
    {
        perror("sqlite3_exec");
        return -1;
    }
    printf("删除成功\n");
}
int do_insert(sqlite3 *ppDb)
{
    Worker work;
    printf("请输入要插入的工号:");
    scanf("%d", &work.num);
    printf("请输入要插入的姓名:");
    scanf("%s", work.name);
    printf("请输入要插入的工资:");
    scanf("%lf", &work.salary);
    char *errmsg = NULL; //储存错误信息
    char sqlite[100];
    snprintf(sqlite, sizeof(sqlite), "insert into Work values(%d,\"%s\",%lf);", work.num, work.name, work.salary);
    printf("添加成功\n");
    if (sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != 0)
    {
        perror("sqlite3_exec");
        return -1;
    }
}

int do_update(sqlite3 *ppDb)
{
    Worker work;
    char key[20];
    printf("请输入要修改的姓名:");
    scanf("%s", work.name);
    printf("请输入新的工号:");
    scanf("%d", &work.num);
    printf("请输入新的工资:");
    scanf("%lf", &work.salary);

    char *errmsg = NULL; //储存错误信息
    char sqlite[100];
    snprintf(sqlite, sizeof(sqlite), "update Work set num=%d,salary=%lf where name=\"%s\";", work.num, work.salary, work.name);
    if (sqlite3_exec(ppDb, sqlite, NULL, NULL, &errmsg) != 0)
    {
        perror("sqlite3_exec");
        return -1;
    }
    printf("修改成功\n");
}

int do_reserch(sqlite3 *ppDb)
{
    char key[20];
    printf("请输入要查找的姓名:");
    scanf("%s", key);
    char *errmsg = NULL;
    char sqlite[100];
    snprintf(sqlite, sizeof(sqlite), "select * from Work where name==\"%s\";", key);
    if (sqlite3_exec(ppDb, sqlite, callback, NULL, &errmsg) != 0)
    {
        perror("sqlite3_exec");
        return -1;
    }
}

int show_all(void *arg, int n, char **msgtext, char **msgtable)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        printf("%s\t", *(msgtable + i));
    }
    printf("\n");
    for (j = 0; j < n; j++)
    {
        printf("%s\t", *(msgtext + j));
    }
    printf("\n");
    
    return 0;
}

int do_showall(sqlite3 *ppDb)
{
    char *errmsg = NULL;                                          //存储错误信息
    char sqlite[100] = "select * from Work";                      //输出所有工人信息
    if (sqlite3_exec(ppDb, sqlite, show_all, NULL, &errmsg) != 0) //输出所有工人信息
    {
        perror("sqlite3_exec");
        printf("错误码:%d错误信息:%s,出错行是:%d\n",
               sqlite3_errcode(ppDb), sqlite3_errmsg(ppDb), __LINE__);
        printf("错误信息:%s\n", errmsg);
        return -1;
    }
    return 0;
}

void menu(sqlite3 *ppDb)
{
    int ch;
    printf("1.插入一个工人信息\n");
    printf("2.删除一个工人信息\n");
    printf("3.修改一个工人信息\n");
    printf("4.查找一个工人信息\n");
    printf("5.显示所有工人信息\n");
    printf("0.退出\n");
    printf("请输入选项:");
    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_reserch(ppDb);
        break;

    case 5:
        do_showall(ppDb);
        break;

    case 0:
        exit(0);
    default:
        break;
    }
}

int main(int argc, char const *argv[])
{
    sqlite3 *ppDb;
    int k = sqlite3_open("./workers.db", &ppDb);
    if (k != SQLITE_OK)
    {
        perror("sqlite3_open");
        return -1;
    }
    printf("数据库打开成功\n");
    char *errmsg = NULL;                                                                    //储存错误信息
    char sqlite[100] = "create table if not exists Work(num int,name char,salary double);"; //创建一个表格
    if (sqlite3_exec(ppDb, sqlite, callback, NULL, &errmsg) != 0)
    {
        perror("sqlite3_exec");
        return -1;
    }
    while(1)
    {
        menu(ppDb);
    }

    sqlite3_close(ppDb);
    return 0;
}
相关推荐
廿一夏7 小时前
MySql存储引擎与索引
数据库·sql·mysql
lzhdim9 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室10 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
TDengine (老段)10 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
YOU OU11 小时前
Spring IoC&DI
java·数据库·spring
Muscleheng12 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
罗超驿12 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试
jran-13 小时前
Redis 命令
数据库·redis·缓存
小江的记录本13 小时前
【Java基础】Java 8-21新特性:JDK21 LTS:虚拟线程、模式匹配switch、结构化并发、序列集合(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
June`13 小时前
多线程redis下如何解决aof重写和rdb持久化的数据一致性问题
数据库·redis·缓存