当前位置: 首页 > article >正文

数据库sqlite3

用数据库函数完成数据的增删改查

增:

将要存储的信息录入到结构体中,再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。

int do_insert(sqlite3 *ppDb)
{
    Worker Work;
    printf("输入插入的工号:");
    scanf("%d",&Work.gh);
    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.gh,Work.name,Work.salary);
    if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现插入一个工人信息
    {
        perror("sqlite3_exec");
        printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
        return -1;
    }
    return 0;
}

删:

根据输入的姓名来删除这个人的信息;原理和增操作一样,只需将snprintf函数中的字符串改成相应的sqlite3命令语句即可

int do_delete(sqlite3 *ppDb)
{
    char key[20];
    printf("输入要删除的姓名:");
    scanf("%s",key);
    getchar();

    char *errmsg = NULL;
    char sqlite[100];
    snprintf(sqlite,sizeof(sqlite),"delete from Work where name == \"%s\";",key);

    if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现输出工人信息
    {
        perror("sqlite3_exec");
        printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
        return -1;
    }
    printf("删除成功,输入5查看删除结果\n");
    return 0;
}

 改:

根据姓名更改相关信息,一次只能更改一项,所以使用了两次snprintf函数

int do_mod(sqlite3 *ppDb)
{
    char key[20];
    printf("输入要修改的姓名:");
    scanf("%s",key);
    getchar();

    Worker Work;
    printf("输入修改后的工号:");
    scanf("%d",&Work.gh);
    printf("输入修改后的薪资:");
    scanf("%lf",&Work.salary);

    char *errmsg = NULL;
    char sqlite[100];
    snprintf(sqlite,sizeof(sqlite),"update Work set gh = %d where name == \"%s\";",Work.gh,key);
    if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现插入一个工人信息
    {
        perror("sqlite3_exec");
        printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
        return -1;
    }
    snprintf(sqlite,sizeof(sqlite),"update Work set salary = %lf where name == \"%s\";",Work.salary,key);
    if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现插入一个工人信息
    {
        perror("sqlite3_exec");
        printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
        return -1;
    }
    printf("修改成功,输入5查看修改结果\n");
    return 0;
}

查:

前面过程都类似,在sqlite3_exec函数中加入callback回调函数,实现输出查找的信息

int callback(void *arg,int n,char **msgtext,char **msgtable)
{
    int i,j;
    char **a = msgtable;
    for(i = 0;i<2;i++)
    {
        for(j = 0;j<n;j++)
        {
            printf("%s\t",*(a++));
        }
        puts("");
    }
    return 0;
}
//查找一个工人的信息
int do_reseach(sqlite3 *ppDb)
{
    char key[20];
    printf("输入要查找的姓名:");
    scanf("%s",key);
    getchar();

    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");
        printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);
        return -1;
    }
    return 0;
}

遍历:

和查找的操作类似,会出现一个问题:当我想把标题输出出来的时候,当输出完一个人的信息后这个标题又会重新输出一次。

这时想到可以在show_all中使用flag,这样就只能输出一次,但还是不行,还是会变;

又想到用static关键字,这样就不会改变flag了,但这样就只有第一次遍历可以有这个效果,后面就不会有列名;

既然static是将局部变量具有全局变量的效果,那就定义一个全局的flag变量

int show_all(void *arg,int n,char **msgtext,char **msgtable)
{
    int num = 0;
    for(int i = 0;i<n;i++)
    {
        printf("%s\t",*(msgtable+i));
    }
    puts("");
    char **a = msgtext;
    while(*a != NULL)
    {
        num++;
        printf("%s\t",*(a++));
        if(num%3 == 0)
        {
            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),errmsg,__LINE__);
        return -1;
    }
}

定义全局变量后,如果在回调函数结束前将flag在重新改为1,那就白费功夫了,所以在do_showall函数结束前重新改为1.

int flag = 1;
int show_all(void *arg, int n, char **msgtext, char **msgtable)
{
    int num = 0;
    if (flag)
    {
        for (int i = 0; i < n; i++)
        {
            printf("%s\t", *(msgtable + i));
        }
        puts("");
        flag = 0;
    }
    char **a = msgtext;
    while (*a != NULL)
    {
        num++;
        printf("%s\t", *(a++));
        if (num % 3 == 0)
        {
            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), errmsg, __LINE__);
        return -1;
    }
    flag = 1;
    return 0;
}


http://www.kler.cn/a/300352.html

相关文章:

  • 数据结构漫游记:队列的动态模拟实现(C语言)
  • vue3切换路由后页面不报错显示空白,刷新后显示正常
  • AI时代下 | 通义灵码冲刺备战求职季
  • Amazon MSK 开启 Public 访问 SASL 配置的方法
  • uniApp开通uniPush1.0个推,SpringBoot集成uniPush1.0个推
  • Crewai + langchain 框架配置第三方(非原生/国产)大模型API
  • iOS 本地图片扫描优化
  • Pyspark下操作dataframe方法(3)
  • 【Python第三方库】OpenCV库实用指南
  • UnLua环境搭建
  • Vue3中的监听器。toRefs与toRef的区别
  • 海康威视相机在QTcreate上的使用教程
  • 【SQL】百题计划 - SQL最基本的判断和查询。
  • 【C++】入门基础(上)
  • 在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作
  • Linux网络——从《计算机网络》到网络编程
  • Taro + Vue 的 CSS Module 解决方案
  • 界面控件DevExpress中文教程:如何PDF图形对象的可见性?
  • 算法基础-约数
  • PHP函数如何传递数组参数
  • Shell脚本计算π的近似值
  • Java 并发中线程和进程的关系与区别
  • 【Altium Designer】AD18 导入3D模型
  • What‘s new in C# 7,8,9,10
  • MySQL连接相关知识点
  • LeetCode:977. 有序数组的平方 双指针 时间复杂度O(n)