数据库有关c语言
数据库的概念
SQL(Structured Query Language)是一种专门用来与数据库进行交互的编程语言,它允许用户查询、更新和管理关系型数据库中的数据。关系型数据库是基于表(Table)的数据库,其中表由行(Row)和列(Column)组成,每一行代表一个记录(Record),每一列代表一个字段(Field)。
非关系型数据库MongoDB
1、分类: 大型 中型 小型
ORACLE MYSQL/MSSQL SQLITE DBII powdb
关系型数据库
2、名词:
DB 数据库 select update database
DBMS 数据库管理系统
MIS 管理信息系统
OA 办公自动化
3、嵌入式数据库:
sqlite3 www.sqlite.org www.kernal.org
GNU
特点:
1、开源 C语言开发
2、代码量少 1万行左右,总大小10M以内
3、绿色软件无需安装
4、文件型数据库,可以移动。
5、数据容量最大 2T
4、sqlite3的安装: LTS long term support
1、在线安装 :
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
gcc test.c -lsqlite3 -lpthread
2、验证是否安装成功:
sqlite3 --version
sqlite3 --help
5、sqlite3的使用:
0、启动sqlite3
sqlite3 xxx.db
===>用sqlite3 来打开一个名称为test.db的本地数据库。
出现如下提示符:表明数据库管理系统启动。
sqlite>
退出数据库:
.q 命令
注意:如果一直出现如下符号:
...>
则写';'结束。
sql命令
以下所有命令必须在 sqlite> 后执行。
创建一个数据库:
1、touch xxx.db
2、sqlite3 xxx.db
系统维护命令:===> .help
出现所有相关的系统维护命令,都是以 "."开头。
.database 列出当前库和系统中那个文件在关联
.tables 列出当期数据库中的所有表
.schema xxx 列出当前指定的xxx表结构
.dump user ===>导出数据库
重定向
sqlite3 test.db .dump > 123.sql
sqlite3 xxx.db < test.sql ===>导入数据库
sql语句
标准SQL语句:===》通用语法在其他平台可以直接使用。struct query language;
注意:所有的sql语句都以';'结尾。
创建一个表:ddl
create table 表名(表字段1,表字段2,...);
eg: create table user(id,name,age); char
注意:以上表的表字段,支持如下数据类型。int text real blob
默认是text类型。char
;
create table 表名 (表字段 类型,表字段 类型,。。。。);
eg:
create table user(id int ,name char,age int);
删除一个表:
drop table 表名;
eg:drop table user;
数据库常规操作: 增加 删除 修改 查询
向表中增加数据:
insert into 表名 (字段名称 ) values (值名称);
eg:insert into user (id,age) values (1,10);
insert into user values(3,"wang",11);
insert into user (age) values ( 12);
查询表中的数据:
select 列名 from 表名 条件;
eg:select * from user ;
select id from user;
select id,name from user where not age <30
where name like '三一' % _ 通配符
asc
select *from user where age>20 or age<50 order by age desc limit 2 ;
&& ||
修改表中数据:
update 表名 set 表字段 = 值 满足条件:
eg: update user set id = 1 where name = 'li';
update user set id = 1 where name = "li" and passwd = "123";
update user set id = 2 where name = "li" or name = "zhao";
删除表中数据:
delete from 表名 满足条件:
eg:delete from user ; ///删除表中所有数据
delete from user where id = 1; ///删除id=1 的数据;
delete from user where id =1 and name = "zhang";
delete from user where id = 1 or id = 2;
>2022-1-1 and <2018-12-31
插入时间列 int int;
unicode
CREATE TABLE user1(id int,name char,age int,dt datetime);'2022-07-01 19:00:00'
insert into user1 values (2,'张三',23,datetime('now','+8 hours'));
自动增长列
sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime); 主键
sqlite> insert into user3 (NULL,'李四',23,datetime('now')); (void*)0
asc
where (group by having) order by [desc] limit;
select * from user where id<10 order by id limit 2;
维护命令:
1、数据的导出:
sqlite3 xxx.db .dump > xxx.sql
//将数据库名称为xxx的数据库整体导出到脚本中。
2、数据的导入:
sqlite3 xxx.db < xxx.sql
3、可视化工具安装:
sudo apt-get install sqlitebrowser
sqlite3 数据库编程接口:
1、需要的头文件
sqlite3.h
2、编译过程
-lsqlite3
3、编程框架:
打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库
sqlite3.h
3.1 打开数据库: sqlite3_open
int sqlite3_open(char * path,sqlite3 ** db);
功能:打开指定path路径+文件名称的数据库,并将
打开的地址指向db变量的句柄。
参数:path 要打开的数据库路径+名称
db 要打开的数据库地址指针
返回值:成功 0
失败 -1;
3.2 关闭数据库: sqlite3_close
int sqlite3_close(sqlite3 *db);
功能:关闭指定的数据库
参数:要关闭的数据库地址
返回值:成功 0
失败 -1;
3.3 数据库操作:
查询操作:sqlite3_get_table(); select
int sqlite3_get_table(sqlite3 *db,char *sql,
char *** rest,int *nrow,int *ncol,
char ** errmsg);
功能:在db数据库上执行sql查询语句,并将执行的
结果集返回到rest地址上,同时返回查询的行和列。
参数:db 要执行查询语句的数据库
sql 要执行的select查询语句
rest 查询的结果集是一个三级指针
nrow 查询的结果的行数
ncol 查询的结果的列数
errmsg 如果执行有错误,则存储错误。
返回值:成功 0
失败 非0;
执行sql语句:sqlite3_exec(); insert delete update
int sqlite3_exec(sqlite3 *db,char *sql,callback fun,
void * arg,char ** errmsg);
功能:在db数据库上执行sql 非查询语句。
并将结果返回。
参数:db 要执行sql的数据库
sql 要执行的非查询sql语句。
fun 如果该函数要执行查询语句,则该回调函数
用来回收查询的结果。
arg 回调函数的参数,如果没有回调函数则该参数为NULL;
errmsg 执行过程中的错误信息。
返回值:执行成功 0
失败 非0 ;
int fun(void *arg ,int f_num,char ** f_value,
char ** f_name)
功能:该函数用于sqlite3_exec执行select语句的
结果集返回数据。
参数:arg 由sqlite3_exec传入的参数
f_num 执行该命令所返回测结果集的字段个数。
f_value 查询结果集中的字段的值。
f_name 查询结果集中的字段的名称。
返回值:成功 0
失败 非0
注意:该回调函数必须有返回值,否则可能导致查询异常。
使用:打印一张表
#include <stdio.h>
#include <sqlite3.h>
int show(void*arg,int col,char**result,char**title)
{static int flag = 0;int i = 0 ;if(0 == flag){for(i = 0 ;i<col;i++){printf("%s\t",title[i]);}printf("\n");flag = 1;}for(i = 0 ;i<col;i++){printf("%s\t",result[i]);}printf("\n");return 0;
}
int main()
{sqlite3* db=NULL;int ret = sqlite3_open("/home/linux/20240812/sec4/aaa.db",&db);if(SQLITE_OK!=ret){fprintf(stderr,"cant opendb,%s\n",sqlite3_errstr(ret));sqlite3_close(db);return 1;}char sql_cmd[128]="select * from user;";char * errmsg=NULL;ret = sqlite3_exec(db,sql_cmd,show,NULL,&errmsg);if(SQLITE_OK!=ret){fprintf(stderr,"exec error,%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);printf("Hello World!\n");return 0;
}
提升插入速度
在SQLite3中,提升数据插入速度的方法主要包括以下几个方面:
1. 使用事务(Transaction)
事务可以将多个插入操作组合在一起,从而减少每次插入操作的开销。在SQLite中,每调用一次sqlite3_exec()
函数,就会隐式地开启一个事务。如果插入一条数据就调用一次该函数,事务会被反复地开启和关闭,这会增大IO量。因此,在插入数据前显式开启事务,并在插入完成后一起提交,可以显著提高IO效率,进而加快数据插入速度。
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
int main()
{char * errmsg=NULL;sqlite3* db=NULL;int ret = sqlite3_open("/home/linux/20240812/sec4/aaa.db",&db);if(SQLITE_OK!=ret){fprintf(stderr,"cant opendb,%s\n",sqlite3_errstr(ret));sqlite3_close(db);return 1;}char sql_cmd[1024]={0};sprintf(sql_cmd,"create table if not exists dict""(x INTEGER PRIMARY KEY ASC,word char,mean text);");ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);if(SQLITE_OK!=ret){fprintf(stderr,"exec error create table,%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}bzero(sql_cmd,sizeof(sql_cmd));sprintf(sql_cmd,"delete from dict");ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);if(SQLITE_OK!=ret){fprintf(stderr,"exec error create table,%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}FILE* fp = fopen("/home/linux/dict.txt","r");if(NULL == fp){perror("fopen");return 1;}// BEGIN TRANSACTION;bzero(sql_cmd,sizeof(sql_cmd));sprintf(sql_cmd,"BEGIN TRANSACTION;");ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);if(SQLITE_OK!=ret){fprintf(stderr,"exec error create table,%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}while(1){//char sql_cmd[128]="insert into user values(7,'bbb',11);";char line[512]={0};if(NULL == fgets(line,sizeof(line),fp)){break;}char* word = strtok(line," ");char *mean = strtok(NULL,"\r");bzero(sql_cmd,sizeof(sql_cmd));sprintf(sql_cmd,"insert into dict values(NULL,\"%s\",\"%s\");",word,mean);ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);if(SQLITE_OK!=ret){fprintf(stderr,"exec error,%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}}bzero(sql_cmd,sizeof(sql_cmd));sprintf(sql_cmd,"COMMIT;");ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);if(SQLITE_OK!=ret){fprintf(stderr,"exec error create table,%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);printf("Hello World!\n");return 0;
}
2. 关闭写同步(Synchronous OFF)
SQLite的synchronous
模式控制数据写入物理存储的同步方式。该模式有三种可选状态:full
、normal
、off
。其中,full
写入速度最慢但保证数据安全性,而off
可以加速数据库操作,但在系统崩溃或断电时可能会导致数据库损毁。如果应用场景允许少量数据丢失,可以将synchronous
设置为OFF
以提升插入速度。
通过设置PRAGMA synchronous = OFF;
,可以关闭数据库的同步写入功能,这将允许SQLite在将数据传递给操作系统后不等待磁盘写入完成就继续执行,从而提高插入速度。但请注意,这可能会增加数据丢失的风险。
#include <stdio.h>
#include <sqlite3.h>
#include <string.h> int main()
{ char *errmsg = NULL; sqlite3 *db = NULL; int ret = sqlite3_open("/home/linux/20240812/sec4/aaa.db", &db); if (SQLITE_OK != ret) { fprintf(stderr, "cant open db, %s\n", sqlite3_errstr(ret)); return 1; } // 关闭同步 char *pragma_cmd = "PRAGMA synchronous = OFF;"; ret = sqlite3_exec(db, pragma_cmd, NULL, NULL, &errmsg); if (SQLITE_OK != ret) { fprintf(stderr, "exec error setting synchronous, %s\n", errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } // ... (其他数据库操作,如创建表、插入数据等) sqlite3_close(db); printf("Hello World!\n"); return 0;
}
相关文章:

数据库有关c语言
数据库的概念 SQL(Structured Query Language)是一种专门用来与数据库进行交互的编程语言,它允许用户查询、更新和管理关系型数据库中的数据。关系型数据库是基于表(Table)的数据库,其中表由行(…...

【网页播放器】播放自己喜欢的音乐
// 错误处理 window.onerror function(message, source, lineno, colno, error) {console.error("An error occurred:", message, "at", source, ":", lineno);return true; };// 检查 particlesJS 是否已定义 if (typeof particlesJS ! undefi…...

【第27章】Spring Cloud之适配Sentinel
文章目录 前言一、准备1. 引入依赖2. 配置控制台信息 二、定义资源1. Controller2. Service3. ServiceImpl 三、访问控制台1. 发起请求2. 访问控制台 总结 前言 Spring Cloud Alibaba 默认为 Sentinel 整合了 Servlet、RestTemplate、FeignClient 和 Spring WebFlux。Sentinel…...

怎么debug python
1、打开pycharm,新建一个python程序,命名为excel.py。 2、编写代码。 3、点击菜单栏中的“Run”,在下拉菜单中选择“debug excel.py”或者“Debug...”,这两个功能是一样的,都是调试功能。 4、调试快捷键:C…...

Java 递归
目录 1.A方法调用B方法,很容易理解! 2.递归:A方法调用A方法,就是自己调用自己! 3. 递归的优点: 4. 递归结构包括两个部分: 5. 递归的三个阶段 6. 递归的缺点&#…...

获取业务库的schema信息导出成数据字典
获取业务库的schema信息导出成数据字典 场景:需要获取业务库的schema信息导出成数据字典,以下为获取oracle与mysql数据库的schema信息语句 --获取oracle库schema信息 selecttt1.owner as t_owner,tt1.table_name,tt1.column_name,tt1.data_type,tt1.dat…...

力扣: 快乐数
文章目录 需求分析代码结尾 需求 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 …...

一般位置下的3D齐次旋转矩阵
下面的矩阵虽然复杂,但它的逆矩阵求起来非常简单,只需要在 sin θ \sin\theta sinθ 前面加个负号就是原来矩阵的逆矩阵。 如果编程序是可以直接拿来用的,相比其它获取一般旋转轴不经过原点的三维旋转矩阵的途径或算法,应该能…...

每日一题——第八十六题
题目:写一个函数,输入一个十进制的数,将其转换为任意的r进制数 #include<stdio.h> void convertToBaseR(int num, int r); int main() {int num, r;printf("请输入十进制的整数:");scanf_s("%d", &…...

十、组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式能够让客户端以统一的方式对待单个对象和对象集合,使得客户端在处理复杂树形结构的时候,可以以…...

一分钟了解网络安全风险评估!
网络安全风险评估是一种系统性的分析过程,旨在识别和评估网络系统中的潜在安全风险。这个过程包括识别网络资产、分析可能的威胁和脆弱性、评估风险的可能性和影响,以及提出缓解措施。网络安全风险评估有助于组织了解其网络安全状况,制定相应…...

【springsecurity】使用PasswordEncoder加密用户密码
目录 1. 导入依赖2. 配置 PasswordEncoder3. 使用 PasswordEncoder 加密用户密码4. 使用 PasswordEncoder 验证用户密码 1. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifac…...

从0到1实现线程池(C语言版)
目录 🌤️1. 基础知识 ⛅1.1 线程概述 ⛅1.2 linux下线程相关函数 🌥️1.2.1 线程ID 🌥️1.2.2 线程创建 🌥️1.2.3 线程回收 🌥️1.2.4 线程分离 🌤️2. 线程池概述 ⛅2.1 线程池的定义 ⛅2.2 为…...

Visual studio自动添加头部注释
记事本打开VS版本安装目录下的Class.cs文件 增加如下内容:...

【C#生态园】提升性能效率:C#异步I/O库详尽比较和应用指南
优化异步任务处理:C#异步I/O库全面解析 前言 在C#开发中,异步I/O是一个重要的主题。为了提高性能和响应速度,开发人员需要深入了解各种异步I/O库的功能和用法。本文将介绍几个常用的C#异步I/O库,包括Task Parallel Library、Asy…...

管理医疗AI炒作的三种方法
一个人类医生和机器人医生互相伸手。 全美的医院、临床诊所和医疗系统正面临重重困难。他们的员工队伍紧张且人员短缺,运营成本不断上升,服务需求常常超过其承受能力,限制了医疗服务的可及性。 人工智能应运而生。在自ChatGPT推出将AI推向聚…...

VMware Workstation Pro Download 个人免费使用
参考 VMware Workstation Pro Download...

DevOps平台搭建过程详解--Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台
一、环境说明 1.1CI/CD CI即为持续集成(Continue Integration,简称CI),用通俗的话讲,就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等;(Jenkins) CD即持续交付Con…...

Nginx之日志切割,正反代理,HTTPS配置
1 nginx日志切割 1.1 日志配置 在./configure --prefixpath指定的path中切换进去,找到log文件夹,进去后找到都是对应的日志文件 其中的nginx.pid是当前nginx的进程号,当使用ps -ef | grep nginx获得就是这个nginx.pid的值 在nginx.conf中…...

Mysql数据量大,如何拆分Mysql数据库(垂直拆分)
垂直拆分(Vertical Partitioning)是一种将数据库按照业务模块或功能进行拆分的方法,目的是将不同模块的数据放到不同的数据库中,从而减少单个数据库的压力,提高系统的性能和可扩展性。垂直拆分适用于数据量大且业务模块…...

机器人可能会在月球上提供帮助
登月是我们这个时代最具标志性的事件之一,这可能还算轻描淡写了:这是我们迄今为止在物理上探索得最远的一次。我听过一些当时的老广播,它们可以让你想象出这次航行的重要性。 现在,研究人员表示,我们可能很快就能重返…...

真实案例分享:零售企业如何避免销售数据的无效分析?
在零售业务的数据分析中,无效分析不仅浪费时间和资源,还可能导致错误的决策。为了避免这种情况,企业必须采取策略来确保他们的数据分析工作能够产生实际的商业价值。本文将通过行业内真实的案例,探讨零售企业如何通过精心设计的数…...

ctfshow-文件包含
web78 <?phpif(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__); } 判断是否存在file参数 如果存在 将包含这个参数值 文件 php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执…...

Qt事件处理机制
用qt实现简单闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H #include<QPushButton> #include<QTextEdit> #include<QLabel> #include <QWidget> #include<QMouseEvent> #include<QPoint> #include<QTime> #include<QTimer&…...

vue axios 如何读取项目下的json文件
在 Vue 项目中,使用 axios 读取本地的 JSON 文件可以通过将 JSON 文件放置在 public 目录中,然后通过 axios 发起请求读取。 步骤: 将 JSON 文件放置在 public 目录下: Vue 项目中的 public 目录是静态资源目录,项目编…...

燃气涡轮发动机性能仿真程序GSP12.0.4.2使用经验(二):使用GSP建立PG9351FA燃气轮机性能仿真模型
目录 一、PG9351FA燃气轮机简介及热力循环参数二、基于GSP的性能仿真模型设置环境参数设置进气道参数设置压气机参数设置燃烧室参数设置透平(涡轮)参数设置转子负载参数燃油流量外部控制 三、仿真结果四、其它 一、PG9351FA燃气轮机简介及热力循环参数 …...

迟滞比较器/施密特触发器
功能 从下面原理图像看来,只有在达到上下阈值才会出现输出电平的转换,这样防止信号的杂波跳变。而且每次的阈值是随着输出而变化的,当输出高时,阈值如下图中,V_PV_N V_R*( RF/(R1RF) )VH*( R1/(R1RF) );当输出低时&a…...

LeetCode_sql_day22(1112.每位学生的最高成绩)
描述:1112.每位学生的最高成绩 表:Enrollments ------------------------ | Column Name | Type | ------------------------ | student_id | int | | course_id | int | | grade | int | ------------------------ (st…...

OFDM信号PARP的CCDF图
文章目录 引言代码代码疑难解答参考文献 引言 本书主要参考了文献1,但实际上该书中符号和表述的错误非常多(只能说棒子是这样的);同时因为发表时间的关系,很多MATLAB代码进行了更新,原书提供的代码已经无法…...

LeetCode之高频SQL50题
查询 1757. 可回收且低脂的产品 584. 寻找用户推荐人 595. 大的国家 1148. 文章浏览 I 1683. 无效的推文 连接 1378. 使用唯一标识码替换员工ID 1068. 产品销售分析 I 1581. 进店却未进行过交易的顾客 197. 上升的温度 1661. 每台机器的进程平均运行时间 577. 员工…...