解决Qt连接Oracle数据库失败的问题:QOCI driver not loaded

这篇博客介绍了如何在Qt5.4.2环境下编译Oracle驱动以解决QOCIdrivernotloaded错误。首先,通过qtcreator打开oci.pro文件并进行修改,包括设置目标、包含路径和库路径。接着,编译oci驱动生成所需文件,并将它们复制到Qt的相应插件目录。最后,重启Qtcreator并执行qmake以完成配置。

Qt版本为:Qt5.4.2
Oracle版本为:Oracle 11g

解决QOCI driver not loaded
Qt安装好之后运行有关oracle数据库程序时会出现问题,原因是,Qt本身缺少一些数据库文件。

qt create编译oracle驱动
1、使用qt creater直接打开D:\qt5.4.2\5.4\Src\qtbase\src\plugins\sqldrivers\oci\oci.pro文件,工具会自动创建工程。
创建工程之后直接创建运行会报错误需要把oci.pro文件修改成下图

TARGET = qsqloci

HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp

#QMAKE_USE += oci
QMAKE_LFLAGS += oci.lib

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

INCLUDEPATH += "D:\Oracle\product\11.2.0\dbhome_1\OCI\include"
LIBPATH += "D:\Oracle\product\11.2.0\dbhome_1\OCI\lib\MSVC"

OTHER_FILES += oci.json

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

然后把qsql_oci.cppde 1559行改为

        r = OCIBindByPos(
                d->sql, &bindColumn.bindh, d->err, i + 1,
                bindColumn.data,
                bindColumn.maxLen,
                bindColumn.bindAs,
                bindColumn.indicators,
                reinterpret_cast<ub2*>(bindColumn.lengths),
                0,
                arrayBind ? bindColumn.maxarr_len : 0,
                arrayBind ? &bindColumn.curelep : 0,
                OCI_DEFAULT);

2、右键工程点击“运行”按钮,工具会自动编译oracle驱动,我生成的文件在D:\qt5.4.2\5.4\Src\qtbase\plugins\sqldrivers目录下;
在这里插入图片描述

3、把上图红框标注的两个文件复制到D:\qt5.4.2\5.4\msvc2013_64_opengl\plugins\sqldrivers文件夹下;
在这里插入图片描述

4、之后重启Qt creator,并且重新执行qmake;

<think> 我们正在处理一个关于Qt数据库驱动的问题。用户遇到了“QSqlDatabase: QOCI driver not loaded”的错误,并提到参考了某篇关于编译QOCI驱动的文章。用户希望找到解决方法。 根据引用[1],用户尝试编译了QOCI驱动,但程序运行时仍然提示驱动未加载,并且可用驱动列表中不包含QOCI。 可能的原因及解决方法: 1. 编译的驱动没有正确安装到Qt的插件目录。 2. 程序运行时没有找到插件目录,或者环境变量设置不正确。 3. 编译的驱动与当前使用的Qt版本不兼容。 具体步骤: 1. 确认编译的驱动文件(如qsqloci.dll)已经放到了正确的目录(Qt的插件目录,例如:Qt/5.15.2/plugins/sqldrivers)。 2. 检查程序运行时是否能够访问到该目录。可以通过在程序中打印Qt的库路径来验证,或者设置环境变量QT_DEBUG_PLUGINS=1来查看插件加载的调试信息。 3. 确保编译驱动时使用的Qt版本和当前程序使用的Qt版本一致(包括编译套件,如MinGW/MSVC)。 4. 确认Oracle客户端的安装是否正确,并确保相关的OCI库(如oci.dll)在系统路径中。 下面提供一个检查步骤的示例: 步骤一:检查驱动文件位置 将编译生成的qsqloci.dll(以及可能需要的qsqloci.dll.debug)复制到Qt的sqldrivers目录下。 步骤二:设置环境变量(可选,如果Oracle客户端库不在系统路径) 将Oracle客户端的安装目录(包含oci.dll等)添加到系统PATH环境变量中。 步骤三:调试插件加载 在运行程序前,设置环境变量QT_DEBUG_PLUGINS=1,然后运行程序,查看输出的调试信息,看是否加载了QOCI驱动以及是否有错误信息。 步骤四:在代码中检查可用驱动 在数据库连接前,可以使用以下代码检查可用的驱动: ```cpp qDebug() << "Available drivers:"; QStringList drivers = QSqlDatabase::drivers(); foreach(QString driver, drivers) qDebug() << driver; ``` 如果列表中出现了QOCI,则表示驱动加载成功。 如果以上步骤仍然无法解决,可能需要重新编译驱动,并确保编译过程中没有错误。 注意:编译QtOracle驱动需要Oracle Instant Client或完整Oracle客户端的开发文件(头文件和库文件)。 下面我们将生成相关问题: </think> ### 解决 QSqlDatabase QOCI 驱动未加载问题的方法 出现 `QSqlDatabase: QOCI driver not loaded` 错误通常是由于驱动编译、路径配置或依赖问题导致的,以下是系统化的解决方案: #### 1. **检查驱动文件部署** - 确认编译生成的 `qsqloci.dll`(Windows)或 `libqsqloci.so`(Linux)文件已放入正确目录: ```bash Qt安装路径/版本号/plugins/sqldrivers # 例如:C:\Qt\6.5.0\mingw_64\plugins\sqldrivers ``` - 若使用动态编译,需将 `Qt5Sql.dll` 和 `Qt5Core.dll` 放在可执行文件同级目录[^1]。 #### 2. **验证环境变量配置** - **Windows**:将 Oracle Instant Client 路径加入 `PATH`: ```bash set PATH=%PATH%;C:\oracle\instantclient_19_14 ``` - **Linux**:配置 `LD_LIBRARY_PATH`: ```bash export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_10:$LD_LIBRARY_PATH ``` #### 3. **检查依赖库** 使用 `Dependency Walker`(Windows)或 `ldd`(Linux)检查缺失的 Oracle 库: ```bash ldd qsqloci.so | grep "not found" # Linux示例 ``` 确保以下关键文件存在: - `oci.dll`(Windows) - `libclntsh.so`(Linux) - `libnnz21.so`(Linux) #### 4. **Qt 代码调试** 在应用中添加驱动检测代码: ```cpp #include <QSqlDatabase> #include <QDebug> qDebug() << "Available drivers:" << QSqlDatabase::drivers(); ``` 若输出不含 `QOCI`,说明驱动未正确加载。 #### 5. **重新编译驱动(终极方案)** 按官方流程重新编译: ```bash cd Qt源码路径/qtbase/src/plugins/sqldrivers/oci qmake "INCLUDEPATH+=/opt/oracle/instantclient_21_10/sdk/include" \ "LIBS+=-L/opt/oracle/instantclient_21_10 -lclntsh" make ``` #### 6. **版本兼容性验证** - 确保 Qt 版本、编译器(MSVC/MingW)与 Oracle Instant Client 架构一致(32/64位) - 推荐使用 Qt LTS 版本 + Oracle 19c+ 客户端组合 > **注意**:编译前需安装 Oracle Instant Client 的 **Basic** 和 **SDK** 两个组件[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值