Qt SqliteHelper , QSqlDatabase和QSqlQuery实现

9、QT—SQLite使用小记 前言 开发平台:Win10 64位 开发环境:Qt Creator 13.0.0 构建环境:Qt 5.15.2 +MSVC2019 64位 sqlite版本:sqlite3 文章目录一、Sqlite是什么二、sqlite使用步骤2.1 下载2.2 安装2.3 使用三、Qt集成sqlite33.1 关键问题3.2 封装sqlite四、参考文献4.1 https://blog.youkuaiyun.com/Javachichi/article/details/1381066324.2 https://zhuanlan 阅读详情

看到一篇关于Qt使用Sqlite的教程贴, 稍微改了下封装起来

原帖地址:    https://www.cnblogs.com/xia-weiwen/archive/2017/05/04/6806709.html



遇到一个头疼的bug, 调试了一个上午

//bug 需要在方法中重新定义, 不然会出现 "Driver not loaded" 的错误

QSqlQuery sql_query;

这个对象要在类成员函数中定义,不能在头文件声明,不然会出现找不到驱动的错误


我也不知道为什么



开始贴代码

文件目录


main.cpp

#include <QtCore/QCoreApplication>
#include "sqlitehelper.h"
#include <QDebug>
#include <QStringList>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
void dbTest();
void dbTest1();
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    dbTest();
    return a.exec();
}
void dbTest()
{
    // 枚举可用驱动
    qDebug() << QSqlDatabase::drivers();
    SqliteHelper sqliteHelper;
    sqliteHelper.createDatabase();
    sqliteHelper.open();
    int ID;
    ID = sqliteHelper.getMaxId();
    QString cmd;
    cmd = QString("INSERT INTO Log VALUES(%1, 0, '2018/5/24', '', '')").arg(ID + 1);
    qDebug() << cmd;
    sqliteHelper.insert(cmd);
    sqliteHelper.close();
}

sqliteHelper.h

#ifndef SQLITEHELPER_H
#define SQLITEHELPER_H
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
class SqliteHelper
{
public:
    SqliteHelper();
    void createDatabase();
    void createDataTable();
    void open();
    void close();
    int insert(QString cmd);
    void update();
    void query();
    void deleteRecord();
    int getMaxId();
private:
    QSqlDatabase database;
    QSqlQuery sql_query; //bug 需要在方法中重新定义, 不然会出现 "Driver not loaded" 的错误
    int max_id;
};
#endif // SQLITEHELPER_H

sqliteHelper.cpp

 #include "sqlitehelper.h"
#include <QDebug>
#include <QStringList>
SqliteHelper::SqliteHelper()
{
    max_id = 0;
}
void SqliteHelper::createDatabase()
{
    // create database
    if (QSqlDatabase::contains("qt_sql_default_connection"))
    {
        database = QSqlDatabase::database("qt_sql_default_connection");
    }
    else
    {
        database = QSqlDatabase::addDatabase("QSQLITE");
        database.setDatabaseName("log.sqlite");
//        database.setUserName("");
//        database.setPassword("");
    }
}
void SqliteHelper::createDataTable()
{
    QString create_sql = "create table Log (ID int primary key, Type int, Time varchar(32), Content varchar(32), Note varchar(128))";
    sql_query.prepare(create_sql);
    if(!sql_query.exec())
    {
        qDebug() << "Error: Fail to create table." << sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }
}
void SqliteHelper::open()
{
    if (!database.open())
    {
        qDebug() << "Error: Failed to connect database." << database.lastError();
    }
    else
    {
        qDebug() << "Open database successfully." ;
        // do something
    }
}
void SqliteHelper::close()
{
    database.close();
}
int SqliteHelper::insert(QString cmd)
{
//    QString insert_sql = "insert into Log values (?, ?, ?)";
//    sql_query.prepare(insert_sql);
//    sql_query.addBindValue(max_id+1);
//    sql_query.addBindValue("Wang");
//    sql_query.addBindValue(25);
//    if(!sql_query.exec())
//    {
//        qDebug() << sql_query.lastError();
//    }
//    else
//    {
//        qDebug() << "inserted Wang!";
//    }
    QSqlQuery sql_query;
    if(!sql_query.exec(cmd))
    {
        qDebug() << sql_query.lastError();
        return 0;
    }
    else
    {
        qDebug() << "inserted successfully.";
        return 1;
    }
}
int SqliteHelper::getMaxId()
{
    QSqlQuery sql_query;
    QString select_max_sql = "select max(ID) from Log";
    sql_query.prepare(select_max_sql);
    if(!sql_query.exec())
    {
        qDebug() << sql_query.lastError();
    }
    else
    {
        while(sql_query.next())
        {
            max_id = sql_query.value(0).toInt();
            qDebug() << QString("max id:%1").arg(max_id);
            return max_id;
        }
    }
}

文档文件

这里有个问题是相对路径

log.sqlite

在调试时会默认根目录(即release的上层目录)为当前目录

在Release中运行exe默认根目录则是在Release里

同样, Debug也是


数据库插入建表和插入数据后


字段类型


Qt_数据库, QSqlDatabase, QSqlQuery catalogoverview驱动层SQl接口层用户接口层SQLiteSqlQuery overview QT SQL模块提供了一个【与平台无关】【与数据库无关】的访问SQL数据库的接口 / QT都是通过一个【模块】来提供对某种【功能】的支持,比如对于数据库功能 就对应SQL模块 / 所谓模块,即QT在他里面写了很多的类 / 引入一个模块, 在项目文件.pro里 添加【QT += sql】 驱动层 驱动层是为【数据库】与【SQL接口层】提供了桥梁 QT的SQL模块是独立于数据库的,所以所有的数据库代码都在 阅读详情

相关推荐

正确使用 QSqlDatabase 与 QSqlQuery 的方法

在使用 Qt 的数据库模块时,许多人可能会对 QSqlDatabase 和 QSqlQuery 的使用方法感到困惑。本文将对这一话题进行详细讨论,并提供一些最佳实践。

电脑管家 1857

SQLite数据库的SQLiteHelper帮助类

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SQLite; using System.Linq; using System.Text; using System.Th...

u012408847的博客 1万+

AXI VIP配置全指南:从报错到成功仿真的完整流程(Vivado 2023版)

本文详细解析了在Vivado 2023环境中配置AXI Verification IP(VIP)进行协议仿真的完整流程。针对常见的include和import报错问题,提供了具体的解决方案和代码示例,指导用户从IP核创建、参数化配置,到构建可工作的仿真测试平台,最终实现成功仿真。

gpt4scribbler的博客 233

QT操作SQLite数据库

.pro文件中加入以下语句 QT += sql 头文件 #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> 创建数据库 //创建数据库 bool SqliteHelper::CreateDataBase() { //建立并打开数据库 QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); database

WMT1520的博客 1544

基于Mind+、MOTT实现人工智能

@基于Mind+、MOTT实现人工智能 人工智能实验 一、实验目的及要求 【一】实现人脸识别 【二】实现云数据库应用 【三】实现测温数据mqtt上传至物联网云平台 二、实验原理与内容 基于二哈实现多人人脸学习和识别 基于TinywebDB实现云数据库应用 基于EasyIoT实现mqtt数据上传。 三、实验软硬件环境 硬件:掌控板 软件:Mind+ 四、实验过程(实验步骤、记录、数据、分析) 1.基于二哈实现多人人脸学习和识别 ①在Mind+扩展上的传感器选项选择HUSKYLENS AI 摄像头 ②配置哈士

weixin_44606930的博客 2372

px3 有感分析

px3 后续分析

qq_39707917的博客 3115

Qt操作SQLite数据库的三种方式

Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery、QSqlQueryModel、QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种QSqlTableModel,根本就不需要开发者懂SQL语言,也能操作Sqlite数据库。 方式1. 使用QSqlQuery来访问 通过exec()成员函数来执行DML(数据操作语言)语句,如增删改查SELECT、INSERT、UPDATE和DELETE,以及DDL(数据定义语言)语句等..

顺其自然~专栏 1万+

AMESim柱塞泵建模全指南:从HCD库搭建到联合仿真

液压系统仿真中,轴向柱塞泵的建模始终是难点与热点。柱塞泵结构紧凑、功率密度高,在工程机械与航空航天领域应用广泛,然而其运动学与流体细节深度耦合,给仿真带来不小挑战。AMESim平台中的HCD库提供了一种从物理结构出发的建模思路,将柱塞泵分解为容积腔、节流口与机械约束等基础单元,从而真实刻画柱塞腔压力波动、配流特性和容积效率等关键行为,摆脱黑盒模型的局限。基于机理建模的仿真结果,可用于泵参数优化、故障特征分析以及控制策略验证。进一步结合AMESim与Simulink联合仿真,可以高效开发变量泵排量控制系统,研

weixin_29159441的博客 289

详细Qt创建并使用SQLite数据库教程(含实验实例)

随着 Qt 和 SQLite 的结合使用日益普及,掌握如何在这两个平台上实现高效的数据管理和操作变得尤为重要。然而,对于许多初学者来说,将两者结合起来并应用于实际项目中可能会遇到一些挑战。从设置正确的项目配置到编写无误的 SQL 查询,再到确保数据的安全性和完整性,每一个步骤都需要仔细考虑和实践。本文介绍如何在 Qt 环境下创建并利用 SQLite 数据库。无论你是刚刚接触编程的新手,还是有经验的开发者寻找特定问题的答案,本文都将为你提供必要的知识和技巧,帮助你在自己的项目中集成数据库功能。

weixin_63577471的博客 3952

一维光子晶体态密度计算与应用解析

态密度(DOS)是凝聚态物理和光子学中的核心概念,描述了量子态在能量空间的分布规律。基于麦克斯韦方程组的周期性介电结构分析表明,一维光子晶体通过布拉格散射形成光子带隙,其态密度曲线呈现典型的范霍夫奇点和禁带特征。这种特性使光子晶体在光学工程中具有重要价值,特别是在滤波器设计和传感器开发领域。通过转移矩阵法等数值计算手段,可以精确预测带隙位置和宽度,其中折射率对比度与周期数是关键设计参数。实际应用中,1550nm通信波段滤波器常采用Si/SiO2交替结构,而引入缺陷层则能产生高Q值缺陷模。计算优化时需注意数值

weixin_36487018的博客 193

Cursor Agent模式下如何优雅切换conda环境运行Python脚本?3种实用方法实测

本文针对Cursor Agent模式下运行Python脚本时环境错配的痛点,实测了三种优雅切换conda环境的实用方法。通过Shell全局配置、项目级.cursorrc文件定制以及对话中直接指令,开发者可以确保AI助手在正确的虚拟环境中执行代码,从而提升开发效率和协作流畅度。

redis7keeper的博客 597

QT+SQLite数据库配置和使用

SQLite应用详解

Douhaoyu的博客 3985

非模式物种PySCENIC分析流程

外的物种想要做scenic分析的话, 可以使用同源基因转换后再进行分析, 将要分析的物种的gene Symbol转换为人、小鼠或者是果蝇的gene Symbol后进行分析。odiscus sinensis(中华鳖)的基因-细胞的矩阵,进行pyscenic分析的话,可参考以下示例。目前pyscenic分析支持的物种仅为人、小鼠和果蝇,其他物种暂时还没有相应的数据库,因。本教程基于Linux及服务。SCENIC转录因子分析。器中的Rstudio环境。例如我们有一个Pel。

weixin_47195452的博客 933

Qt+SQLite千万级数据游标分页实战与性能优化

面对数据库记录数激增,传统LIMIT OFFSET分页在翻页到深层时会产生大量无效扫描,导致查询延迟剧增、界面卡顿。游标分页(Keyset Pagination)利用排序键索引直接定位上一页末尾,将查询耗时与数据总量解耦,成为大数据量列表流畅加载的关键技术。在Qt客户端开发中,结合SQLite索引设计、批量写入与异步UI刷新,能够在千万级数据场景下保持QTableView的交互响应。该方案广泛适用于工业数据采集、历史日志检索、设备监控等需要顺序翻页的本地数据库应用。基于Qt 5.15+/QSql模块,实践覆

weixin_33800463的博客 292

华为OD机试 - 矩形绘制 - 数组、坐标偏移(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除。 当新绘制的矩形与已有图形重叠时,对图形取并集; 当新擦除的矩形与已有图形重叠时,对图形取差集。 给定一系列绘制和擦除操作,计算最终图形的面积。第一行为操作数N,接下来的N行格式为:d x1

学Java,找哪吒 835

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Qt Sqlite 半自动化持久层类(支持多线程)

faultinfo.h:必须实现拷贝构造方法和赋值运算符,编写Q_PROPERTY,名字位对于的数据库字段名称。如Q_PROPERTY(int fault_code READ getFaultCode WRITE setFaultCode)上述代码从表fault_info中查出所有满足条件的List,很方便,不用自己去解析了!

cnjhk2012的博客 543

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

10、QT—SQLite使用小记1

其他几个操作因为篇幅的原因笔者就不贴出来了,可以下载源码看下。其实函数的使用就是将函数参数解析出来,然后按照sql语法拼接起来,因为不管是sqlite还是sqlserver、mysql或者Oracle,最后都是sql语句在执行增删改查,所以可以学下sql语句,对于理解和封装这些函数有很大帮助。源码下载链接:https://github.com/944414275/Sqlite。

roujian0985的博客 1776

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

qt 对数据库sqlite的操作(超详细)包含增删改查

qt 对数据库sqlite的操作,连接、建表、增删改查。图片保存读取,多表联合操作。

qq_52218412的博客 1万+

Qt解析QSqlDatabase、QSqlQuery类操作数据库

Qt解析QSqlDatabase、QSqlQuery类操作数据库 Driver Type Description: QDB2        IBM DB2 QIBASE     Borland InterBase Driver QMYSQL  MySQL Driver QOCI        Oracle Call Interface Driver QODBC    ODB

石船龙 7859

qsql 关联_QSqlDatabase和QSqlQuery的正确方法是什么?

当您使用addDatabase创建QSqlDatabase对象时,或者当您调用removeDatabase时,您只是将一个元组(驱动程序,主机名:端口,数据库名称,用户名/密码)关联或取消关联到名称(或默认连接名称, t指定连接名称)。 SQL驱动程序被实例化,但数据库只有在您调用QSqlDatabase :: open时才会打开。该连接名称在应用程序范围内定义。因此,如果您在使用它的每个对象中调...

weixin_39732027的博客 1260

Qt操作Sqlite类封装,及命令行导入csv文件到Sqlite数据库

日常工作中,有时候需要对数据进行分析。如果能把待分析的数据导入sqllite数据库,是种不错的分析手段。或者需要导入其他数据库中的数据,做数据迁移用,比如可以把其他数据库中的表数据导出为csv文件,再把csv文件导入到sqllite。...............

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 3575

Qt SQLServerHelper 用QSqlQuery 和 QSqlDatabase 实现

在网上找了很多SQLServer的封装类, 自己重新实现了一下参考的网址:这个是一个数据库操作的类, 包含基本的打开关闭curd点击打开链接这个是参考实现count, 在迭代器里增加了一个int变量用于计数点击打开链接Qt版本 4.8.61. 文档结构2. .pro这里要增加 Qt += sql #-------------------------------------------------#...

Empty_Android的博客 994

QT连接mysql数据库

QT连接mysql数据库的调试过程中遇到各种问题,最后终于调通。然后把代码封装成了类的形式,把现有代码进行了重构。在设计mysql连接类过程中,使用了分层设计的思想,尽量使类更加通用。 在头文件databasehelper中,定义DataBaseHelper, #include &lt;QSqlDatabase&gt; class DataBaseHelper { public: Dat...

千人斩的博客 3526

QSqlQuery 如何与数据库 QSqlDatabase 关联 保持连接

结论: 只有使用Qt内置的默认连接名的时候,QSqlQuery才可以用空的构造函数,即如下是一一对应的: mdb = QSqlDatabase::addDatabase("QSQLITE"); // 等价于 q(mdb) QSqlQuery q; q.exec("select *..."); 又或者指定了连接名,必须要按如下配对: mdb = QSqlDatabase::addDatabase("QSQLITE","MyConnectName"); // 不能用空构造函数,提示 d

LYJ个人博客,记录技术、八卦、生活,分享各种心得,期待与朋友们一同进步 2245

Qt下Sqlite数据库操作(2)

本文基于上一篇Sqlite数据库做一些基本的Sqlite数据库的操作分享。最基本的数据库操作无外乎增删查改操作,那么对应的SQL语句怎么样呢,下面我们共同学习下! 1、在上文中提供了windows下Sqlite数据库的安装方法,本文在此增加Linux和Ubuntu下Sqlite的安装: 1)离线安装 //下载安装包 sqlite3_3.7.9-2ubuntu1_i386.deb//ubun...

Mr.Sugarcane 1447

QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite用法

使用QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite数据库实现一个简单的界面查询

castlooo的专栏 837
上一篇: Qt QDomDocument类读取Xml
下一篇: 多线程刷新UI, 用QThreadPool和QRunnable实现
Empty_Android
博客等级 码龄10年 98粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值