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、运行结果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全排列——力扣46

文章目录 题目描述解法:回溯题目描述 解法:回溯 //version 1 vector<vector<int>> permute(<

Stable Diffuion webui Mac版本安装过程

系统环境 操作系统&#xff1a;MacOS Ventura13.5 芯片&#xff1a;Apple M2 Max Python: 3.10 安装前置准备 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git注意事项&#xff1a;修改源码内全部 git clone 链接&#xff0c;设置代理 https://ghpr…

【小程序】Canvas 画布分享海报

成品效果图 可以通过切换下面图片形成不同的海报背景分享图 <template><view>// type"2d"必须加<canvas type"2d" :style"{width:Artwidth px,height:Artheight px, margin:0 auto}" canvas-id"firstCanvas"id&quo…

小兔鲜项目 uniapp (1)

目录 项目架构 uni-app小兔鲜儿电商项目架构 小兔鲜儿电商课程安排 创建uni-app项目 1.通过HBuilderX创建 2.通过命令行创建 pages.json和tabBar案例 uni-app和原生小程序开发区别 用VS Code开发uni-app项目 拉取小兔鲜儿项目模板代码 基础架构–引入uni-ui组件库 操…

STM32CubeMX之freeRTOS互斥量

这是大哥保护小弟的故事 高中低等级的任务 互斥量就是谁要敢插我小弟的队&#xff0c;我就要打他&#xff0c;不能让其他人插我小弟的队 互斥量的使用是默认开启的不用手动开启&#xff01; 最高优先级任务&#xff1a;延时&#xff08;10ms&#xff09;再上厕所 中间&#x…

java静默打印PDF(可实现生产环境下服务器写入PDF模板,然后调用客户端打印机打印)

java静默打印PDF可实现生产环境下服务器写入PDF模板&#xff0c;然后调用客户端打印机打印 一、简需求实现步骤 二、代码实现0、打印模板1、服务器部分 &#xff08;端口&#xff1a;8090&#xff09;1.1、maven依赖1.2、实体1.2.1、接口返回类1.2.2、标签纸页面参数类1.2.3、P…

OpenCV实例(八)车牌字符识别技术(一)模式识别

车牌字符识别技术&#xff08;一&#xff09;模式识别 1.模式识别流程2. 模式识别方式 影响并导致汽车牌照内字符出现缺损、污染、模糊等情况的常见因素有照相机的性能、采集车辆图像时光照的差异、汽车牌照的清洁度等。为了提高汽车牌照字符识别的准确率&#xff0c;本节将把英…

2.0 Maven基础

1. Maven概述 Maven概念 Apache Maven是一个软件项目管理工具&#xff0c;将项目开发和管理过程抽象程一个项目对象模型&#xff08;POM&#xff0c;Project Object Model&#xff09;。 Maven作用 项目构建 提供标准的、跨平台的自动化项目构建方式。 依赖管理 方便快捷…

深入探索 Spring MVC:构建优雅的Web应用

文章目录 前言一、什么是 Spring MVC1.1 什么是 MVC1.2 什么是 Spring MVC 二、Spring MVC 项目的创建2.1 项目的创建2.2 第一个 Spring MVC 程序 —— Hello World 三、RequestMapping 注解3.1 常用属性3.2 方法级别和类级别注解3.3 GetMapping、PostMapping、PutMapping、Del…

C# Blazor 学习笔记(12):css样式设置

文章目录 前言添加引入css保证razor和css的对应关系手动引入css文件 前言 由于Blazor UI库暂时还不完善&#xff0c;有时候需要我们自己写css。Razor做好了css动态隔离的设置。 ASP.NET Core Blazor CSS 隔离 C#小轮子&#xff1a;Visual Studio自动编译Sass文件 添加引入c…

eclipse Java Code_Style Code_Templates

Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程&#xff0c;不然有时候不生效&#xff0c;旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了

实践分享:小程序事件系统设计

微信小程序官方文档中解释说&#xff1a;事件是用于子组件向父组件传递数据&#xff0c;可以传递任意数据。 小程序开发中的事件是指视图层到逻辑层的通讯方式&#xff0c;主要是可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上&#xff0c;当达到触发事件&#…

2023年七夕情人节是什么时候? 淘宝天猫七夕节礼物优惠券怎么领取?

2023年七夕情人节是什么时候&#xff1f; 2023年七夕节时间是2023年8月22日&#xff08;农历七月初七&#xff0c;星期二&#xff09;&#xff1b; 七夕情人节&#xff0c;又称中国情人节&#xff0c;是浪漫的代名词。源自古人对牛郎织女一年一度相会的仰望&#xff0c;这一天…

嵌入式Linux下LVGL的移植与配置

一.sdk源码下载路径 1.官方源码下载路径如下: ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 2.个人移植好的源码8.2版本下载路径: 链接&#xff1a;https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwdc68e 提取…

android 如何分析应用的内存(十八)终章——使用Perfetto查看内存与调用栈之间的泄露

android 如何分析应用的内存&#xff08;十八&#xff09; 在前面两篇文章中&#xff0c;先是介绍了如何用AS查看Android的堆内存&#xff0c;然后介绍了使用MAT查看 Android的堆内存。AS能够满足基本的内存分析需求&#xff0c;但是无法进行多个堆的综合比较&#xff0c;因此…

[保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

题目链接&#xff1a; 素数判定https://www.nowcoder.com/share/jump/437195121691718831561 描述 给定一个数n&#xff0c;要求判断其是否为素数&#xff08;0,1&#xff0c;负数都是非素数&#xff09;。 输入描述&#xff1a; 测试数据有多组&#xff0c;每组输入一个数…

excel将主信息和明细信息整理为多对多(每隔几行空白如何填充)

excel导出的数据是主信息和明细信息形式。 方法如下:1、首先&#xff0c;从第一个单元格开始选中要填充的数据区域。2、按CtrlG或者F5调出定位对话框&#xff0c;点击左下角的【定位条件】。3、在【定位条件】中选择【空值】&#xff0c;然后点击【确定】按钮。4、按照上述操作…

Vue3+Ts+Vite项目全局配置Element-Plus主题色

概述 我找了很多博客&#xff0c;想全局配置Elmenet-Plus组件主题色&#xff0c;但都没有效果。所以有了这篇博客&#xff0c;希望能对你有所帮助&#xff01;&#xff01;&#xff01; 文章目录 概述一、先看效果二、创建全局颜色文件2.1 /src/styles 下新建 element-plus.sc…

Snapclear for mac图像背景删除软件

Snapclear使用先进的算法和人工智能技术&#xff0c;能够快速而准确地分离图像中的主题和背景。它可以自动识别边缘和细节&#xff0c;并生成平滑而清晰的抠图结果。 Snapclear Mac版下载-Snapclear for mac(图像背景删除软件)- Mac下载 功能 人工智能驱动。 精确的切片 100%…

skywalking忽略调用链路中的指定异常

文章目录 一、介绍二、演示项目介绍1. 支付服务2. 订单服务 三、项目演示1. 未忽略异常2. 忽略异常修改配置使用注解 四、结论 往期内容 一、skywalking安装教程 二、skywalking全链路追踪 三、skywalking日志收集 一、介绍 在前面介绍在微服务项目中使用skywalking进行全链…