当前位置: 首页 > news >正文

详解Qt中访问数据库

在Qt中访问数据库涉及到几个关键步骤,主要包括加载数据库驱动、建立数据库连接、执行SQL语句、读取结果等。下面将详细介绍这些步骤,并给出一个简单的示例,这里假设使用的是SQLite数据库。
记得首先在pro文件中添加QT += sql

1. 加载数据库驱动

Qt通过数据库驱动程序来支持不同类型的数据库,例如SQLite、MySQL、PostgreSQL等。在实际使用前,通常需要确保已经包含了相应的数据库驱动模块。对于SQLite,由于Qt内置了对其的支持,无需额外安装驱动。

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>// 如果使用其他数据库,可能需要包含对应的头文件,例如:
// #include <QMYSQLDriver> // 对于MySQL
// #include <QPSQLDriver> // 对于PostgreSQL

注意: 当前Qt是否已经安装将要使用的数据库驱动,可以使用QSqlDatabase::drivers()去查看

#include <QtSql>  
#include <QDebug>  int main(int argc, char *argv[]) {  QCoreApplication a(argc, argv);  //输出所有已经支持的数据库驱动QStringList drivers = QSqlDatabase::drivers();  foreach (const QString &driver, drivers) {  qDebug() << driver;  }  return a.exec();  
}

2. 创建数据库连接

创建数据库连接通常涉及指定数据库类型(如果是SQLite,则通常不需要用户名、密码和数据库地址,因为SQLite数据库文件是本地文件)。

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // 对于SQLite
// 或者
// QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 对于MySQL
// QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); // 对于PostgreSQLdb.setHostName("localhost"); // 对于远程数据库,设置主机名或IP
db.setDatabaseName("/path/to/mydatabase.db"); // 对于SQLite,这是数据库文件路径;对于其他数据库则是数据库名
db.setUserName("username"); // 非SQLite数据库的用户名
db.setPassword("password"); // 非SQLite数据库的密码if (!db.open()) {qDebug() << "Failed to connect to database: " << db.lastError().text();return false; // 连接失败
}

3. 执行SQL查询或命令

使用QSqlQuery类执行SQL语句。

QSqlQuery query;// 插入数据
query.prepare("INSERT INTO MyTable (column1, column2) VALUES (?, ?)");
query.addBindValue(value1);
query.addBindValue(value2);
if (!query.exec()) {qDebug() << "Insert error: " << query.lastError().text();
} else {qDebug() << "Row inserted successfully.";
}// 查询数据
query.clear();
query.prepare("SELECT * FROM MyTable WHERE id = ?");
query.bindValue(0, someId);
if (query.exec()) {while (query.next()) {QString value1 = query.value(0).toString();int value2 = query.value(1).toInt();// ... 处理查询结果 ...}
} else {qDebug() << "Select error: " << query.lastError().text();
}

4. 关闭数据库连接

在完成所有数据库操作后,关闭连接以释放资源。

db.close();

示例完整代码片段

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(":memory:"); // 使用内存数据库,也可以替换为实际文件路径if (!db.open()) {qDebug() << "Cannot open database: " << db.lastError().text();return 1;}// 创建表QSqlQuery createQuery;createQuery.exec("CREATE TABLE IF NOT EXISTS MyTable (id INTEGER PRIMARY KEY, column1 VARCHAR(40), column2 INT)");// 插入数据QSqlQuery insertQuery;insertQuery.prepare("INSERT INTO MyTable (column1, column2) VALUES (?, ?)");insertQuery.addBindValue("Example Value");insertQuery.addBindValue(123);if (!insertQuery.exec()) {qDebug() << "Insert error: " << insertQuery.lastError().text();} else {qDebug() << "Row inserted successfully.";}// 查询数据QSqlQuery selectQuery;selectQuery.prepare("SELECT * FROM MyTable");if (selectQuery.exec()) {while (selectQuery.next()) {QString column1Value = selectQuery.value(1).toString();int column2Value = selectQuery.value(2).toInt();qDebug() << "Column1: " << column1Value << ", Column2: " << column2Value;}} else {qDebug() << "Select error: " << selectQuery.lastError().text();}db.close();return a.exec();
}

以上代码演示了如何使用Qt连接SQLite数据库,执行创建表、插入数据和查询数据的操作。
注意

  1. 对于不同的数据库类型,配置连接参数的方式会有所不同,但执行SQL的基本模式是相似的。
  2. 上述代码中使用的Sqlite数据库的内存模式。访问速度非常快。适合作为临时的缓存数据库使用。

打开多个数据库

在Qt程序中同时打开和操作多个数据库,可以通过创建多个QSqlDatabase实例来实现。每个数据库实例都有自己的名字(connection name),这样可以区分不同数据库连接。以下是一个简单的示例,展示如何同时打开两个SQLite数据库:

#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 打开第一个SQLite数据库QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE");db1.setDatabaseName("first_db.sqlite");if (!db1.open()) {qDebug() << "Failed to open the first database: " << db1.lastError().text();return 1;}// 执行第一个数据库的查询QSqlQuery query1(db1);query1.exec("CREATE TABLE IF NOT EXISTS Table1 (ID INTEGER PRIMARY KEY, Name TEXT)");if (!query1.isActive())qDebug() << "Error creating table in first DB: " << query1.lastError().text();// 打开第二个SQLite数据库QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE");db2.setDatabaseName("second_db.sqlite");if (!db2.open()) {qDebug() << "Failed to open the second database: " << db2.lastError().text();db1.close();return 1;}// 执行第二个数据库的查询QSqlQuery query2(db2);query2.exec("CREATE TABLE IF NOT EXISTS Table2 (ID INTEGER PRIMARY KEY, Name TEXT)");if (!query2.isActive())qDebug() << "Error creating table in second DB: " << query2.lastError().text();// 不论操作成功与否,记得在不再使用时关闭数据库连接db1.close();db2.close();return a.exec();
}

在上述示例中,我们创建了两个不同的SQLite数据库连接,并分别为它们创建了表。当然,你可以根据需要连接不同类型(如MySQL、PostgreSQL等)的数据库,只需在调用addDatabase时指定正确的数据库驱动名称即可。

务必注意,当在多线程环境中操作数据库时,即使Qt的数据库模块是线程安全的,也应该确保在同一时刻仅在一个线程中操作单个数据库连接,或者正确地管理线程间的同步,防止数据竞争问题。同时,也要确保在不再需要时关闭数据库连接,以避免资源泄露。

使用建议

  1. 数据库处理通常在主线程,如果必要在其他线程中访问数据库,切记在哪个线程访问数据库就在哪个线程中打开数据库。
  2. 如果甲方对数据库没有硬性要求,建议使用sqlite。
  3. 在连接远程数据库进行查询数据的时候,如果遇到访问缓慢情况,建议开启QSqlQuery setForwardOnly(true)。可以看到奇迹的发生。

相关文章:

详解Qt中访问数据库

在Qt中访问数据库涉及到几个关键步骤&#xff0c;主要包括加载数据库驱动、建立数据库连接、执行SQL语句、读取结果等。下面将详细介绍这些步骤&#xff0c;并给出一个简单的示例&#xff0c;这里假设使用的是SQLite数据库。 记得首先在pro文件中添加QT sql 1. 加载数据库驱动…...

《QT实用小工具·三》偏3D风格的异型窗体

1、概述 源码放在文章末尾 可以在窗体中点击鼠标左键进行图片切换&#xff0c;项目提供了一些图片素材&#xff0c;整体风格偏向于3D类型&#xff0c;也可以根据需求自己放置不同的图片。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; 头文件部分&#xff…...

如何优化TCP?TCP的可靠传输机制是什么?

在网络世界中&#xff0c;传输层协议扮演着至关重要的角色&#xff0c;特别是TCP协议&#xff0c;以其可靠的数据传输特性而广受青睐。然而&#xff0c;随着网络的发展和数据量的激增&#xff0c;传统的TCP协议在效率方面遭遇了挑战。小编将深入分析TCP的可靠性传输机制&#x…...

DFS(基础,回溯,剪枝,记忆化)搜索

DFS基础 DFS(深度优先搜索) 基于递归求解问题&#xff0c;而针对搜索的过程 对于问题的介入状态叫初始状态&#xff0c;要求的状态叫目标状态 这里的搜索就是对实时产生的状态进行分析检测&#xff0c;直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态…...

基于Scala开发Spark ML的ALS推荐模型实战

推荐系统&#xff0c;广泛应用到电商&#xff0c;营销行业。本文通过Scala&#xff0c;开发Spark ML的ALS算法训练推荐模型&#xff0c;用于电影评分预测推荐。 算法简介 ALS算法是Spark ML中实现协同过滤的矩阵分解方法。 ALS&#xff0c;即交替最小二乘法&#xff08;Alte…...

Go语言和Java编程语言的主要区别

目录 1.设计理念&#xff1a; 2.语法&#xff1a; 3.性能&#xff1a; 4.并发性&#xff1a; 5.内存管理&#xff1a; 6.标准库&#xff1a; 7.社区和支持&#xff1a; 8.应用领域&#xff1a; Go&#xff08;也称为Golang&#xff09;和Java是两种不同的编程语言&…...

【TypeScript系列】与其它构建工具整合

与其它构建工具整合 构建工具 BabelBrowserifyDuoGruntGulpJspmWebpackMSBuildNuGet Babel 安装 npm install babel/cli babel/core babel/preset-typescript --save-dev.babelrc {"presets": ["babel/preset-typescript"] }使用命令行工具 ./node_…...

Java | Leetcode Java题解之第12题整数转罗马数字

题解&#xff1a; 题解&#xff1a; class Solution {String[] thousands {"", "M", "MM", "MMM"};String[] hundreds {"", "C", "CC", "CCC", "CD", "D", "DC…...

哈佛大学商业评论 --- 第五篇:智能眼镜之战

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 专题作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大多…...

paddlepaddle模型转换onnx指导文档

一、检查本机cuda版本 1、右键找到invdia控制面板 2、找到系统信息 3、点开“组件”选项卡&#xff0c; 可以看到cuda版本&#xff0c;我们这里是cuda11.7 cuda驱动版本为516.94 二、安装paddlepaddle环境 1、获取pip安装命令 &#xff0c;我们到paddlepaddle官网&#xff…...

图像处理与视觉感知---期末复习重点(6)

文章目录 一、图像分割二、间断检测2.1 概述2.2 点检测2.3 线检测2.4 边缘检测 三、边缘连接3.1 概述3.2 Hough变换3.3 例子3.4 Hough变换的具体步骤3.5 Hough变换的法线表示形式3.6 Hough变换的扩展 四、阈值处理4.1 概述4.2 计算基本全局阈值算法4.3 自适应阈值 五、基于区域…...

git 如何删除本地和远程分支

删除本地分支 确认当前分支&#xff1a;首先&#xff0c;确保你没有在要删除的分支上。你可以通过运行git branch命令来查看当前的分支。 切换分支&#xff1a;如果你在要删除的分支上&#xff0c;需要先切换到另一个分支。例如&#xff0c;切换到main分支&#xff0c;可以使用…...

Kong基于QPS、IP限流

Rate Limiting限流插件 https://docs.konghq.com/hub/kong-inc/rate-limiting/ 它可以针对consumer ,credential ,ip ,service,path,header 等多种维度来进行限流.流量控制的精准度也有多种方式可以参考,比如可以做到秒级,分钟级,小时级等限流控制. 基于IP限流 源码地址&…...

基于springboot实现甘肃非物质文化网站系统项目【项目源码+论文说明】

摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本甘肃非物质文化网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…...

【瑞萨RA6M3】1. 基于 vscode 搭建开发环境

基于 vscode 搭建开发环境 1. 准备2. 安装2.1. 安装瑞萨软件包2.2. 安装编译器2.3. 安装 cmake2.4. 安装 openocd2.5. 安装 ninja2.6. 安装 make 3. 生成初始代码4. 修改 cmake 脚本5. 调试准备6. 仿真 1. 准备 需要瑞萨仓库中的两个软件&#xff1a; MDK_Device_Packs.zipse…...

使用pip install替代conda install将packet下载到anaconda虚拟环境

问题描述 使用conda install 下载 stable_baseline3出现问题 一番搜索下是Anaconda.org缺少源 解决方法 首先使用管理员权限打开 anaconda prompt 然后激活目标环境&#xff1a;conda activate env_name 接着使用&#xff1a;conda env list查看目标env的位置 如D:\anacon…...

【HTML】常用CSS属性

文章目录 前言1、字体和文本属性2、边距和填充3、border边框4、列表属性 前言 上一篇我们学习了CSS扩展选择器以及它的继承性&#xff0c;对于页面元素样式设置相信大家都不陌生了。 这一篇我们就来看看具体都有哪些样式可以设置&#xff1f;又该如何设置&#xff1f; 喜欢的【…...

python中的print(f‘‘)具体用法

在Python中&#xff0c;print(f) 是格式化字符串&#xff08;f-string&#xff09;的语法&#xff0c;它允许你在字符串中嵌入表达式&#xff0c;这些表达式在运行时会被其值所替换。f 或 F 前缀表示这是一个格式化字符串字面量。 在 f 或 F 中的大括号 {} 内&#xff0c;你可…...

《青少年成长管理2024》022 “成长七要素之三:文化”4/5

《青少年成长管理2024》022 “成长七要素之三&#xff1a;文化”4/5 七、物质文化&#xff08;一&#xff09;什么是物质文化&#xff08;二&#xff09;物质文化的分类&#xff08;三&#xff09;人类物质文化最新成果有哪些&#xff08;四&#xff09;青少年了解物质文化的途…...

Linux(05) Debian 系统修改主机名

查看主机名 方法1&#xff1a;hostname hostname 方法2&#xff1a;cat etc/hostname cat /etc/hostname 如果在创建Linux系统的时候忘记修改主机名&#xff0c;可以采用以下的方式来修改主机名称。 修改主机名 注意&#xff0c;在linux中下划线“_”可能是无效的字符&…...

之前翻硬币问题胡思乱想的完善

题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果同时翻转左边的两个硬币&#x…...

前端与后端协同:实现Excel导入导出功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一&#xff0c;引言 在云计算时代&#xff0c;随着开发者逐步将应用迁移至云端以减轻硬件管理负担&#xff0c;软件配置与环境一致性问题日益凸显。Docker的横空出世&#xff0c;恰好为软件开发者带来了全新的解决方案&#xff0c;它革新了软件的打包、分发和管理方式&#xff…...

畅捷通T+ KeyInfoList.aspx SQL漏洞复现

0x01 产品简介 畅捷通 T+ 是一款灵动,智慧,时尚的基于互联网时代开发的管理软件,主要针对中小型工贸与商贸企业,尤其适合有异地多组织机构(多工厂,多仓库,多办事处,多经销商)的企业,涵盖了财务,业务,生产等领域的应用,产品应用功能包括:采购管理、库存管理、销售…...

【面经】interrupt()、interrupted()和isInterrupted()的区别与使用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 interrupt方法 如果打断线程正在sleep&#xff0c;wait&#xff0c;join会导致被打断的线程抛出InterruptedException&#xff0c;并清除打断标记。如…...

了解这些技术:Flutter应用顺利登陆iOS平台的步骤与方法

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…...

经济学 劳动市场 医疗经济学

目录 劳动市场 医疗经济学 劳动市场 自愿交换 劳动力的供给&#xff0c;取决于能够胜任这个工作的人的数量&#xff0c;雇主提供的工资必须要能覆盖他的机会成本&#xff0c;他失去的自由世界和他做其他事情能够挣到钱 派生需求&#xff1a;劳动力的需求&#xff0c;取决于…...

vue + koa + Sequelize + 阿里云部署 + 宝塔:宝塔数据库连接

之前文章已经介绍了宝塔上传前后端代码并部署&#xff0c;不清楚的请看这篇文章&#xff1a; vue koa 阿里云部署 宝塔&#xff1a;宝塔前后端部署 下面是宝塔创建数据库&#xff1a; 我用的 koa Sequelize 连接的数据库&#xff0c;Sequelize 非常适合前端使用&#xf…...

华为昇腾认证考试内容有哪些

华为昇腾认证考试的内容主要包括理论知识和实践操作两部分。 在理论知识部分&#xff0c;考生需要掌握昇腾计算的基础知识&#xff0c;包括昇腾计算平台的架构、性能特点、应用场景等。此外&#xff0c;还需要深入理解昇腾AI框架、算子开发、模型优化等相关技术原理和应用方法…...

Spring Boot接收从前端传过来的数据常用方式以及处理的技巧

一、params 传参 参数是会拼接到url后面的请求 场景规范&#xff1a;url后面的key值<3个参数的时候&#xff0c;使用params 传参 支持的请求方式&#xff1a;get&#xff08;正规的是get方式&#xff09;、post 都行 例如&#xff1a; http://localhost:8080/simpleParam?…...

微积壹佰 网站建设/网络推广优化网站

微服务“Microservices”已经成为软件架构最流行的热词之一。网络上看到很多关于微服务的文章&#xff0c;但是感觉很多离我们还很遥远&#xff0c;并且没有找到多少真正在企业场景中应用的实例。此处省略一万字~~~~于是想要将自己最近一段时间使用微服务以及通过看大师们的文章…...

个人档案网站该怎么做/营销型网站建设解决方案

利用 iframe解决ajax的跨域问题参考文章&#xff1a; &#xff08;1&#xff09;利用 iframe解决ajax的跨域问题 &#xff08;2&#xff09;https://www.cnblogs.com/weixiaole/p/6085939.html 备忘一下。...

广州网站设计服务商/绍兴seo排名公司

转自&#xff1a;https://blog.csdn.net/txl199106/article/details/49227067 国家集训队1999论文集陈宏&#xff1a;《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》来煜坤&#xff1a;《把握本质&#xff0c;灵活运用——动态规划的深入探讨》齐鑫&#xff1a;《搜索…...

网站平台建设调研报告/近期国际热点大事件

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼clear all;close all;clc;Iimread(img_368.jpg);Irgb2gray(I); %灰度变换figure(1); imshow(I);JI;[m,n]size(J);if isa(J,double)~1Jdouble(J);endM5; %gabor滤波器有5个尺度X16; %gabor滤波器窗口大小Y16;gbgetGaborKernels(M,X,…...

成都网站排名/百度推广助手app

这两年淘宝为了跟进拼多多&#xff0c;一直在发展客户拉客户&#xff0c;和淘宝客拉客户的模式&#xff0c;也出了不少政策。我身边也有不少人像题主的朋友一样&#xff0c;通过做淘客赚到了钱。看到这里&#xff0c;肯定会有人质疑&#xff0c;淘宝客玩法早就过时了&#xff0…...

找人做网站需要注意/廊坊关键词排名优化

在C/MFC中利用CMarkup类对XML进行操作 标签&#xff1a; 实用编程技术 一、什么是XML1 XML 是可扩展标记语言&#xff08;Extensible Markup Language&#xff09;的缩写&#xff0c;其中的 标记&#xff08;markup&#xff09;是关键部分。标记语言从早期的私有公司和政府制…...