QT/C语言 实现数据库sqlite3

news2025/1/10 11:26:14

QT/C语言 实现数据库sqlite3

  • 【1】引入数据库
  • 【2】下载移植sqlite3
    • 1.移植sqlite3
    • 2.使用sqlite3
    • 3.sqlite3中的数据类型
    • 4.常用的SQL语句(全部都是分号结尾)
      • (1)新建表格
      • (2)往表格中插入数据
      • (3)查询表格中的数据
      • (4)删除表格中的数据
      • (5)修改表格中的数据
  • 【3】C语言调用sqlite3
    • 1.接口函数介绍
      • (1)新建/打开数据库文件
      • (2)数据的操作--》执行SQL语句, 新建表格增删改查
      • (3)关闭数据库
    • 2.编译命令
  • 【4】QT中数据库有关的类和方法
    • 1.数据库有关的类
    • 2.思路和步骤
      • (1)安装数据库的驱动
      • (2)设置数据库文件的名字
      • (3)打开数据库
      • (4)操作数据库--》增删改查
      • (5)关闭数据库
    • 3.其它的接口函数介绍
      • (1)分析函数调用失败的原因
    • 4.如何获取查询结果
      • (1)获取查询结果
      • (2)QVariant万能的数据类型
    • 5.QT程序操作多个数据库文件,操作多个表格

在这里插入图片描述


【1】引入数据库

1.QT实现登录注册
文件IO,配合字符串的拆分,拼接
比如:新增修改密码功能(假如修改李四的密码)–》原来的做法非常不好写,需要定位李四的位置,然后替换掉李四原本的信息
张三@123456
李四@456789
数据库:用来存放数据的仓库,用文件来存放数据,数据最终是在电脑的硬盘上存储的
数据库提供了SQL语句辅助我们实现数据的增删改查基本操作,非常的方便
SQL:结构查询语句,数据库中专门用来操作数据的语句
数组,string,容器: 用来存放,用内存存放数据,程序退出,数据就没有了
文本文件:也可以存放数据,也是在硬盘上存储,但是操作不方便

2.核心知识点
常用的SQL语句
C语言调用sqlite3提供的接口函数实现数据库的操作
QT中的数据库操作
市面上主流的数据库软件
1.主流的数据库
甲骨文oracle --》Oracle Database
瑞典AB --》MySQL
IBM --》DB2
微软 --》SQL server
嵌入式开发 --》sqlite3 小型,开源的数据库软件

【2】下载移植sqlite3

https://www.sqlite.org/download.html //下载网址

1.移植sqlite3

命令行无法使用方向键,原因是移植的时候少了一个插件,解决方法提前下载安装插件,然后重新移植一遍就可以了

安装插件:  sudo  apt-get install libreadline-dev
          第一步:把下载的源码包拷贝到你的家目录,然后解压 
                        tar  -zxf sqlite-autoconf-3360000.tar.gz
          第二步:进入解压之后的文件夹,执行configure这个脚本会自动生成Makefile
                       ./configure  
          第三步:  执行make命令,自动编译得到sqlite3
          第四步:把编译好的sqlite3拷贝一份到/bin,方便你可以在任意位置直接执行sqlite3

2.使用sqlite3

1.新建数据库文件(后缀名默认是.db结尾)

sqlite3   xxx.db      //  xxx是你的数据库文件的名字
SQLite version 3.36.0 2021-06-18 18:36:39   //版本和发布时间
Enter ".help" for usage hints.    //输入.help可以获取使用帮助
sqlite>                                       //sqlite3的命令行终端

2.sqlite3的内置命令(sqlite3这个软件本身自带的命令,这些命令可以通过.help查看,全部都是小数点开头)

.quit        退出sqlite3
.exit        退出sqlite3
.tables    查看当前数据库文件中表格的名字
`注意:内置命令是不需要分号结尾的`

3.sqlite3中的数据类型

bit              表示二进制01
tinyint        8位的整数
smallint     16位的整数
int               32位的整数
float            小数
real             小数,类似于double
char[]          字符串
text             文本类型,字符串

4.常用的SQL语句(全部都是分号结尾)

(1)新建表格

create table 表的名字 (字段名1 修饰符,字段名2 修饰符…);
字段 姓名 年龄

比如:create table  stutable(name char[10],age int);
create table if not exists 表的名字 (字段名1 修饰符,字段名2  修饰符........)if not exists --》表格存在,就不创建
表格不存在,就新建

注意:同一个数据库文件中不能出现两个同名表格

create table if not exists 表的名字 (字段名1 修饰符 not null,字段名2  修饰符........);
not null表示字段1不允许传递空值
create table if not exists 表的名字 (字段名1 修饰符 not null,字段名2  修饰符  unique,........);
比如:create table stutable (name text,age int,id text unique);   //限制id这个字段具有唯一性
unique表示字段2不允许有重复值

(2)往表格中插入数据

insert into 表的名字  values (字段1对应的值,字段2对应的值........);
       比如:insert into stutable values("李四",19);   //往stutable表格中插入了数据

(3)查询表格中的数据

select  * from 表的名字;                 // *表示查看表格中所有的信息
select  name from 表的名字;              // 我只想查看name
select  *  from 表的名字  where 条件;    //带条件的查询
        比如:select * from stutable where age>=18;                               //查询age大于等于18
                  select * from stutable where age>=16 and age<=18;              //多个条件  and 并且
                  select * from stutable where age>=16 or name="张三";           //多个条件  or 或者
   select * from 表的名字 where name like "张%";     //like配合%模糊配置字符串
        比如:select * from stutable where name like "张%";
                  select * from stutable where name like "%建国";
                  select * from stutable where name like "张%山";
select  * from 表的名字 order by age desc;           //按照age降序查询
select  * from 表的名字 order by age asc;            //按照age升序查询    

(4)删除表格中的数据

delete from 表的名字 where 条件;
        比如:delete from stutable where name="wangwu";
             delete from stutable where name like "张%";
删除整个表格
   drop  table  表的名字;

(5)修改表格中的数据

            update 表的名字  set 字段名=新的值   where 条件;
                 比如:update stutable set score=61 where name="lisi";  //把lisi的分数改成61分
                           update stutable set name="张散散",age=19  where name="张三";    //同时修改名字和年龄

【3】C语言调用sqlite3

C语言调用sqlite3提供的接口函数实现数据的操作

1.接口函数介绍

(1)新建/打开数据库文件

int sqlite3_open(const char *filename,sqlite3 ppDb);

返回值:成功 返回SQLITE_OK
失败 返回sqlite3.h的421行定义的某个错误码
参数:filename --》你要新建/打开的数据库文件名字
ppDb --》数据库的句柄

(2)数据的操作–》执行SQL语句, 新建表格增删改查

int sqlite3_exec(
sqlite3,                                 //数据库的句柄
const char *sql,                     //你要执行的SQL语句
int (callback)(void,int col,charstr1,char*str2),  //函数指针,-->如果你执行的是查询语句,就必须传递这个参数
参数:  col --》表格列数
str1 --》你查询的结果
str2 --》存放表格的字段名
特点:select查询的结果有几个,callback指向的函数就会被调用几次
select查询没有结果(不是查询失败,仅仅只是查询没有结果而已),callback指向的函数不会被调用
void *,                                   //传递给callback的第一个参数
char **errmsg                       //存放错误信息,执行SQL语句产生的错误信息
);
返回值:成功  返回SQLITE_OK
              失败  返回sqlite3.h的421行定义的某个错误码

(3)关闭数据库

int sqlite3_close(sqlite3*);

2.编译命令

gcc *.c  -o main  -pthread  -ldl

【4】QT中数据库有关的类和方法

注意:使用了数据库有关的类,必须添加sql这个库

1.数据库有关的类

QSqlDatabase  --》用来表示数据库对象
QSqlQuery        --》操作数据库,实现数据的增删改查

数据库的驱动(为了区分不同的数据库软件)
由于市面上的数据库软件特别多,QT也不知道你的电脑上究竟安装的是哪个数据库软件,所以QT针对市面上主流的数据库软件提供了对应的驱动,如果你电脑上使用了某个版本的数据库软件,你只需要安装对应的驱动即可(驱动名字在QT助手都有介绍)

2.思路和步骤

(1)安装数据库的驱动

[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
返回值:  成功  返回QSqlDatabase对象
参数:type --》数据库的驱动名字
QDB2 --》IBM公司的数据库
QMYSQL --》MySql
QSQLITE --》sqlite3
connectionName --》数据库的连接名(如果你的程序操作了多个不同的数据库文件,需要用到这个参数)

(2)设置数据库文件的名字

void QSqlDatabase::setDatabaseName(const QString &name)
参数:name --》数据库的名字

(3)打开数据库

bool QSqlDatabase::open()
返回值: 成功 true  失败  false

(4)操作数据库–》增删改查

QSqlQuery::QSqlQuery(QSqlDatabase db)
参数: db --》数据库对象
bool QSqlQuery::exec(const QString &query)
返回值:成功 true  失败  false
参数:query --》你要执行的SQL语句

(5)关闭数据库

void QSqlDatabase::close()

3.其它的接口函数介绍

(1)分析函数调用失败的原因

QSqlError QSqlDatabase::lastError() const
返回值: QSqlError对象专门用来保存错误信息
QString QSqlError::text() const  //返回字符串格式的错误信息,方便用户阅读

4.如何获取查询结果

(1)获取查询结果

bool QSqlQuery::next()   //判断有没有查询结果,有  返回true,没有 返回false
while(myquery.next())
{
打印查询结果;
qDebug()<<myquery.value(0).toString();   //打印商品名称
qDebug()<<myquery.value(1).toDouble();  //打印商品价格
}
QVariant QSqlQuery::value(int index) const
                             返回值:QVariant是QT中万能的数据类型
                                参数: index --》字段的索引号,从0开始
                                           比如:商品名称  --》索引号0
                                                     价格          --》索引号1
     QVariant QSqlQuery::value(const QString &name) const
                             返回值:QVariant是QT中万能的数据类型
                                参数: name --》字段的名字
                                           比如:商品名称  --》name
                                                     价格          --》price

(2)QVariant万能的数据类型

QVariant类型的对象---》可以转换成基本数据类型
                       QVariant类里面提供大量的toxxxx()方法进行转换
                                          toString()   toDouble()   toInt()
基本数据类型           ---》可以转换成QVariant类型的对象
                      QVariant类里面提供大量的构造函数,可以把基本数据类型转换成QVariant类的对象  

5.QT程序操作多个数据库文件,操作多个表格

操作多个表格: 只需要根据表格的名字区分即可
操作多个数据库文件:安装驱动的时候,必须传递第二个参数,用来区分不同的数据库文件


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第10部分 DHCP

目录 10.1 DHCP 概述 10.2 实验1&#xff1a;DHCP 基本配置 1.实验目的 2.拓扑结构 3.实验步骤 4.实验调试 &#xff08;1&#xff09;在客户端测试 &#xff08;2&#xff09;show ip dhcp pool &#xff08;3&#xff09;show ip dhcp binding 10.3 实验&#xff…

LeetCode 1827. 最少操作使数组递增

最少操作使数组递增 简单 46 相关企业 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;。每一次操作中&#xff0c;你可以选择数组中一个元素&#xff0c;并将它增加 1 。 比方说&#xff0c;如果 nums [1,2,3] &#xff0c;你可以选择增加 nums[1] 得到 nums …

实战讲解Spring定时任务:@Scheduled(图+文+源码)

1 缘起 最近看到有些定时任务的项目&#xff0c; 使用了Spring自带的定时任务系统&#xff0c;通过添加Scheduled注解的方式实现&#xff0c; 并且&#xff0c;使用了不只cron表达式的方式实现定时执行&#xff0c; 恍然大悟&#xff0c;原来Scheduled还有其他的方式实现定时任…

《小猫猫大课堂》3之字符串,转义字符,注释,选择和循环语句,函数等小概括。

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

这十套练习,教你如何用Pandas做数据分析(01)

Pandas是入门Python做数据分析所必须要掌握的一个库。本文内容由和鲸社区翻译整理自Github&#xff0c;建议读者完成科赛网 从零上手Python关键代码 和 Pandas基础命令速查表 教程学习的之后&#xff0c;点击本篇Notebook右上角的 Fork 按钮对本教程代码进行调试学习。 转载本…

(附源码)SSM的KTV管理系统 毕业设计 291807

基于SSM的KTV管理系统 摘 要 随着社会的发展&#xff0c;人类的进步&#xff0c;21世纪人们的生活水平有所提高&#xff0c;为了满足人们对生活的需要&#xff0c;丰富业余生活&#xff0c;娱乐KTV等行业蓬勃发展&#xff0c;在数字化的今天&#xff0c;我们已离不开计算机&…

Redis的面试题

一、Redis支持的数据类型&#xff1f; Redis支持的数据类型主要有五种&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorte…

opencv图像特征

图像特征类型可以分为如下三种&#xff1a; 边缘角点&#xff08;感兴趣关键点&#xff09;斑点&#xff08;感兴趣区域&#xff09; 其中&#xff0c;角点是个很特殊的存在。如果某一点在任意方向的一个微小变动都会引起灰度很大的变化&#xff0c;我们就把它称之为角点。角点…

17、Redis6.0新功能

文章目录17、Redis6.0新功能17.1 ACL17.1.1 简介17.1.2 命令17.2 IO多线程17.2.1 简介17.2.2 原理架构17.3 工具支持 Cluster17.4 Redis新功能持续关注Redis 6 入门到精通-讲师&#xff1a;王泽 世态炎凉&#xff0c;世界并不善良 17、Redis6.0新功能 17.1 ACL 17.1.1 简介 …

如何利用场追迹控制衍射的包含

1. 摘要 VirtualLab Fusion包括一系列建模方法便于用户可以地调整光学仿真的精度级别和时间。不仅如此&#xff0c;这种功能还有助于隔离物理原因产生的不同影响。在本示例中&#xff0c;我们提出了一个清晰的工作流程配置一个仿真&#xff0c;以便在物理光学模拟中考虑或忽略衍…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(六)变压器耦合栅极驱动

变压器耦合栅极驱动 1.单端变压器耦合栅极驱动电路 2.双端变压器耦合栅极驱动 在高电压栅极驱动 IC 出现以前&#xff0c;使用栅极驱动变压器是唯一一种在离线或类似高电压电路中驱动高侧开关的可行解决方案。 现在&#xff0c;两种解决方案同时存在并且各有利弊&#xff0c;…

基础数据结构线性表

基础数据结构 1.基础概念 数据结构是一种具有一定逻辑关系&#xff0c;在计算机中应用某种存储结构&#xff0c;并且封装了相应操作的数据元素的集合。它包含三方面的内容&#xff0c;逻辑关系、存储关系以及操作。 一般而言&#xff0c;数据结构的选择首先会从抽象数据类型…

springboot整合Canal实时同步数据库表

一、Canal介绍 1、应用场景 在前面的统计分析功能中&#xff0c;我们采取了服务调用获取统计数据&#xff0c;这样耦合度高&#xff0c;效率相对较低&#xff0c;目前我采取另一种实现方式&#xff0c;通过实时同步数据库表的方式实现&#xff0c;例如我们要统计每天注册与登…

语雀的技术栈与富文本编辑讨论分享

目录前言什么是语雀富文本编辑器的发展历程语雀结构简析语雀核心语雀渲染器语雀前端技术业务层编辑器语雀编辑器演化过程语雀研发流程关于语雀的讨论为何文档编写不是一种标准化的中台能力内容类产品典型类别业务所需编辑器开发成本如何&#xff1f;文本编辑器代码编辑器公式编…

[附源码]Python计算机毕业设计SSM基于的网上拍卖系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

13.javase_动漫美女拼图实战

资料地址&#xff1a;https://cowtransfer.com/s/4573fe572f9c4a 项目效果&#xff1a; 练习编程逻辑思维&#xff0c;提高和锻炼自己能力。 一. 绘制游戏界面 1.1窗体绘制 第一个方法&#xff1a;initFrame()&#xff0c;用于窗体的基本设置 public void initFrame() { thi…

每天一个面试题:悲观锁、乐观锁,对比Hashtable和concurrentHashMap

每天一个面试题&#xff1a;悲观锁、乐观锁Hashtable和concurrentHashMap总结开始全新的学习&#xff0c;沉淀才会有产出&#xff0c;一步一脚印&#xff01; 面试题系列搞起来&#xff0c;这个专栏并非单纯的八股文&#xff0c;我会在技术的基础上&#xff0c;Debug解析&#…

戴维南定理(Thevenin‘s theorem)

戴维南定理&#xff1a;含独立电源的线性电阻单口网络N&#xff0c;就端口特性而言&#xff0c;可以等效为一个电压源和电阻串联的单口网络。电压源的电压等于单口网络在负载开路时的电压uoc&#xff1b;电阻R0是单口网络内全部独立电源为零值时所得单口网络N0的等效电阻。 例子…

JavaScript基本语法

1.JavaScript词法结构 所谓词法结构是指一套基础性规则&#xff0c;用来描述如何使用这门语言来编写程序&#xff0c;包括如下几项&#xff1a; 字符集unicode 区分大小写 &#xff08;true和TRUE&#xff09; 忽略空白字符&#xff08;空格、制表符和换行符&#xff09…

UG鼠标和键盘操作

UG鼠标和键盘操作角色操作鼠标操作选择放大/缩小旋转平移确认适合窗口正视于X/Y/Z视图显示样式九宫图设置键盘操作ESCF8角色操作 角色包含了用户的自定义配置&#xff0c;包括内容、演示、快捷键、工具栏等&#xff0c;通过&#xff1a;菜单-首选项-用户界面-角色 进行导入导出…