QT的oracle驱动QOCI连接数据库产生QOCI driver not loaded和Unable to logon的问题解决

博主分享了在QT环境下编译QOCI驱动以连接Oracle数据库的过程,包括下载资源、编译步骤及遇到的问题。在解决驱动加载和Unable to logon错误时,发现oci.dll的加载路径和依赖环境是关键。最终通过调整运行目录、拷贝相关文件及设置环境变量实现了程序的正常运行。
摘要由CSDN通过智能技术生成

相比mysql,oracle的驱动真是一言难尽...都是商用的,mysql的驱动编译起来又快又稳,oci真的是让人捉鸡。无奈客户一开始起步用的都是国外买的成套系统,搭配oracle数据库,数据量大不可能进行迁移,所以只能硬着头皮上了。

先记一波流水账,关于QOCI驱动的编译过程:

放几个网址

oracle数据库10g 11g的下载地址

(60条消息) Oracle10G 11G下载链接-多平台下的32位和64位_lgoodbook的博客-CSDN博客

自己编译好的QOCI和QMYSQL驱动,QT版本是5.13.2,附近基本版本应该也可以用:

5.13.2数据库驱动.rar-Oracle文档类资源-CSDN下载

OCI原本库的下载地址:Instant Client 下载 适用于 Microsoft Windows (x64) 64 位 | Oracle 中国

为了方便没有账号的同学,也已经上传instantclient-basic-windows.x64-12.2.0.1.0.zipOracle12.2客户端-Oracle文档类资源-CSDN下载

生成过程的参考教程:2020+win10亲测+QT5.14+OCI驱动编译以及问题解决+基本使用_Dxs4396的博客-CSDN博客 按照这个方法,可以通过mingw64正常生成驱动文件,但是使用mscv编译器会报错。第一个报错按照下面的方法解决

使用Mscv编译器可能的错误:Qt5.9.9编译时报错::-1: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set_寞水-CSDN博客

第二次报了一个莫名的错误,提示无法打开oci.dll的驱动。

解决问题的思路来源Qt编译oci教程 (shuzhiduo.com)

是因为配置的问题

 给MSVC和MINGW的配置不一样

用msvc编译

QMAKE_LFLAGS +=D:\app\Qiankun\product\11.2.0\dbhome_1\OCI\lib\MSVC\oci.lib

用mingw编译

QMAKE_LFLAGS +=D:\app\Qiankun\product\11.2.0\dbhome_1\BIN\oci.dll

--------------------------------分割线------------------------------

正常生成 qsqloci.dll 文件,将其放到QT对应版本的目录下,比如C:\Qt\Qt5.13.2\5.13.2\mingw73_64\plugins\sqldrivers 此时通过QTCreator生成程序的时候,可以通过qdebug输出支持的数据库驱动,其中就已经包含了QOCI

 如果直接使用QOCI驱动连接oracle数据库,大概率会报错,再次提示QOCI driver not loaded。

其实明明已经加载了QOCI的驱动,在支持名单里可以看到,但是依旧报驱动没有加载。这里要说明一下,这个driver不是指qsqloci.dll这个驱动,而是指oci.dll这个驱动。QT的框架要能够连接oracle数据库,需要加载两个东西:一个是前面生成的qsqloci.dll,这里面应该是QT的qdatabase与oci.dll交互的一些方法;另一个就是oci.dll本体,里面才是真正与数据库交互的函数,类似libmysql.dll这个文件。这里大多网上查到的解决方法会说,将oci.dll放到程序目录下,就能解决。确实,按照这个方法去做,就不会报driver not loaded的问题,database可以正常生成。但是此时去连接数据库,会产生新的错误提示:Unable to logon,无论如何修改连接参数都是这个报错。

仔细看debug输出,会发现另一个错误提示

 

大致分析,应该是说QOCI无法创建正常的运行环境。网上再搜索,考到人提出将oracle的客户端加入PATH,比如这个qt oracle unable to logon,终于编译好了qt的oracle驱动QOCI,连接driver not loaded解决方法..._嘿嘿超的博客-CSDN博客 其中关于解决Unable to logon的方法尝试无效。

经过无数次测试,偶然发现如果将生成的exe文件,经过windeployqt部署完整以后(一定要拷贝sqldrivers文件夹进去,否则驱动无法加载),从文件夹内直接启动exe,就可以完成数据库连接了。此时如果拷贝oci.dll到该目录下面,就会继续出现Unable to logon的错误。

看到这里,问题已经比较明了。这个错误的原因应该还是出在oci.dll的加载上在我们直接启动exe时,程序会优先从当前目录加载所需的各种dll,如果没有的话再去系统PATH下寻找。当前目录中含有oci.dll时,程序会直接加载这个oci.dll。而个oci.dll是不能单独运行的,必须依赖于oracle客户端下面的一系列环境才可以。所以,在当前目录没有oci.dll的时候,程序回去PATH里找到相关的客户端路径,从oracle客户端中调用oci.dll,就可以正常连接数据库了。

为了验证这个想法,首先删除系统PATH中,oracle客户端的记录,并删除程序目录下的oci.dll,此时报错driver not loaded,说明没有在任何地方找到oci.dll。接下里把oracle客户端中,所有的文件(如图,不用包含上面的sdk文件夹)全部copy到exe文件的目录下,程序可以正常连接数据库。

 此时还需要解决的,是在QTCreaotr中,直接生成程序无法调用数据库的问题。通过运行按钮直接运行生成的程序有个奇怪的特征,虽然exe文件处于对应的release文件夹中,但实际上运行目录是release的上一层文件夹,比如这个位置。直接把刚才那堆文件拷贝到这个位置即可。

当然,还有更好的方法,在.pro文件加入一个语句,可以让exe文件的生成位置改到当前工程的/bin文件夹下面,这时候exe的运行目录就正常了,就是这个bin文件夹。

可以在bin下面进行windeployqt,并将各种依赖库搬过来,包括刚才的oracle客户端。可以放到目录下新建的oracle文件夹下,并在程序的main.cpp中增加一个dll的加载语句

 

这样程序编写完成后,把这个bin文件夹拷贝到目标主机上,就可以直接运行程序了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值