数据库有关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)是一种将数据库按照业务模块或功能进行拆分的方法,目的是将不同模块的数据放到不同的数据库中,从而减少单个数据库的压力,提高系统的性能和可扩展性。垂直拆分适用于数据量大且业务模块…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...