ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Qt5.14.2连接Oracle数据库

2021-01-25 09:33:20  阅读:411  来源: 互联网

标签:oci Qt5.14 数据库 bindColumn dll OCIBindByPos2 Oracle 目录


引自:https://blog.csdn.net/be_quiet_endeavor/article/details/90342203?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

引自:https://blog.csdn.net/lpp1989/article/details/8127353

 

在win10下通过Qt5.14.2编译Oracle数据库驱动时,打开(前提安装了源码)C:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\oci下的工程文件,在oci.pro文件中更改如下所示:

需要把Oracle安装包下的OCI目录里面的include和lib的目录添加进来,如果你的电脑没有安装Oracle,那就去已经安装Oracle的电脑上对应的目录拷贝一份即可,然后按照上述代码进行配置即可;

在编译后很可能遇到下述bug:error: use of undeclared identifier 'OCIBindByPos2'

error: use of undeclared identifier 'OCIBindByPos2'

这是因为在Qt5.12里面调用的是OCIBindByPos2()函数,这个函数的第九个参数的数据类型是ub4*,但是根据oracle官方的说法:在这里找到的思路:是新的OCIBindByPos2()函数和以前的OCIBindByPos()函数有一定的区别,为了能在最新的Qt5.12上能成功编译Oracle驱动,我们需要对oci项目下的qsql_oci.cpp的1559行代码附近进行修改如下:

  1.   // binding the column
  2.   r = OCIBindByPos(
  3.   d->sql, &bindColumn.bindh, d->err, i + 1,
  4.   bindColumn.data,
  5.   bindColumn.maxLen,
  6.   bindColumn.bindAs,
  7.   bindColumn.indicators,
  8.   reinterpret_cast<ub2*>(bindColumn.lengths),
  9.   0,
  10.   arrayBind ? bindColumn.maxarr_len : 0,
  11.   arrayBind ? &bindColumn.curelep : 0,
  12.   OCI_DEFAULT);

这么做是将OCIBindByPos2()函数替换成OCIBindByPos()但是OCIBindByPos()函数的第九个参数是ub2*,但是实际上

bindColumn.length实际上是ub4*,因此需要一个强制转换,转换完毕之后,qmake,然后重新生成项目即可,这样就完全解决这个问题了。

重新生成之后就可以在C:\plugins\sqldrivers目录下找到所需要的qsqloci.dll(Release)和qsqlocid.dll(Debug),这就生成了我们所需要的驱动。
然后将驱动放在C:\Qt\Qt5.14.2\5.14.2\mingw73_64\plugins\sqldrivers目录下,你用那个编译器,就放在那个目录下。比如我用的是mingw73_64.

将驱动文件放好之后,新建一个工程,测试一下oracle数据库连接:
\

报错一:

QSqlDatabase: QOCI driver not loaded

QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QOCI QOCI8 QODBC QODBC3 QPSQL QPSQL7

"Driver not loaded Driver not loaded"

解决方法:将odc.dll文件拷贝到运行目录下

报错二:
QOCIDriver: unable to create environment

---error:--- "Unable to logon"

解决方法:下载oraociei11.dll拷贝到运行目录下

报错三:

"ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA\nUnable to logon"

解决方法:db.setDatabaseName("orcl");设置数据库名称不对



标签:oci,Qt5.14,数据库,bindColumn,dll,OCIBindByPos2,Oracle,目录
来源: https://www.cnblogs.com/kinglxg/p/14323583.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有