最近几天遇到课题,需要用QT连接oracle数据库,CSDN上关于这个问题的方法有很多,也有许多编译好的动态库下载。折腾了几天,总是连接不成功。没有办法,只能多多翻看文章,终于搞了出来。不得不说,这里面的坑确实不少~
先说环境:
-
Win10-64bit
-
QT5.13编译器vs2015-64bit
-
oracle 11r2,64位
目标是编译出qsqloci.dll和qsqlocid.dll这两个文件,拷贝到C:\Qt\Qt5.13.0\5.13.0\msvc2015_64\plugins\sqldrivers目录下即可。VS2015下新建一个QT工程,简单测试一下连接数据库,工程中加入sql,再写几条简单的语句连接数据库(当然你的数据库先要配置好)。
#include "testDB.h"
#include<QtSql/QSqlDatabase>
#include<QtSql/QSqlQuery>
#include<qsqlerror.h>
#include<qdebug.h>
testDB::testDB(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("localhost");
db.setDatabaseName("orcl");
db.setUserName("system");
db.setPassword("orcl");
db.setPort(1521);
if (db.open())
{
printf("打开成功/n");
}
else
{
qDebug() << db.lastError();
}
}
在程序输出中(要先打开控制台) 从网上找到的qsqloci.dll和qsqlocid.dll也能加载,总是提示QOCI driver not loaded,而后面available driver中又有QOCI,真是郁闷!看来还是有问题,只好多翻翻文章找原因。
多方查找之后,感觉还是和QOCI驱动有关,现成的驱动不见得适合自己的环境,因此决定自己编译~
在C:\Qt\Qt5.13.0\5.13.0\Src\qtbase\src\plugins\sqldrivers\oci找到工程,根据网上找到的方法,修改oci.pro文件如下
TARGET = qsqloci
HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp
#QMAKE_USE += oci
#QMAKE_LFLAGS +=D:/oracle/product/11.2.0/client_1/BIN/oci.dll
#QMAKE_LFLAGS +=D:/oracle/product/11.2.0/client_1/oci/lib/msvc/oci.lib
#INCLUDEPATH += D:/oracle/product/11.2.0/client_1/oci/include
#LIBPATH += D:/oracle/product/11.2.0/client_1/oci/lib/MSVC
QMAKE_LFLAGS +=D:/oracle/product/11.2.0/dbhome_1/OCI/lib/MSVC/oci.lib
INCLUDEPATH += D:/oracle/product/11.2.0/dbhome_1/OCI/include
LIBPATH += D:/oracle/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)
从上面的文件中看,主要工作就是添加oci.lib,但是添加那个呢?因为我的oracle装了client,网上说不加这个不能访问数据库,我也没有验证,更坑的是这个client是32位的,编译总是有错。后来改成添加64位的oci.lib,编译成功,连接数据库也OK。回想起网上的兄弟们说过的oracle、编译器版本一定要对应,真是真理。
现把我编译好的动态库放上去,如有和我环境一样的可以直接试试,如果不行还是要自己编译一下。