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

2023-11-05

相比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文件夹拷贝到目标主机上,就可以直接运行程序了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 在 QtCreator 中调试时如何查看 qDebug 消息

    我正在从 Eclipse CDT 带有 Qt 集成插件 过渡到 QtCreator 2 0 但仍有一件事困扰着我 QtCreator 当我在 QtCreator 中调试时 我在Application output tab直到我停止正在调试的
  • DBMS_SCHEDULER.DROP_JOB 仅当存在时

    我有一个 sql 脚本 在导入转储后必须运行该脚本 该脚本除了执行其他操作外 还执行以下操作 BEGIN remove program SYS DBMS SCHEDULER DROP PROGRAM program name gt STAT
  • 如何在Oracle中将“(Ab56.12345)some_string”的一个字符串列拆分为两列“Ab.12345”,“some_string”

    正如问题一样 如何拆分一个字符串列 Ab56 12345 some string到两列Ab56 12345and some string在甲骨文中 注意 并非所有列都 Ab56 12345 some string 部分列仅some stri
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • Oracle PL/SQL 将行类型作为构造函数参数传递

    是否可以将 table rowtype 作为构造函数中的参数传递 我有这样的东西 这有效 CREATE OR REPLACE TYPE shape AS OBJECT name VARCHAR2 30 area NUMBER CONSTRU
  • 如何使用 JSON_TABLE 从 Oracle JSON 列获取键值作为结果集

    我用谷歌搜索了很多 似乎无法找到适合我的简单用例的简单解决方案 我在 Oracle 12C 数据库中有一个 json 列 当然实际上是一个带有 json 约束的 varchar 在该列中我存储了这样的 Map 表示 a 9 0847 b 8
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • 无法连接 ORA-12514: TNS: 侦听器当前不知道连接描述符中请求的服务

    我想将 PLSQL 开发工具连接到数据库 但由于以下错误而无法连接 ORA 12514 TNS 侦听器当前不知道连接描述符中请求的服务 检查下面的配置 如何配置才能使其正常工作 SQL gt select value from v para
  • Qt QML MenuItem iconSource不显示

    我有一个非常简单的设置只是为了说明问题 import QtQuick Controls 1 4 import QtQuick Window 2 2 ApplicationWindow visible true width 640 heigh
  • 如何登录Oracle数据库?

    我对 Oracle 数据库中常用的日志记录方法感兴趣 我们的方法如下 我们为要记录的表创建一个日志表 日志表包含原始表的所有列以及一些特殊字段 包括时间戳 修改类型 插入 更新 删除 修改者的 id 原始表上的触发器为每次插入和删除创建一个
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • Oracle:如何查找模式中上次更新(任何表)的时间戳?

    有一个Oracle数据库模式 数据很小 但仍然有10 15个表左右 它包含一种配置 路由表 有一个应用程序必须不时轮询此架构 不得使用通知 如果架构中没有数据更新 应用程序应使用其当前的内存版本 如果任何表有任何更新 应用程序应将所有表重新
  • 我可以从匿名 PL/SQL 块向 PHP 返回值吗?

    我正在使用 PHP 和 OCI8 执行匿名 Oracle PL SQL 代码块 有没有什么方法可以让我绑定一个变量并在块完成后获取其输出 就像我以类似的方式调用存储过程时一样 SQL declare something varchar2 I
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • 是否允许在流水线 PL/SQL 表函数中使用 SELECT?

    管道函数的文档指出 在 SQL 语句 通常是SELECT 并且在大多数示例中 管道函数用于数据生成或转换 接受客户作为参数 但不发出任何 DML 语句 现在 从技术上讲 可以使用 SELECT 而不会出现 Oracle 中的任何错误 ORA
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • Oracle 数据库 12c 尝试连​​接时出错:网络适配器无法建立连接

    我第一次安装Oracle数据库12c 我正确地遵循了所有步骤并将其安装在 Windows 7 64 位上 但是当我单击 SQL Developer 并尝试创建新连接时 我输入了用户名和密码等信息 最后单击 测试 按钮 我得到了这个错误消息
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl

随机推荐

  • hello paddle

    文章目录 一 用飞桨定义模型的计算 二 准备好运行飞桨 三 告诉飞桨怎么样学习 四 运行优化算法 五 机器学习出来的参数 import paddle 导入飞桨paddle和numpy import numpy print paddle pa
  • ssh普通用户(非root用户)的密钥登录

    原文地址 ssh原理 ssh普通用户 非root用户 的密钥登录 这里以用户名 zhangsan 为例 由于个人习惯问题 我把用户zhangsan的默认目录改了 在使用密钥登录的过程中 始终提示要输入用户密码 而 var log secur
  • 群晖硬盘已损毁 Linux 修复,群晖NAS提示空间损毁修复纪实

    注 以下操作有丢失数据的风险 请慎重考虑按本文提示操作 前几天 家里的服务器RAID卡告警 提示阵列掉盘 后花了一天时间进行重新挂盘并重建数据 不是重建阵列哈 开机 OK ESXI一切正常 运行各种系统没有问题 当打开NAS时 提示报错 重
  • stm32单片机基础(一)

    stm32单片机 串口复用 IO口功能如何查看 GPIO配置选择 GPIO 如何确定外设的时钟是APB1还是APB2 概念 时钟周期 机器周期 双工 半双工 单工含义区别 串口复用 一定要记得使能复用时钟 AFIO 端口IO功能复用时钟 某
  • 线程共享和私有的数据

    引用 windows程序员面试指南 堆上的数据是线程共享的 栈上的数据是线程私有的 1 堆上共享的数据 a 进程 代码段 b 进程 数据段 c 进程打开的文件描述符 d 信号的处理器 e 进程的当前目录和 f 进程用户 ID 与进程组 ID
  • 全网最牛,接口自动化-Linux系统安装Jenkins+Ant详细步骤

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • vld(Visual Leak Detector)下载地址和源码地址

    安装包下载页面 https kinddragon github io vld eg https github com KindDragon vld releases download v2 5 1 vld 2 5 1 setup exe 源
  • kafka存储原理介绍

    几个基本概念 Topic 消息主题 每一条消息都必须要指定主题 kafka集群可以同时进行多个topic的分发 Broker 消息处理的节点 可以立即为每个broker是一个单独的kafka进程 一般部署在不同的机器上 多个broker共同
  • js 计算月份差 ,天数差

  • Linux 安装 RocketMQ(Server)

    安装 linux版 官网下载地址 解压上传至 usr local 进入上传文件目录 cd usr local rocketmq all 4 7 0 source release bin 修改runbroker sh 修改runserver
  • chatgpt赋能python:如何通过Python赚钱

    如何通过Python赚钱 介绍 Python是一种高级编程语言 广泛用于Web开发 数据分析 机器学习等领域 Python具有简单易学 功能强大 易于维护等特点 因此非常受欢迎 而且 Python开源免费 可以在各个平台上运行 不需要花费太
  • Java设计模式-里氏替换原则

    里氏替换原则 Liskov Substitution Principle 定义1 如果对每一个类型为 T1的对象 o1 都有类型为 T2 的对象o2 使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时 程序 P 的行为没
  • 虚拟机ubantu连接物理机外部代理

    1 关闭windows防火墙 2 手动设置虚拟机代理 首先代理的允许局域网连接要打开 并且端口信息是根据v2rayN左下角的端口信息填写的 注意本地监听端口和局域网监听端口不一样
  • 【MATLAB第73期】# 源码分享

    MATLAB第73期 源码分享 基于MATLAB的不同类型数据排列方式合集 学习参考链接 1 对数组的行进行排序 单元格 字符串 类别 表 2 按字符代码对文本进行排序 3 对文件名 文件夹名或文件路径进行排序 4 对字符串 单元格 分类数
  • 原理图和PCB设计--EMC审查项(具体实施需结合公司实际项目做合理变更)

    原理图EMC设计检查要点 PCB EMC设计检查要点
  • python q-q图 和PP图

    转载于https www cnblogs com king lps p 7840268 html以供学习 侵权即删 一 QQ图 分位数图示法 Quantile Quantile Plot 简称 Q Q 图 统计学里Q Q图 Q代表分位数 是
  • qmake中文官方文档

    qmake QMake提供了一个用于管理应用程序 库 其他组件的构建过程的面向工程系统 QMake扩展了每个工程文件的信息 生成一个执行编译和连接过程的Makefile 本文翻译自Qt 4 8官方文档 一 QMake使用 QMake提供了一
  • vue导出excel

    1 下载依赖包 npm install S file saver xlsx npm install D Script loader 2 下载两个文件Blob js和 Export2Excel js 在src下创建vendor文件夹 将两个j
  • MVC简介

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 MVC简介 MVC架构最早是smalltalk语言研究团提出的 应用于用户交互应用程序中 smalltalk语言和java语言有很多相似性 都是面向对象语言 很自然的SUN在
  • QT的oracle驱动QOCI连接数据库产生QOCI driver not loaded和Unable to logon的问题解决

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