Qt5.15:MinGW64位编译Oracle 19c数据库驱动及代码测试 - 安装时没有选Sources处理办法

文章目录

  • 0 代码仓库
  • 1 环境以及条件说明
  • 2 准备一:下载Oracle 19c驱动,需要下载两个包,注意分x86和x64
    • 2.1 32位
    • 2.2 64位
    • 2.3 新建目录并解压缩
    • 2.4 记录路径
      • 2.4.1 `x86`需要的路径
      • 2.4.2 `x64`需要的路径
  • 3 准备二:下载Sources源代码的两种方法
    • 3.1 方法一:
    • 3.3 方法二:
    • 3.3 进入到oci.pro目录
    • 3.4 备份oci.pro
    • 3.5 返回上级目录备份qsqldriverbase.pri
  • 4 编译驱动
    • 4.1 修改oci.pro注意事项
    • 4.2 修改oci.pro,使用MinGW64位进行编译
    • 4.3 MinGW64构建套件编译
      • 4.3.1 QT界面中修改qsqldriverbase.pri
      • 4.3.2 选择编译器并指定构建目录
        • 4.3.2注意事项
        • 4.3.2
    • 4.4 进行Debug编译
    • 4.5 代码测试
    • 4.4 进行Release编译

0 代码仓库

1 环境以及条件说明

操作系统:windows10专业版
数据库服务器版本:oracle 19c
oracle instant client版本:19.18
QT版本:5.15.2,且安装的时候没有勾选了源码
QT安装目录:D:\Qt
QT编译套件1:MinGW32/MinGW64(关于32位位与64位问题要与数据库一致)
QT编译套件2:MSVC2019_32/MSVC2019_64(不同的编译套件默认内置的数据库驱动是不一样的,具体看套件的plugins/sqldrivers/目录下的库文件)

2 准备一:下载Oracle 19c驱动,需要下载两个包,注意分x86和x64

2.1 32位

x86下载地址:https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html

① instantclient-basic-nt-19.18.0.0.0dbru.zip

② instantclient-sdk-nt-19.18.0.0.0dbru.zip

2.2 64位

x64下载地址:https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

① instantclient-basic-windows.x64-19.18.0.0.0dbru.zip

② instantclient-sdk-windows.x64-19.18.0.0.0dbru.zip

2.3 新建目录并解压缩

主目录

D:\ProgramData\QT_Oracle19

在这里插入图片描述

2.4 记录路径

具体需要哪个,需要根据具体情况使用。

2.4.1 x86需要的路径

动态库路径

D:\ProgramData\QT_Oracle19\x86\instantclient_19_20

头文件目录

D:\ProgramData\QT_Oracle19\x86\instantclient_19_20\sdk\include

库文件路径

D:\ProgramData\QT_Oracle19\x86\instantclient_19_20\sdk\lib\msvc -loci

2.4.2 x64需要的路径

动态库路径

D:\ProgramData\QT_Oracle19\x64\instantclient_19_20

头文件目录

D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\include

库文件路径

D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\lib\msvc -loci

3 准备二:下载Sources源代码的两种方法

3.1 方法一:

直接逛网下载,并拷贝到QT安装目录
我的是5.12.2版本,因此到对应的目录去下载

https://download.qt.io/archive/qt/5.15/5.15.2/single/

在这里插入图片描述

新建Src目录,拷贝解压缩的文件至本目录

D:\Qt\5.15.2\Src

在这里插入图片描述在这里插入图片描述

3.3 方法二:

使用QT Maintenance

在这里插入图片描述

3.3 进入到oci.pro目录

D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci

在这里插入图片描述

3.4 备份oci.pro

在这里插入图片描述

3.5 返回上级目录备份qsqldriverbase.pri

D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers

在这里插入图片描述

4 编译驱动

qtcreator打开oci.pro,并对oci.pro的内容进行修改,如下:

  • 原版:
    在这里插入图片描述

4.1 修改oci.pro注意事项

  • 如果编译套件使用的是MinGW32位,那么在选择InstantClient的动态库时,就应该指定32位的动态库、头文件和库文件路径。

  • 如果编译套件使用的是MinGW64位,那么在选择InstantClient的动态库时,就应该指定32位的动态库、头文件和库文件路径。

  • 不推荐使用MSVC编译,MinGW的跨平台性好一点。

4.2 修改oci.pro,使用MinGW64位进行编译

TARGET = qsqlociHEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp#注释该行
#QMAKE_USE += oci#根据Oracle客户端或者instantclient安装路径和版本指定oci.dll
QMAKE_LFLAGS += D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\oci.dll#根据Oracle客户端安装路径 指定头文件目录
INCLUDEPATH += D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\include
#根据Oracle客户端安装路径 指定库文件(.lib)路径
LIBS += -LD:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\lib\msvcdarwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environOTHER_FILES += oci.jsonPLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)

4.3 MinGW64构建套件编译

这里可能会出现一个相关的报错,因此需要修改,如果没有则跳过4.3.1:

QT编译Oracle/MySQL等数据库驱动报错:Cannot read qtsqldrivers-config.pri: No such file or directory

4.3.1 QT界面中修改qsqldriverbase.pri

include(./configure.pri)

在这里插入图片描述

4.3.2 选择编译器并指定构建目录

4.3.2注意事项

我的QT不能自动设置构建目录,所以没有设置好的时候,一直各种莫名其妙的错误…构建目录不能指定在oci的上级文件夹,也不能自己新建一个别的名字的文件夹

4.3.2

我的构建目录是

D:\Qt\5.15.2\mingw81_64\qtbase\src\plugins\sqldrivers\build-oci-Desktop_Qt_5_15_2_MinGW_64bit-Debug

因此构建完成后要到指定的目录下的
在这里插入图片描述

4.4 进行Debug编译

在这里插入图片描述将这三个文件拷贝到
在这里插入图片描述

4.5 代码测试

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << QSqlDatabase::drivers();// 添加数据库实例QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");// 设置连接信息db.setHostName("192.168.111.133");  // 主机地址db.setPort(1521);   // 如果是默认端口, 可以不设置db.setDatabaseName("ORCLCDB"); // 数据库名db.setUserName("c##beza");db.setPassword("123456");qDebug() << "准备连接...";// 连接数据库if(db.open()){qDebug() << "数据库连接成功";// 数据库查询QSqlQuery q;QString sql = "select * from dept";bool bl = q.exec(sql);if(!bl){qDebug() << "查询失败";}else{// 遍历结果while(q.next()){// 取出当前记录中的字段qDebug() << "ID:" << q.value("ID").toInt()<<"Name: " << q.value("NAME").toString()<<"Location: " << q.value("LOCATION").toString();}}// 插入数据sql = "insert into dept values(3, 'LeAnn', 'Tokyo')";QSqlDatabase db1 = QSqlDatabase::database();db1.transaction();bl = q.exec(sql);if(bl==false){qDebug() << "插入失败";db1.rollback();}else{qDebug() << "插入数据成功";db1.commit();}}else{qDebug() << "数据库连接失败";}}MainWindow::~MainWindow()
{delete ui;
}

执行前
在这里插入图片描述执行后
在这里插入图片描述

4.4 进行Release编译

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

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

相关文章

策略路由和路由策略

目录 策略路由 路由策略 策略路由和路由策略 策略路由 Step1:配置ACL&#xff0c;匹配流量 acl number 2010 rule 10 permit source 192.168.10.0 0.0.0.255 acl number 2020 rule 10 permit source 192.168.20.0 0.0.0.255 Step2:流分类traffic classifier jiaoxue //匹配…

用于静电除尘的高频高压供电电源的设计

摘要 节能减排已成为当今社会发展的主题&#xff0c;高压静电除尘器以其独特的优势广泛应用于业粉尘的回收与处理领域。随着工业的发展&#xff0c;环境问题日益突出&#xff0c;国家制定了一系列的法律、法规来限制工业排放烟气中的粉尘浓度&#xff0c;常见的除尘方法有水膜…

Navicat for MySQL 视图创建使用方法

创建视图步骤&#xff1a; 点击新建&#xff1b;选择视图&#xff1b;点击视图创建工具&#xff1b;可以在左侧拖拽表到工作区&#xff1b;选择表字段进行连线

使用koa搭建服务器(一)

最近有个需求需要使用到koa搭建服务器并编写接口对数据库进行增删改查&#xff0c;因此写一篇博客记录这段时间的收获。 一、新建koa项目 &#xff08;一&#xff09;安装koa及其相关依赖 npm i koa npm i koa-router// 中间件&#xff0c;用于匹配路由 npm i koa-bodyparse…

​Vue3响应式原理

目录 手动收集依赖通知更新 effect()&#xff1a;更改数据后执行&#xff0c;更新依赖该数据的数据&#xff08;依赖&#xff09; track&#xff08;&#xff09;收集依赖的effect()放进dep&#xff08;set去重&#xff09; 更新时触发trigger函数通知dep里所有effect()执行…

uniapp 中添加 vconsole

uniapp 中添加 vconsole 一、安装 vconsole npm i vconsole二、使用 vconsole 在项目的 main.js 文件中添加如下内容 // #ifdef H5 // 提交前需要注释 本地调试使用 import * as vconsole from "vconsole"; new vconsole() // 使用 vconsole // #endif三、成功

Ansible简介

环境 控制节点&#xff1a;Ubuntu 22.04Ansible 2.10.8管理节点&#xff1a;CentOS 8 组成 Ansible环境主要由三部分组成&#xff1a; 控制节点&#xff08;Control node&#xff09;&#xff1a;安装Ansible的节点&#xff0c;在此节点上运行Ansible命令管理节点&#xff…

Linux命令(107)之basename

linux命令之basename 1.basename介绍 linux命令basename是用来从文件路径中获取文件的基本名称 2.basename用法 basename [参数] NAME basename参数 参数说明-a支持多个参数&#xff0c;并将每个参数视为一个NAME-s移除后缀-z使用NUL而不是换行符分隔输出--help显示帮助信…

TypeScript - 枚举 - 常量枚举

常量枚举的定义 使用 const enum 进行常量枚举的定义&#xff0c; 格式如下 &#xff1a; const enum 枚举类型名称{ 元素1, 元素2&#xff0c; 。。。。。。 } 常量枚举的特殊的地方 常量枚举 &#xff1a; 在编译后是不存在的。 在使用常量枚举的元素的时候&#xff0c;编译之…

Android 系统架构

目录 Android 系统架构 1. Android 应用层 2. Android应用框架层 2.1 Activity Manager &#xff08;活动管理器&#xff09; 2.2 Window Manager &#xff08;窗口管理器&#xff09; 2.3 Content Provider (内容提供器) 2.4 View System&#xff08;视图系统&a…

Leetcode刷题详解——搜索插入位置

1. 题目链接&#xff1a;35. 搜索插入位置 2. 题目描述&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说&#xff0c;在内存管理领域&#xff0c;JVM既拥有最高的权利&#xff0c;但是同时他们又是从事最基础工作的劳动人员&#xff0c;因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说&#xff0c;再虚拟机自动内存管理的帮助下&#xff0…

x210项目重新回顾之十七升级到linux4.19.114 +buildroot2018再讨论

代码参考https://github.com/colourfate/x210_bsp/ 他的是linux_4.10(dtb为 s5pv210-x210..dtb)我打算用linux4.19.114(dtb为 s5pv210-smdkv210.dtb) &#xff0c;所以修改build.sh ------------------------------------------------------------------------------ 5 M…

STM32 CAN使用

STM32 CAN使用 简介各种通讯接口对比报文总线上的报文信息表示为几种固定的赖类型数据帧列表模式掩码模式配置CAN配置参数位时序 简介 控制器局域网CAN&#xff08;Controller Area Network)是由德国博世公司为汽车应用而开发的多主机局部网络&#xff0c;用于汽车的监测和控制…

Openssl数据安全传输平台015:OCCI的使用方法+在项目中的设计与实现

文章目录 1 OCCI使用1.1 初始化 - Environment 类1.2 连接数据库 - Connection 类1.3 执行SQL 2 OCCI在项目中的使用2.1 OCCI单独封装为一个类文件OCCIOP2.2 在ServerOP中作为私有成员2.3 ServerOP::ServerOP(string json)中实例化进行使用2.4 秘钥协商过程中进行读写操作 1 OC…

关于错误javax.net.ssl.SSLException: Received close_notify during handshake

今天开发的小伙伴遇到一问题&#xff0c;报错内容是&#xff1a; javax.net.ssl.SSLException: Received close_notify during handshake at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) at sun.securi…

智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应

水厂在生活中的重要性不可忽视。它们提供清洁、安全的水源&#xff0c;满足人们饮用、洗浴、烹饪等基本需求&#xff0c;保障公共卫生&#xff0c;预防疾病传播;同时&#xff0c;水厂也促进经济发展&#xff0c;为工业生产和农业灌溉提供保障&#xff0c;吸引和支持企业的投资和…

chrome谷歌浏览器取消网页所有剪切板的授权方法步骤

地址栏输入 chrome://settings/content/clipboard选择 不允许网站查看您剪贴板中的文字或图片 ———————————————— 版权声明&#xff1a;本文为CSDN博主「一切V随缘」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明…

MySQL 8 - 处理 NULL 值 - is null、=null、is not null、<> null 、!= null

处理 NULL 值&#xff1a; IS NULL&#xff1a;IS NULL 用于检查一个列是否为 NULL。例如&#xff0c;如果查找一个表中某一列的值为 NULL 的行&#xff0c;可以使用以下语法&#xff1a; SELECT * FROM table_name WHERE column_name IS NULL;IS NOT NULL&#xff1a;IS NOT N…

使用Spring Data Elasticsearch 进行索引的增、删、改、查

一 Spring Data Elasticsearch 项目环境搭建 1.1 修改pom文件添加依赖 目前使用spring-boot-starter-parent版本为2.2.8.RELEASE 对应spring-data-elasticsearch版本为2.2.8.RELEASE&#xff0c;版本对应可以自行百度&#xff0c;如果不行直接用elasticsearch-rest-high-lev…