Qt5.14.2连接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文件中更改如下所示:

Qt5.14.2连接Oracle数据库

需要把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数据库连接:
Qt5.14.2连接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");设置数据库名称不对



上一篇:2017是容器之年?不,也许2018年才是!


下一篇:Navicat 提示Cannot create oci environment 解决方案