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

QT学习笔记-QT访问各种关系数据库笔记汇总

QT学习笔记-QT访问各种关系数据库笔记汇总

  • 1、QT访问Oracle数据库
  • 2、QT访问SQLServer数据库
  • 3、QT访问MySQL数据库
  • 4、QT访问PostgreSQL数据库
  • 5、QT访问Access数据库
  • 6、QT多线程中访问数据库的要点

在使用QT进行应用开发过程中,不可避免的会涉及到访问关系数据库,为了方便后期查阅笔记,在本文进行一下汇总。

1、QT访问Oracle数据库

1.1、关于QT访问Oracle数据库的驱动编译请参阅
1.1.1 《QT学习笔记-QT安装oracle oci驱动》
1.1.2 《QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板》
1.2、关键步骤:
1.2.1 配置oracleclient的环境变量LD_LIBRARY_PATH,或者直接在代码中通过QLibrary加载依赖库
1.2.2 参考代码

void Widget::on_btnDbTest_clicked()
{
#ifdef Q_OS_WINQLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");oci_lib->load();if (!oci_lib->isLoaded()){qDebug() << "oracle oci动态库加载失败!";return;}
#elseQLibrary *oci_lib = new QLibrary("/usr/lib/oracleclient/instantclient_19_19/libclntsh.so");bool loadresult = oci_lib->load();qDebug() << "oracle oci动态库load result is " << loadresult;if (!loadresult){qDebug() << oci_lib->errorString();}if (!oci_lib->isLoaded()){qDebug() << "oracle oci动态库libclntsh.so加载失败!";return;}
#endif//以下代码测试访问Oracle数据QSqlDatabase  db = QSqlDatabase::addDatabase("QOCI");db.setHostName("xxx.xxx.xxx.xxx");		//数据库服务器的ipdb.setPort(1521);						//数据库服务器的端口号db.setDatabaseName("orcl");    			//此处写你数据库的实例名称db.setUserName("oracle");				//写数据库的用户名db.setPassword("oracle@123");			//写数据库的密码if (!db.open()){qDebug() << "数据库连接失败!";QSqlError lastError = db.lastError();qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();}else{qDebug() << "数据库连接成功!";QSqlQuery query(db);if (query.exec("select * from sys_user")){qDebug() << "查询表格sys_user成功!";while(query.next()){qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();}}}
}

2、QT访问SQLServer数据库

2.1、关于QT访问SQL Server数据库的驱动编译请参阅
2.1.1 《QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库》
2.2 参考代码

void Widget::on_btnDbTest_clicked()
{//以下代码测试访问SQLServer数据QSqlDatabase  db = QSqlDatabase::addDatabase("QODBC");db.setDatabaseName("mydsn");    	//此处写你配置的ODBC数据源的名称db.setUserName("sa");				//写数据库的用户名db.setPassword("sa@123");			//写数据库的密码if (!db.open()){qDebug() << "数据库连接失败!";QSqlError lastError = db.lastError();qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();}else{qDebug() << "数据库连接成功!";QSqlQuery query(db);if (query.exec("select * from sys_user")){qDebug() << "查询表格sys_user成功!";while(query.next()){qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();}}}
}

3、QT访问MySQL数据库

3.1 关于QT访问MySQL数据库的驱动编译请参阅
3.1.1 《QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动》
3.2 参考代码

void Widget::on_btnDbTest_clicked()
{//以下代码测试访问MySQL数据QSqlDatabase  db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("xxx.xxx.xxx.xxx");		//数据库服务器的ipdb.setPort(3306);						//数据库服务器的端口号db.setDatabaseName("mydbname");    //此处写你数据库的名称db.setUserName("root");			//写mysql数据库的用户名db.setPassword("root@123");			//写mysql数据库的密码if (!db.open()){qDebug() << "数据库连接失败!";QSqlError lastError = db.lastError();qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();}else{qDebug() << "数据库连接成功!";QSqlQuery query(db);if (query.exec("select * from sys_user")){qDebug() << "查询表格sys_user成功!";while(query.next()){qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();}}}
}

4、QT访问PostgreSQL数据库

4.1 关于QT访问PostgreSQL数据库的驱动编译请参阅
4.1.1《QT学习笔记-QT安装postgresql驱动》
4.1.2 《QT学习笔记-postgresq数据库l驱动移植到RK3568ARM开发板》
4.2 参考代码

void Widget::on_btnDbTest_clicked()
{//以下代码测试访问PostgreSQL数据QSqlDatabase  db = QSqlDatabase::addDatabase("QPSQL");db.setHostName("xxx.xxx.xxx.xxx");		//数据库服务器的ipdb.setPort(5432);						//数据库服务器的端口号db.setDatabaseName("mydbname");    		//此处写你数据库的名称db.setUserName("postgres");				//写数据库的用户名db.setPassword("postgres");				//写数据库的密码if (!db.open()){qDebug() << "数据库连接失败!";QSqlError lastError = db.lastError();qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();}else{qDebug() << "数据库连接成功!";QSqlQuery query(db);if (query.exec("select * from sys_user")){qDebug() << "查询表格sys_user成功!";while(query.next()){qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();}}}
}

5、QT访问Access数据库

5.1 参考代码

void Widget::on_btnDbTest_clicked()
{//以下代码测试访问Access数据QSqlDatabase  db = QSqlDatabase::addDatabase("QODBC");db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");    	//此处写你配置的ODBC数据源的名称或这连接字符串db.setPassword("sa@123");			//写数据库的密码if (!db.open()){qDebug() << "数据库连接失败!";QSqlError lastError = db.lastError();qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();}else{qDebug() << "数据库连接成功!";QSqlQuery query(db);if (query.exec("select * from sys_user")){qDebug() << "查询表格sys_user成功!";while(query.next()){qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();}}}
}

6、QT多线程中访问数据库的要点

在不同线程中访问数据库时,关键时在创建QSqlDatabase对象时采用不用的连接名称,如下:

QSqlDatabase db1 = QSqlDatabase::addDatabase("QODBC", "MainThread");		
QSqlDatabase db2 = QSqlDatabase::addDatabase("QODBC", "SubThread");
//db1和db2在采用不用的连接名称MainThread、SubThread

相关文章:

QT学习笔记-QT访问各种关系数据库笔记汇总

QT学习笔记-QT访问各种关系数据库笔记汇总 1、QT访问Oracle数据库2、QT访问SQLServer数据库3、QT访问MySQL数据库4、QT访问PostgreSQL数据库5、QT访问Access数据库6、QT多线程中访问数据库的要点 在使用QT进行应用开发过程中&#xff0c;不可避免的会涉及到访问关系数据库&…...

Shell脚本-常用命令

Shell 脚本 Shell 脚本&#xff08;shell script&#xff09;&#xff0c;是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本&#xff0c;但读者朋友要知道&#xff0c;shell 和 shell script 是两个不同的概念。 由于习惯的原因&#xff0c;简洁起见&a…...

Flink之输出算子Redis Sink

Redis Sink Redis Sinkjedis实现添加依赖自定义Redis Sink使用Sink验证 开源 Redis Connector添加依赖自定义Redis SinkRedisCommandString数据类型示例Hash数据类型示例 使用SinkRedisStringSinkRedisHashSink 验证 Redis Sink 在新版Flink的文档中&#xff0c;并没有发现Redi…...

【数据结构】顺序表实现通讯录

前言 在上一节中我们实现了顺序表&#xff0c;现在我们将使用顺序表完成通讯录的实现。&#xff08;注&#xff1a;本人水平有限&#xff0c;“小屎山”有些许bug&#xff0c;代码冗余且语无伦次&#xff0c;望谅解&#xff01;&#x1f605;&#xff09; 文章目录 一、数据结构…...

JMeter 随机数生成器简介:使用 Random 和 UUID 算法

在压力测试中&#xff0c;经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值&#xff0c;本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数&#xff0c;其中最常用的是 __Random 函数。该函数可以生成一个指定范围内的随机整数或…...

vue3 更换 elemnt-ui / element-plus 版本npm命令

1. 安装 / 更换 element-ui 版本 [ 在 后面指定想要安装的版本 ] //卸载当前版本 npm uninstall element-ui //安装指定版本 npm i element-ui2.4.8 -S --legacy-peer-deps 2. 安装 / 更换 element-plus 版本 [ 在 后面指定想要安装的版本 ] npm install element-plus2.3…...

react.js 手写响应式 reactive

Redux 太繁琐&#xff0c;Mbox 很酷但我们可能没必要引入新的包&#xff0c;那就让我们亲自在 react.js 中通过代理实现一套钩子来达到类似 vue 的响应式状态&#xff1a; 实现 reactive hooks 代理类声明 代理状态的类应当提供可访问的状态&#xff0c;和订阅变化的接口。 …...

代码随想录打卡第四十六天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一…...

【BP-Adaboost预测】基于BP神经网络的Adaboost的单维时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Origami Studio for Mac:塑造未来,掌握原型设计之巅

在当今高度竞争的设计领域&#xff0c;原型设计的重要性不言而喻。它不仅是沟通想法&#xff0c;也是测试和改进设计的关键环节。而现在&#xff0c;一款强大的原型设计工具——Origami Studio for Mac&#xff0c;正在席卷设计界&#xff0c;以其独特的功能和卓越的性能&#…...

UML类图中各箭头表示总结

UML类图中各箭头表示总结 1、泛化2、实现3、依赖4、关联5、聚合6、组合 在UML类图中&#xff0c;箭头关系是用来表示类之间的关系的。箭头关系的种类有以下几种&#xff1a; 1、泛化 泛化&#xff1a;表示类之间的继承关系。箭头从子类指向父类。箭头&#xff1a;实线空心三角…...

神经网络量化----为了部署而特别设计

引言:一般神经网络量化有两个目的: 为了加速,在某些平台上浮点数计算比较耗费时间,替换为整形可以加快运算为了部署,某些平台上只支持整形运算,比如在芯片中如果是第1个目的,则使用常规的量化手段就可以满足,将浮点数运算变成整形运算+较少的浮点运算 但是如果是第2个目…...

代码随想录算法训练营Day60|单调栈01

代码随想录算法训练营Day60|单调栈01 文章目录 代码随想录算法训练营Day60|单调栈01一、739. 每日温度二、496.下一个更大元素 I 一、739. 每日温度 class Solution {public int[] dailyTemperatures(int[] temperatures) {//单调栈int lenstemperatures.length;int result[]n…...

openMP学习笔记 -编程模型

OpenMP模型 gcc编译openmp指令&#xff1a;gcc test.cpp -o test -fopenmp 定积分计算 函数面积 给定一个定积分&#xff0c;计算其面积&#xff1a; ∫ 0 1 4.0 ( 1 x 2 ) d x \int^{1}_{0}{\frac{4.0}{(1x^2)}dx} ∫01​(1x2)4.0​dx omp 概念 并行区域 并行区域用于…...

【Hive SQL 每日一题】环比增长率、环比增长率、复合增长率

文章目录 环比增长率同比增长率复合增长率测试数据需求说明需求实现 环比增长率 环比增长率是指两个相邻时段之间某种指标的增长率。通常来说&#xff0c;环比增长率是比较两个连续时间段内某项数据的增长量大小的百分比。 环比增长率反映了两个相邻时间段内某种经济指标的变…...

Java设计模式之外观模式(Facade Pattern)

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。外观模式通过隐藏子系统的复杂性&#xff0c;简化了客户端与子系统之间的交互&#xff0c;提供了一个更简单、更直观的接口。…...

【大疆智图】大疆智图(DJI Terra 3.0.0)安装及使用教程

大疆智图是一款以二维正射影像与三维模型重建为主的软件,同时提供二维多光谱重建、激光雷达点云处理、精细化巡检等功能。它能够将无人机采集的数据可视化,实时生成高精度、高质量三维模型,满足事故现场、工程监测、电力巡线等场景的展示与精确测量需求。 文章目录 1. 安装D…...

腾讯地图基本使用(撒点位,点位点击,弹框等...功能) 搭配Vue3

腾讯地图的基础注册账号 展示地图等基础功能在专栏的上一篇内容 大家有兴趣可以去看一看 今天说的是腾讯地图的在稍微一点的基础操作 话不多说 直接上代码 var marker ref(null) var map var center ref(null) // 地图初始化 const initMap () > {//定义地图中心点坐标…...

散列表:Word文档中的单词拼写检查功能是如何实现的?

文章来源于极客时间前google工程师−王争专栏。 一旦我们在Word里输入一个错误的英文单词&#xff0c;它就会用标红的方式提示“编写错误”。Word的这个单词拼写检查功能&#xff0c;虽然很小但却非常实用。这个功能是如何实现的&#xff1f; 散列别&#xff08;Hash Table&am…...

智慧公厕蜕变多功能城市智慧驿站公厕的创新

随着城市发展的不断推进&#xff0c;对公共设施的便利性和智能化要求也日益提高。为满足市民对高品质、便捷、舒适的公共厕所的需求&#xff0c;智慧公厕行业的领航厂家广州中期科技有限公司&#xff0c;全新推出了一体化智慧公厕驿站。凭借着“高科技碳中和物联网创意设计新经…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...