QT学习笔记-QT安装oracle oci驱动

这篇具有很好参考价值的文章主要介绍了QT学习笔记-QT安装oracle oci驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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专业版
数据库服务器版本:oracle 11.2 g
oracle instant client版本:19.19.0.0.0
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
如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
Oracle Instant Client的下载要根据操作系统版本和Oracle服务器版本匹配才行。我开发环境是Windows10 64位系统,因此选择的是Instant Client for Microsoft Windows (x64)

2、点击后会出现Oracle Instant Client版本选择,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
不同的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等包的下载,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

编译oci,需要至少2个包,就是Baisc Package、SDK Package

4、下载后如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
然后解压basic和sdk这2个压缩包。
5、我这个把解压后的文件夹复制到D盘了,复制不复制可以根据实际情况定。如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

2.2 编译qt oci驱动

2.2.1 修改oci.pro

1、首先找到qt oci项目的源码,我的源码(记住安装QT的时候一定要勾选源码)位置如下:
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
2、然后用qtcreator打开oci.pro,并对oci.pro的内容进行修改(修改之前最好先对oci项目进行一下备份),如下:

TARGET = qsqloci

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

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

OTHER_FILES += oci.json

PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)

如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

2.2.2 MinGW64构建套件编译

1、在qtcreator设置项目使用的构建套件为MinGW64,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
2、分别进行Debug编译和Release编译,编译完毕后出现如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
在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目录下。如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

2.2.3 MSVC2019_64构建套件编译

1、在qtcreator设置项目使用的构建套件为MSVC2019_64,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
这时切换到代码编辑会发现一个错误,内容为:Project ERROR: msvc-version loaded but QMAKE_MSC_VER isn’t set,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
为了解决这个问题,我们需要在D:\Qt\5.15.2\msvc2019_64\mkspecs\common\msvc-version.conf中设置一下QMAKE_MSC_VER的值,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

注意:1919那个值应该是从下面的版本设置列表中找到才行。

2、然后关闭qtcreator,重新打开qtcreator,并在qtcreator中打开oci.pro项目,然后使用MSVC2019_64构建套件进行编译,又出现了一个错误,内容为:LNK1107:文件无效或损坏:无法在0x2F8处读取 - oci.dll,如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

在使用MSVC构建套件进行编译oci时不需要在pro中指定oci.dll的路径

我们需要再修改一下pro文件的内容,修改后内容如下:

TARGET = qsqloci

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

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

OTHER_FILES += oci.json

PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)

如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
这样修改后,无论我们使用msvc构建套件还是mingw构建套件都可以正常编译过去了。
3、为了防止msvc构建套件编译生成的库文件与mingw构建套件编译生成的库文件混淆,我们先把D:\plugins\sqldrivers目录中的文件删除,然后通过msvc构建套件编译oci项目,编译完毕后生成的库文件如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记
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目录下。如下图:
QT学习笔记-QT安装oracle oci驱动,qt,qt,学习,笔记

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_WIN
    QLibrary *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;
//    }
#endif
    QStringList 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,学习,笔记文章来源地址https://www.toymoban.com/news/detail-650049.html

到了这里,关于QT学习笔记-QT安装oracle oci驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT学习笔记-QT5.15编译及安装谷歌拼音输入法(QtInputMethod_GooglePinyin)

    在使用QT进行嵌入式应用开发时,往往程序最终的运行设备是有触屏的设备。因此,不可避免的会遇到虚拟键盘和中文输入的问题。QT自带一个虚拟键盘,可以在构建套件/plugins/platforminputcontexts目录下看到2个文件: qtvirtualkeyboardplugin.dll qtvirtualkeyboardplugin.dll.debug QT自带的虚拟键

    2024年02月12日
    浏览(56)
  • QT mysql 驱动-数据库安装以及qt连接ssl报错问题

    文章末尾是引用笔记 配置MySQL8.0 环境变量 如果不配置MySQL环境变量,就不能在命令行直接输入MySQL登录命令。下面说如何配置MySQL的环境变量: 步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属性】菜单命令。 步骤2:打开【系统】窗口,单击【高级系统设

    2024年01月20日
    浏览(56)
  • Ubuntu 22.04 编译安装 Qt mysql驱动

    参考自 Ubuntu20.04.3 QT5.15.2 MySQL驱动编译 Ubuntu 18.04 编译安装 Qt mysql驱动 下边这篇博客不是主要参考的, 但是似乎解决了我的难题(找不到 libmysqlclient.so ) ubuntu18.04.2 LTS 系统关于Qt5.12.3 无法加载mysql驱动,需要重新编译MYSQL数据库驱动的问题以及解决方案 系统版本 MySQL 肯定要先安

    2024年01月16日
    浏览(66)
  • QT笔记——QT类反射机制简单学习

    学习 QT的 类反射机制 使用Qt 反射机制的条件 1.需要继承自QObject 类 或者 它的 派生类 ,并需要在类中加入Q_OBJECT 宏 2.注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入Q_INVOKABLE 宏。 3.注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。

    2024年02月09日
    浏览(122)
  • Qt学习笔记5---如何在Qt中添加资源文件

              前言: 在我们给Qt加上图片的时候,可以用本地资源添加的方式,但是此方法代码用的只能是本地资源,不好共享。那么我们可以把资源文件添加在Qt中,这样就不会出现这种问题啦! 第一步:在本地复制你想用的资源文件,点开项目的“在Explorer中显示”,粘贴

    2024年02月16日
    浏览(45)
  • QT 学习笔记(七)

    由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。 提示:具体项目创建流程和注意事项见 QT 学习笔记(一) 提示:具体项目准备工作和细节讲解见 QT 学习笔记(二) 生成一个新的项目,具体步骤过程见提示。 所谓的 GUI 界面,

    2024年02月08日
    浏览(37)
  • QT笔记——QProcess学习

    我们常常想通过某一个类,来启动一个外部进程 本文将讲解如何通过QProcess来进行启动外部进程 一:了解QProcess QProcess是Qt框架提供的一个类,用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互 1.启动进程的方式: (1.1)分离式:外部程序

    2024年02月12日
    浏览(37)
  • 学习Qt笔记

    前言: 一、Qt Creator 使用技巧  二、 Qt的元对象系统 2.1 Qt的元对象系统概述 2.1.2 属性系统  2.1.3 信号与槽  2.1.4 对象数  2.2  容器类 三、常用界面组件使用 3.1 QString字符串操作         学习笔记的内容来自 B站up主 阿西拜编程 《Qt6 C++开发指南 》2023(上册,完整版)_哔哩

    2024年01月21日
    浏览(35)
  • QT学习笔记(持续更新)

    1.自定义信号: 写在signals下,void,需要声明,不需要实现,可以有参数,可重载。 2.槽: 写在public下,void,需要声明,需要实现,可有参数,可发生重载。 3.断开信号: disconnect 4.emit: 使用emit发送信号 5.示例关键代码如下: 1.widget.cpp 2.widget.h 3.student.cpp 4.teacher.h和st

    2023年04月26日
    浏览(41)
  • Qt开发学习笔记02

    重写 mousePressEvent 方法 要在Qt中实现关机功能,你需要使用操作系统提供的相关函数或命令来执行关机操作。由于不同操作系统之间的关机方式可能有所不同,下面我将为你提供针对不同操作系统的示例代码。 Windows系统 也可使用下面方法 macOS系统 请注意,macOS系统需要使用

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包