QT学习笔记-QT安装oracle oci驱动
QT学习笔记-QT安装oracle oci驱动
- 0、背景
- 1、环境以及条件说明
- 2、编译驱动
- 2.1 下载oracle instant client
- 2.2 编译qt oci驱动
- 2.2.1 修改oci.pro
- 2.2.2 MinGW64构建套件编译
- 2.2.3 MSVC2019_64构建套件编译
- 3、访问数据库运行成功
0、背景
在使用QT开发应用的过程中,往往会把应用使用过程中产生的数据放入数据库进行统一存储,因此通过QT实现数据库的访问可以说是必须的一个知识点,其实QT访问数据库的语法及相关类和方法的使用并不复杂,但是对于使用QT的新人来说往往会开在数据库驱动加载的地方,比如遇到以下问题:
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMARIADB QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
虽然QT的驱动列表中有QPSQL,但是确保不能加载。下面就来说一下正确使用QT方法数据的驱动问题。
QT最新的安装包安装完毕后,默认支持ODBC和SQLITE数据库,要想使用其他的数据库那么你在安装QT的时候要把源码选项勾上。
1、环境以及条件说明
操作系统:windows10专业版
数据库版本:Postgresql 14.6(64位)(在编译驱动的时候需要引用这里面的库和头文件,也可以不安装直接下载压缩包解压也行)
QT版本:5.15.2,且安装的时候勾选了源码
QT安装目录:D:\Qt
QT编译套件1:MinGW64(关于32位位与64位问题要与数据库一致)
QT编译套件2:MSVC2019_64(不同的编译套件默认内置的数据库驱动是不一样的,具体看套件的plugins/sqldrivers/目录下的库文件)
2、编译驱动
2.1 下载oracle instant client
1、首先要下载oracleclient,因为在编译oci驱动时要依赖oracleclient中的库和头文件。下载地址为:
https://www.oracle.com/database/technologies/instant-client/downloads.html
如下图:
Oracle Instant Client的下载要根据操作系统版本和Oracle服务器版本匹配才行。我开发环境是Windows10 64位系统,因此选择的是Instant Client for Microsoft Windows (x64)
2、点击后会出现Oracle Instant Client版本选择,如下图:
不同的Oracle Instant Client版本支持的Oracle服务器的版本也不相同,我用的Oracle服务器版本是11.2,这里选择的版本是Version 19.xx.x.x.x,我之前下载的是19.19,现在截图的时候已经是19.20,差别不大。
3、点开后可以看到有BasicPackage、SQL*Plus Package、Tools Package、SDK Package、JDBC Supplement Package、ODBC Package等包的下载,如下图:
编译oci,需要至少2个包,就是Baisc Package、SDK Package
4、下载后如下图:
然后解压basic和sdk这2个压缩包。
5、我这个把解压后的文件夹复制到D盘了,复制不复制可以根据实际情况定。如下图:
2.2 编译qt oci驱动
2.2.1 修改oci.pro
1、首先找到qt oci项目的源码,我的源码(记住安装QT的时候一定要勾选源码)位置如下:
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci
2、然后用qtcreator打开oci.pro,并对oci.pro的内容进行修改(修改之前最好先对oci项目进行一下备份),如下:
TARGET = qsqlociHEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp#注释该行
#QMAKE_USE += oci#根据Oracle客户端安装路径 指定oci.dll
QMAKE_LFLAGS += D:\oracleinstantclient_19_19\oci.dll#根据Oracle客户端安装路径 指定头文件目录
INCLUDEPATH += D:\oracleinstantclient_19_19\sdk\include#根据Oracle客户端安装路径 指定库文件(.lib)路径
LIBS += -LD:\oracleinstantclient_19_19\sdk\lib\msvc -locidarwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environOTHER_FILES += oci.jsonPLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
如下图:
2.2.2 MinGW64构建套件编译
1、在qtcreator设置项目使用的构建套件为MinGW64,如下图:
2、分别进行Debug编译和Release编译,编译完毕后出现如下图:
在D:\plugins\sqldrivers目录生成的libqsqloci.a、qsqloci.dll、qsqloci.dll.debug
3、让QT的程序能找到编译好的驱动。
qt工程在编译是默认寻找数据库驱动的路径(注意项目使用的编译套件是MinGw 64位的)是:D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers,因此需要把上一步编译生成的3个文件libqsqloci.a、qsqloci.dll、qsqloci.dll.debug复制到D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers目录下。如下图:
2.2.3 MSVC2019_64构建套件编译
1、在qtcreator设置项目使用的构建套件为MSVC2019_64,如下图:
这时切换到代码编辑会发现一个错误,内容为:Project ERROR: msvc-version loaded but QMAKE_MSC_VER isn’t set,如下图:
为了解决这个问题,我们需要在D:\Qt\5.15.2\msvc2019_64\mkspecs\common\msvc-version.conf中设置一下QMAKE_MSC_VER的值,如下图:
注意:1919那个值应该是从下面的版本设置列表中找到才行。
2、然后关闭qtcreator,重新打开qtcreator,并在qtcreator中打开oci.pro项目,然后使用MSVC2019_64构建套件进行编译,又出现了一个错误,内容为:LNK1107:文件无效或损坏:无法在0x2F8处读取 - oci.dll,如下图:
在使用MSVC构建套件进行编译oci时不需要在pro中指定oci.dll的路径
我们需要再修改一下pro文件的内容,修改后内容如下:
TARGET = qsqlociHEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp#注释该行
#QMAKE_USE += oci#根据Oracle客户端安装路径 指定oci.dll
!msvc {QMAKE_LFLAGS += D:\oracleinstantclient_19_19\oci.dll
}#根据Oracle客户端安装路径 指定头文件目录
INCLUDEPATH += D:\oracleinstantclient_19_19\sdk\include#根据Oracle客户端安装路径 指定库文件(.lib)路径
LIBS += -LD:\oracleinstantclient_19_19\sdk\lib\msvc -locidarwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environOTHER_FILES += oci.jsonPLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
如下图:
这样修改后,无论我们使用msvc构建套件还是mingw构建套件都可以正常编译过去了。
3、为了防止msvc构建套件编译生成的库文件与mingw构建套件编译生成的库文件混淆,我们先把D:\plugins\sqldrivers目录中的文件删除,然后通过msvc构建套件编译oci项目,编译完毕后生成的库文件如下图:
4、让QT的程序能找到编译好的驱动。
qt工程在编译是默认寻找数据库驱动的路径(注意项目使用的编译套件是MSVC2019_64位的)是:D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers,因此需要把上一步编译生成的3个文件libqsqloci.a、qsqloci.dll、qsqloci.dll.debug复制到D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers目录下。如下图:
3、访问数据库运行成功
1、需要在代码中指定引用的oci库的路径
QLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");
oci_lib->load();
if (!oci_lib->isLoaded())
{qDebug() << "oracle oci动态库加载失败!";return;
}
2、完整测试代码如下:
#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;}
#else
// QLibrary *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;
// }
#endifQStringList driverList = QSqlDatabase::drivers();qDebug() << driverList;//以下代码测试访问Oracle数据库QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");db.setHostName("172.16.12.6");db.setPort(1521);db.setDatabaseName("orcl");db.setUserName("mes");db.setPassword("oracle");if (!db.open()){qDebug() << "数据库连接失败!";}else{qDebug() << "数据库连接成功!";}
3、运行结果如下:
相关文章:

QT学习笔记-QT安装oracle oci驱动
QT学习笔记-QT安装oracle oci驱动 0、背景1、环境以及条件说明2、编译驱动2.1 下载oracle instant client2.2 编译qt oci驱动2.2.1 修改oci.pro2.2.2 MinGW64构建套件编译2.2.3 MSVC2019_64构建套件编译 3、访问数据库运行成功 0、背景 在使用QT开发应用的过程中,往…...

【React学习】—类的基本知识(五)
【React学习】—类的基本知识(五) <script>// 创建一个Person类class Person{//构造器方法constructor(name,age){this.namename;this.ageage;}//一般方法speak(){//speak方法一般放在哪里?类的原型上,供实例使用//通过Pers…...
【AI】《动手学-深度学习-PyTorch版》笔记(十六):自定义网络层、保存/加载参数、使用GPU
AI学习目录汇总 1、自定义网络层 自定义网络层很简单,三步即可完成 继承类:nn.Module定义初始化函数:__init__中定义需要初始化的代码定义向前传播函数:forward1.1 不带参数的网络层 1)定义网络层 import torch import torch.nn.functional as F from torch import nn…...

微软杀入Web3:打造基于区块链的AI产品
作者:秦晋 2023年1月,微软向 ChatGPT 创建者 OpenAI 投资 100 亿美元,在AI业界引发格外关注。此举也让微软在AI的战略探索上提前取得有利位置。 2023年3月,微软软件工程师 Albacore 披露微软正在为Edge 浏览器测试内置的非托管加密…...

聊聊51单片机
目录 1.介绍 2.发展 3.应用领域 4.发展前景 1.介绍 51单片机(AT89C51)是一种常见的8位微控制器,属于Intel MCS-51系列。它是一种低功耗、高性能的单片机,广泛应用于嵌入式系统中。 51单片机具有很多特点和功能,例如…...
Linux yum 命令,Linux apt 命令
目录 Linux yum 命令 yum 语法 yum常用命令 实例 1 实例 2 实例 3 国内 yum 源...

Vue+SpringBoot项目开发:登录页面美化,登录功能实现(三)
写在开始:一个搬砖程序员的随缘记录上一章写了从零开始VueSpringBoot后台管理系统:Vue3TypeScript项目搭建 VueTypeScript的前端项目已经搭建完成了 这一章的内容是引入element-plus和axios实现页面的布局和前后端数据的串联,实现一个登陆的功能&#x…...

2.若依前后端分离版第一个增删查改
1.介绍 若依提供了代码生成功能,单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统,进入菜单[系统工具]-》[代码生成],点击导入按钮,选择需要生成代码的表进行导…...
javaSE_2.2——【方法的介绍】
1.方法的定义 (1)方法声明的语法规则如下所示: [修饰符] 返回值类型 方法名称([参数列表]){// 方法体 } 方法修饰符:是一种关键字,用来描述方法、类、变量等各种元素的声明,一个程序可以同时拥有多个修饰…...
【02】基础知识:typescript数据类型
1、布尔类型 boolean let flag: boolean false2、数字类型 number let num: number 6 //十进制 let num2: number 0xf00d //十六进制 let num3: number 0b1010 //二进制 let num4: number 0o744 //八进制3、字符串类型 string 用双引号(“)或单引…...

DIP: NAS(Neural Architecture Search)论文阅读与总结(双份快乐)
文章地址: NAS-DIP: Learning Deep Image Prior with Neural Architecture SearchNeural Architecture Search for Deep Image Prior 参考博客:https://zhuanlan.zhihu.com/p/599390720 文章目录 NAS-DIP: Learning Deep Image Prior with Neural Architecture Search1. 方法…...

AI:02-基于深度学习的动物图像检索算法的研究
文章目录 一、算法原理二、代码实现三、实验结果四、总结深度学习在计算机视觉领域中的应用越来越广泛,其中动物图像检索算法是一个重要的应用场景。本文将介绍一种基于深度学习的动物图像检索算法,并提供相应的代码实现。 一、算法原理 本算法采用卷积神经网络(Convolutio…...

IDEA项目实践——Spring集成mybatis、spring当中的事务
系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践—…...

6-Ngnix配置反向代理
1.前提 虚拟机能连接外网 仿真http应用需在本虚拟机启用(原因:只有一台虚拟机做测试) http_8080和http_8081要启用(http测试应用) [rootcent79-2 ~]# ls -l http_* -rwxr-xr-x 1 root root 6391676 Jul 19 13:39 http_8080 -rwxr-xr-x 1 …...

构建 LVS-DR 群集、配置nginx负载均衡。
目录 一、基于 CentOS 7 构建 LVS-DR 群集 1、准备四台虚拟机 2、配置负载调度器(192.168.2.130) 3、部署共享存储(192.168.2.133) 4、配置两个Web服务器(192.168.2.131、192.168.2.132) 测试集群 二…...
【UE4的垃圾回收】
UE4的垃圾回收 1 UObjects及子类1.1 UObjects类包含UObjects成员(UPROPERTY)1.2 UObjects类包含非UObjects成员 2 非UObject及子类2.1 非UObjects类包含UObjects成员12.2 非UObjects类包含UObjects成员22.3 非UOjbects类包含非UObjects成员 3 UStructs4 …...

nginx负载均衡的几种配置方式介绍
一.负载均衡含义简介 二.nginx负载均衡配置方式 准备三台设备: 2.190均衡服务器,2.191web服务器1,2.160web服务器2,三台设备均安装nginx,两台web服务器均有网页内容 1.一般轮询负载均衡 (1)…...

uniapp发布插件显示components/xxx文件没找到,插件格式不正确
uniapp发布插件显示components/xxx文件没找到,插件格式不正确 将插件文件这样一起选中,然后右键压缩成zip文件,而不是外层文件压缩...

Kubernetes(K8s)入门
一、Kubernetes是什么 Kubernetes是什么? 首先,它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然还很新,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果。确切地说,Kubernetes是谷歌严格保密十几年的…...
[前端系列第3弹]JS入门教程:从零开始学习JavaScript
本文将带领大家,从零开始学习JavaScript,fighting~ 目录 一、JavaScript简介 二、变量和数据类型 三、注释和分号 四、算术运算符 五、表达式和语句 六、代码块和作用域 七、函数(最重要) 一、JavaScript简介 JavaScript&…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...