目录c++
QT由于受权问题,默认是不支持Oracle数据库链接驱动的,须要本身解决, 该方法适用于QT5.12版本或者以上sql
安装Qt的时候只须要选择MinGW和Sources源码json
Qt版本是Qt5.12oracle
Qt安装路径是H:\Qt\Qt5.12.2app
Oracle客户端安装版本是Oracle 11g函数
Oracle客户端安装的路径是H:\app\deng\product\11.2.0\client_1测试
step 1: 打开源码spa
打开目录H:H:\Qt\Qt5.12.2\5.12.2\Src\qtbase\src\plugins\sqldrivers\oci下的oci.pro文件.net
选择配置项目
直接编译出现以下错误
step 2: 修改配置文件(若是编译套件是64位的选择64位的库)
修改配置文件以下:
TARGET = qsqloci HEADERS += $$PWD/qsql_oci_p.h SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp #注释该行 #QMAKE_USE += oci #根据Oracle客户端安装路径 指定oci.dll QMAKE_LFLAGS +=H:\app\deng\product\11.2.0\client_1\BIN\oci.dll #根据Oracle客户端安装路径 指定头文件目录 INCLUDEPATH += H:\app\deng\product\11.2.0\client_1\oci\include #根据安装的Oracle客户端指定libPath LIBPATH += H:\app\deng\product\11.2.0\client_1\oci\lib\msvc darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ OTHER_FILES += oci.json PLUGIN_CLASS_NAME = QOCIDriverPlugin include(../qsqldriverbase.pri)
红色部分为修改部分
step3: 编译
编译以后报错,错误信息以下
问题分析
在Qt5.12里面调用的是OCIBindByPos2()函数,这个函数的第九个参数的数据类型是ub4*,可是根据oracle官方的说法:在这里找到的思路:是新的OCIBindByPos2()函数和之前的OCIBindByPos()函数有必定的区别,为了能在最新的Qt5.12上能成功编译Oracle驱动,咱们须要对oci项目下的qsql_oci.cpp的1559行代码附近进行修改。
原来代码以下:
问题解决
oci项目下的qsql_oci.cpp的1559行代码附近进行修改。
修改以后内容以下:
// binding the column 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);
这么作是将OCIBindByPos2()函数替换成OCIBindByPos()可是OCIBindByPos()函数的第九个参数是ub2*,可是实际上
bindColumn.length其实是ub4*,所以须要一个强制转换,转换完毕以后,qmake,而后从新生成项目便可,这样就彻底解决这个问题了。
step 4: 从新编译
以后再从新编译,就会发现编译经过了,这时候咱们在Qt安装的根目录下面去找 “ H:\plugins ”会发现里面有一个“ sqldrivers ”文件夹,将sqldrivers中的动态库复制到Qt的H:\Qt\Qt5.12.2\5.12.2\mingw73_64\plugins\sqldrivers下面便可。
step 5: 测试
测试代码
//1. 加载驱动 QSqlDatabase db = QSqlDatabase::addDatabase("QOCI"); //2. 设置主机名 db.setHostName("192.168.21.25"); //3. 设置数据库 db.setDatabaseName("orcl"); //4. 设置用户名 db.setUserName("scott"); //5. 设置密码 db.setPassword("11"); //6. 设置端口 db.setPort(1521); //7. 打开数据库 bool ok = db.open(); if (ok) { qDebug() << "链接Oracle数据库ok "; } else { qDebug() << "链接Oracle数据库失败 " << db.lastError().text(); } //8. 关闭链接 if (db.isOpen()) { db.close(); }
测试结果:
注意
软件的发布和测试
软件发布,部署的时候,须要复制oci.dll 到与exe同级目录下。驱动一块儿放在 exe 同级下的/sqldrivers目录下。注意程序源代码要增长: QApplication::addLibraryPath("./plugins"); 让qt启用插件目录,例如上边的sqldrivers目录下各类驱动。
若是该博客解决了你工做上的难题,请赞扬几元,谢谢!
参考博客: https://blog.csdn.net/dengjin20104042056/article/details/94173613