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

news2024/11/28 20:33:30

文章目录

  • 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 = qsqloci

HEADERS += $$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\msvc

darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ

OTHER_FILES += oci.json

PLUGIN_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.coloradmin.cn/o/1145905.html

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

相关文章

毅速丨金属3D打印能替代传统制造吗?

金属3D打印技术已经逐渐被很多行业认可和应用&#xff0c;但是目前&#xff0c;金属3D打印多数被作为传统制造技术的一种补充&#xff0c;暂时还不能完全替代传统制造。 金属3D打印使用的是金属粉末进行选择性激光烧结&#xff0c;打印时在成型缸里铺上金属粉末&#xff0c;打印…

【刷题宝典NO.1】

Nim游戏 https://leetcode.cn/problems/nim-game/description/ 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人…

替换所有的问号

这篇也是凑数的 哈哈.... 稍后会整合到算法通关第三关白银挑战 . 描述 : 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意 : 不能 修改非 ? 字符 . 题目 : …

分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双向门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiGRU麻雀算法优化卷积双…

【计算机视觉】3D视觉

文章目录 一、基本问题二、三个坐标系 X w \boldsymbol{X}_w Xw​到 X c \boldsymbol{X}_c Xc​的转换 X c \boldsymbol{X}_c Xc​到 x i \boldsymbol{x}_i xi​的转换投影矩阵尺度模糊问题 三、相机标定四、立体视觉 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#x…

JDK21下载和安装

说明 本文介绍 JDK21&#xff08;Oracle版&#xff09;的下载和安装。 下载 Oracle官网JDK21下载页面 根据操作系统的类型&#xff0c;下载相应的版本。本文下载的是Windows64位的安装版。 下载页面示例 安装包示例 安装 双击安装包&#xff0c;开始安装。 把路径改为自定…

【数据结构】数组和字符串(八):稀疏矩阵的链接存储:十字链表的创建、插入元素、遍历打印(按行、按列、打印矩阵)、销毁

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表4.2.3三元组表的转置、加法、乘法、操作4.2.4十字链表0. 十字链表结构1. 创建2. 销毁3. 插入4. 打印矩阵形式5. 按行打印6.按列打…

京东平台数据分析(京东销量):2023年9月京东吸尘器行业品牌销售排行榜

鲸参谋监测的京东平台9月份吸尘器市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东吸尘器的销量为19万&#xff0c;环比下滑约12%&#xff0c;同比下滑约25%&#xff1b;销售额为1.2亿&#xff0c;环比下滑约11%&…

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …

【Qt之控件QTreeView】设置单元格高度、设置图标尺寸

设置列宽 设置高度 自定义代理 继承QItemDelegate&#xff0c;实现sizeHint ()方法&#xff0c;设置自定义委托。 class itemDelegate : public QItemDelegate {Q_OBJECTpublic:explicit itemDelegate(QObject *parent 0) : QItemDelegate(parent){}~itemDelegate(){}virtua…

策略路由和路由策略

目录 策略路由 路由策略 策略路由和路由策略 策略路由 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 //匹配…

Navicat for MySQL 视图创建使用方法

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

二维码智慧门牌管理系统升级,解决地址要素挂接难题!

文章目录 前言一、传统问题和新解决方案二、多样化应用三、实际案例 前言 随着科技的不断发展&#xff0c;智能化管理已经深入到各行各业。在地址要素采集过程中&#xff0c;如何实现要素之间的挂接关系&#xff0c;是智慧门牌管理系统面临的重要挑战。本文将为您揭秘一种升级…

【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘

1. 错误提示 在python程序中试图导入一个名为cPickle的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named cPickle 2. 解决方案 实际上&#xff0c;cPickle是Python的pickle模块的一个C语言实现&#xff0c;通常用于…

【ROS入门】机器人导航(仿真)——导航实现

文章结构 建图 SLAM编写gmapping节点相关launch文件执行 地图服务 map_server地图保存节点 map_server地图服务 map_server 定位 amcl编写amcl节点相关的launch文件编写测试launch文件执行 路径规划 move_basemove_base与代价地图碰撞算法 move_base使用launch文件配置文件laun…

Selenium自动测试框架

selenium3 selenium元素的定位css 选择器Xpath 操作测试对象 API添加等待浏览器的操作键盘操作鼠标操作定位一组元素下拉框弹窗上传文件 <dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><…

phar反序列化学习

PHP反序列化常见的是使用unserilize()进行反序列化&#xff0c;除此之外还有其它的反序列化方法&#xff0c;不需要用到unserilize()。就是用到phar反序列化。 Phar phar文件 Phar是将php文件打包而成的一种压缩文档&#xff0c;类似于Java中的jar包。它有一个特性就是phar文…

2024级199管理类联考之写作

小作文(论证有效性分析-600字/30分/20-25分钟) 核心原理 找到明显的论证逻辑错误(找到4个即可得16分),然后分析前提推不出结论(14分)(反驳别人) 论证指的是前提推结论 前提引词&#xff1a;因为结论引词&#xff1a;所以,因此,由此可得等有些论证没有明显的引词,需要自行判断怎…

QT webengine显示HTML简单示例

文章目录 参考示例1TestWebenqine.promainwindow.hmainwindow.cppmain.cpp效果 示例2 (使用setDevToolsPage函数)main.cpp效果 参考 QT webengine显示HTML简单示例 示例1 编译器 : Desktop Qt 5.15.2 MSVC2019 64bit编辑器: QtCreator代码: TestWebenqine.pro # TestWeben…

C语言char的取值范围以及溢出情况

char 的取值范围 有符号&#xff1a; 1111 1111 ~ 1000 0000 — 0000 0000 ~ 0111 1111 -127 ~ -0 0 ~ 127 -128 ~ 127&#xff08;因为不需要两个 0 所以给负值增加了一位&#xff09; char 的溢出情况