sqlite基本操作

简介

文章目录

  • 简介
      • 1.数据库的安装
      • 2.数据库命令:
      • API,创建表单
      • 代码
  • c
      • sprintf()
      • getchar和scanf()

1.数据库的安装

   sudo dpkg -i  *.deb

image.png
这个报错表明出现依赖问题
用这个命令后再试试sudo apt --fix-broken install

2.数据库命令:

  1)系统命令 , 都以'.'开头
     .exit 
     .quit
     .table   查看表
     .schema  查看表的结构 

sql语句, 都以‘;’结尾

    1-- 创建一张表
        create table stuinfo(id integer, name text, age integer, score float);
    
    2-- 插入一条记录
        insert into stuinfo values(1001, 'zhangsan', 18, 80);
        insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

    3-- 查看数据库记录
        select * from stuinfo;
        select * from stuinfo where score = 80;
        select * from stuinfo where score = 80 and name= 'zhangsan';
        select * from stuinfo where score = 80 or name='wangwu';
        select name,score from stuinfo;  查询指定的字段
        select * from stuinfo where score >= 85 and score < 90;

    4-- 删除一条记录
        delete from stuinfo where id=1003 and name='zhangsan';

    5-- 更新一条记录
        update stuinfo set age=20 where id=1003;
        update stuinfo set age=30, score = 82 where id=1003;

    6-- 删除一张表
        drop table stuinfo;

    7-- 增加一列
        alter table stuinfo add column sex char;

    8-- 删除一列
        create table stu as select id, name, score from stuinfo;
        drop table stuinfo;
        alter table stu rename to stuinfo;

API,创建表单

代码

用c来调用sqlite
功能指令明细
image.png

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

#define  DATABASE  "student.db"
#define  N  128

//1、2、3、4、5具体操作的实现
int do_insert(sqlite3 *db)
{
  int id;
  char name[32] = {};
  char sex;
  int score;
  char sql[N] = {};
  char *errmsg;

  printf("Input id:");
  scanf("%d", &id);

  printf("Input name:");
  scanf("%s", name);
  getchar();

  printf("Input sex:");
  scanf("%c", &sex);

  printf("Input score:");
  scanf("%d", &score);

  sprintf(sql, "insert into stu values(%d, '%s', '%c', %d)", id, name, sex, score);

  if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
  {
    printf("%s\n", errmsg);
  }
  else
  {
    printf("Insert done.\n");
  }

  return 0;
}
int do_delete(sqlite3 *db)
{
  int id;
  char sql[N] = {};
  char *errmsg;

  printf("Input id:");
  scanf("%d", &id);

  sprintf(sql, "delete from stu where id = %d", id);

  if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
  {
    printf("%s\n", errmsg);
  }
  else
  {
    printf("Delete done.\n");
  }

  return 0;
}
int do_update(sqlite3 *db)
{
  int id;
  char sql[N] = {};
  char name[32] = "zhangsan";
  char *errmsg;

  printf("Input id:");
  scanf("%d", &id);

  sprintf(sql, "update stu set name='%s' where id=%d", name,id);

  if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
  {
    printf("%s\n", errmsg);
  }
  else
  {
    printf("update done.\n");
  }

  return 0;
}


int callback(void *arg, int f_num, char ** f_value, char ** f_name)
{
  int i = 0;

  for(i = 0; i < f_num; i++)
  {
  //  printf("%-8s %s", f_value[i], f_name[i]);
    printf("%-8s", f_value[i]);
  }

  printf("++++++++++++++++++++++");
  putchar(10);

  return 0;
}

int do_query(sqlite3 *db)
{
  char *errmsg;
  char sql[N] = "select count(*) from stu where name='zhangsan';";

  if(sqlite3_exec(db, sql, callback,NULL , &errmsg) != SQLITE_OK)
  {
    printf("%s", errmsg);
  }
  else
  {
    printf("select done.\n");
  }
}

int do_query1(sqlite3 *db)
{
  char *errmsg;
  char ** resultp;
  int nrow;
  int ncolumn;

  if(sqlite3_get_table(db, "select * from stu", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
  {
    printf("%s\n", errmsg);
    return -1;
  }
  else
  {
    printf("query done.\n");
  }

  int i = 0;
  int j = 0;
  int index = ncolumn;

  for(j = 0; j < ncolumn; j++)
  {
    printf("%-10s ", resultp[j]);
  }
  putchar(10);

  for(i = 0; i < nrow; i++)
  {
    for(j = 0; j < ncolumn; j++)
    {
      printf("%-10s ", resultp[index++]);
    }
    putchar(10);
  }

return 0;
}


int main(int argc, const char *argv[])
{

//创建库
  sqlite3 *db;
  char *errmsg;
  int n;
//打开数据库
  if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
  {
    printf("%s\n", sqlite3_errmsg(db));
    return -1;
  }
  else
  {
    printf("open DATABASE success.\n");
  }
//创建表单
  if(sqlite3_exec(db, "create table if not exists stu(id int, name char , sex char , score int);",
        NULL, NULL, &errmsg) != SQLITE_OK)
  {
    printf("%s\n", errmsg);
  }
  else
  {
    printf("Create or open table success.\n");
  }

//1、2、3、4、5功能的目录,while保持每次执行完再选择相应操作
  while(1)
  {
    printf("********************************************\n");
    printf("1: insert  2:query  3:delete 4:update 5:quit\n");
    printf("********************************************\n");
    printf("Please select:");
    scanf("%d", &n);

    switch(n)
    {
      case 1:
        do_insert(db);
        break;
      case 2:
        do_query(db);
      //  do_query1(db);
        break;
      case 3:
        do_delete(db);
        break;
      case 4:
        do_update(db);
        break;
      case 5:
        printf("main exit.\n");
        sqlite3_close(db);
        exit(0);
        break;
      default :
        printf("Invalid data n.\n");
    }

  }




  return 0;
}

运行
gcc student.c -lsqlite
./a.out

c

sprintf()

image.png

getchar和scanf()

用户回车\n
输入的字符会暂时存在缓冲区,等待getchar和scanf拿走

scanf()遇到 \n退出,不拿走\n
getchar()遇到\n退出,会拿走\n
image.png
getchar()和scanf()
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nocobase快速上手 - 开发第一个插件

在前面的几篇博文中&#xff0c;记录了在Nocobase中配置collection和界面&#xff0c;这篇文章开始插件的开发。插件可以扩展Nocobase的业务能力&#xff0c;解锁更强大的功能。 环境搭建 创建插件需要配置nocobase的开发环境&#xff0c;笔者采用的是clone 官方代码repo的方…

【Centos7】解决 CentOS 7 中出现 “xx: command not found“ 错误的全面指南

【Centos7】初探xx:command not found解决方案 大家好 我是寸铁&#x1f44a; 【Centos7】解决 CentOS 7 中出现 “xx: command not found” 错误的全面指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 经常有小伙伴问我&#xff0c;xx:command not found怎么办&#xff1…

GPT-4o如何重塑AI未来!

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 GPT-4o似乎是一个针对GPT-4模型进行优化的版本&#xff0c;它在性能、准确性、资源效率以及安全和…

http请求方法get和post的区别

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 关于http请求方法get和post的区别真正区别存在问题的区别 关于http请求方法get和post的区别 真正区别 实际上二者差异不大,在http里面,使用get的场景,使用post也可以;同样,使用post的场景…

22 、系统安全

新的服务器到手&#xff0c;部署服务器初始化。 1、配置ip地址 网关dns解析&#xff08;static&#xff09;内网和外网。 2、安装源&#xff0c;外网&#xff08;在线即可&#xff09;&#xff0c;内网&#xff08;只能用源码包编译安装&#xff09;。 3、磁盘分区&#xff…

浅谈安科瑞ASJ10-LD1A智能漏电继电器的设计与应用-安科瑞 蒋静

一 产品简介 功能 ASJ10-LD1A安科瑞智能电力继电器 剩余电流保护可与低压断路器或低压接触器等组成组合式的剩余电流动作保护器&#xff0c;主要适用于交流50Hz&#xff0c;额定电压为400V及以下的TT或TN系统配电线路&#xff0c;防止接地故障电流引起的设备和电气火灾事故&a…

数字水印 | 盲水印嵌入:量化索引机制 QIM

目录 1 什么是量化索引调制&#xff1f;1.1 为什么使用 QIM&#xff1f;1.2 QIM 的算法思想1.3 什么是量化操作&#xff1f;1.4 论文中对 QIM 的介绍 2 盲水印论文中的实际应用2.1 均匀量化器2.2 对论文的分析 &#x1f607;说明&#xff1a;本文中的载体信息 原始信息…

VS远程调试步骤

1、背景 生产环境是没有开发环境的&#xff0c;&#xff0c;那生产环境上运行的程序&#xff0c;出了问题&#xff0c;如何远程调试它&#xff1f; 可以借助VS的远程调试。 2、步骤 1&#xff09;将E:\VS2019\install\Common7\IDE\Remote Debugger目录整体拷贝到生产环境机器…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 、auto 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长&#xff0c;再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析&#xff0c;注释。 &#xff08;1 探讨一&#xff09;当独占指针指向数组时&#xff0c;其默认的删除器是…

微服务-Nacos-安装-集成SpringBoot

微服务-SpringCloud-ALibaba-Nacos Nacos 是阿里巴巴推出的 SpringCloud的组件 官网:什么是 Nacos 主要是为了解决微服务的架构中 服务治理的问题服务治理就是进行服务的自动化管理&#xff0c;其核心是服务的注册与发现。 服务注册&#xff1a;服务实例将自身服务信息注册…

【vue】vue2项目将npm包管理器修改为yarn包管理器

【vue】vue2项目将npm包管理器修改为yarn包管理器 1.删除node_modules文件夹、package-lock.json文件 2.全局安装yarn npm install -g yarn3.安装项目依赖 yarn install如果执行yarn install 报类似以下这种版本不兼容错误&#xff0c;执行 yarn config set ignore-engines …

[SWPUCTF 2023 秋季新生赛]Junk Code

方法一&#xff1a;手动去除 将所有E9修改为90即可 方法二&#xff1a;花指令去除脚本 start_addr 0x0000000140001454 end_addr 0x00000001400015C7 print(start_addr) print(end_addr) for i in range(start_addr,end_addr):if get_wide_byte(i) 0xE9:patch_byte(i,0x9…

【激光雕刻机上位机的成品软件】核心功能 - 参考wecreat

Software | WeCreat MakeIt! https://wecreat.com/pages/software 体验软件如上&#xff0c;自行下载体验。 价格5W&#xff0c;本人为 wecreat 创立之初上位机软件开发的核心员工&#xff0c;详细内容私信我。 由于该公司快3个月未给我竞业补偿了&#xff0c;对我不仁那我…

华为昇腾310 ATC模型转换、CPP推理案例使用

参考: https://cnloong.blog.csdn.net/article/details/139293689 https://gitee.com/ascend/samples/tree/master/inference/modelInference/sampleResnetQuickStart/cpp https://developer.huawei.com/consumer/cn/forum/topic/0203148227811150357 官方图像分类案例下载: …

数据结构与算法笔记:基础篇 - 链表(上):如何实LRU缓存淘汰算法

概述 本章聊聊 “链表” 这个数据结构。学习链表有什么作用&#xff1f; 我们先来讨论一个经典的链表应用场景&#xff0c;那就是 LRU 缓存淘汰算法。 缓存是一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中有着非常广泛地应用&#xff0c;比如场景的 CPU 缓…

字符串-将str1编辑成str2所需最小代价(hard)

一、题目描述 二、解题思路 该题目使用动态规划的思想来解决问题 刚开始我还在想&#xff0c;删除添加的操作可以等价为替换操作&#xff0c;如果替换操作的Cost大于删除添加组合操作的Cost之和就需要把 rcdcic。 但是在动态规划中&#xff0c;如果对三种不同的操作方式进行…

C++ 的 Tag Dispatching(标签派发) 惯用法

目录 1.概述 2.标准库中的例子 3.使用自己的 Tag Dispatching 3.1.使用 type traits 技术 3.2.使用 Type_2_Type 技术 4.Tag Dispatching的使用场景 5.总结 1.概述 一般重载函数的设计是根据不同的参数决定具体做什么事情&#xff0c;编译器会根据参数匹配的原则确定正确…

域内攻击--->基于资源的约束委派(RBCD)

不同于约束和非约束委派&#xff0c;基于资源的约束性委派可以就难的多了&#xff01;&#xff01; 前方高能 &#xff0c;准备上车&#xff01;&#xff01; 目录 1.基于资源的约束性委派(RBCD) 2.谁能设置RBCD 3.机器入域账号的普及 4.域树的搭建 5.配置RBCD 6.通过域创…

【前端部署——vercel】部署next.js使用了prisma的项目

部署流程参考 https://blog.csdn.net/qq_51116518/article/details/137042682 问题 PrismaClientInitializationError: Prisma has detected that this project was built on Vercel, which caches dependencies. This leads to an outdated Prisma Client because Prisma’s …

kali系统baopoWiFi密码

kali系统baopoWiFi密码,仅供学习 取决强大的密码字典,如果别人密码设置的足够安全,也无法破解成功,并不是100%破解 一、准备一个无线网卡&#xff0c;需要免驱动&#xff0c;最好知道频率2.4HGZ还是5.0GHZ 二、插上USB接口&#xff0c;vmware模拟器选择连接虚拟机 三、输入命…