网上的资料比较散,而且其实Oracle是不需要把服务端下载下来的,所以整理一下
环境:
客户机:windows10 + Qt5.6.1 32bit
服务器:OEL 5.3 32bit + Oracle11gR2 32bit
目标组件:
windows10中Oracle组件:oci.dll
Qt中Oracle组件:qsqloci.dll 和 qsqlocid.dll
说明
windows10中Oracle组件,oci.dll包含在Oracle的instantclient-basic中,直接在Oracle官网可下载到。
Qt中Oracle组件,qsqloci.dll 和 qsqlocid.dll需要通过Qt给的源码和Oracle给的instantclient-sdk,一起编译生成。前者在Qt软件安装时需要选择Src才会有,后者也是直接在Oracle官网直接下载(当然,完整下载整个Oracle11g服务端的windows版也可以获得)。
准备材料
Qt软件下载地址:http://download.qt.io/official_releases/qt/
我的是:qt-opensource-windows-x86-mingw492-5.6.1-1.exe
Oracle组件下载地址:https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html
我的是:instantclient-basic-nt-11.2.0.4.0.zip 和 instantclient-sdk-nt-11.2.0.4.0.zip
先把Qt装好,安装时记得选择Src。
我的装在:E:\Qt\Qt5.6.1\
解压Oracle的Client组件和SDK。
我的解压在:E:\Oracle\x86_instantclient_11_2\ 和 E:\Oracle\x86_instantclient_11_2\sdk\
---------------------------------------------------------------------------------------------------------------------
编译Qt的Oracle组件
配置源码
使用Qt Creator配置Qt中的Oracle组件源码:
源码位置:E:\Qt\Qt5.6.1\5.6\Src\qtbase\src\plugins\sqldrivers\oci\
直接打开目录中的oci.pro
在Qt Creator中 为oci.pro 添加windows10中Oracle的 SDK 的 inlclude 和 lib 位置。
我的在:E:\Oracle\x86_instantclient_11_2\sdk\include 和 E:\Oracle\x86_instantclient_11_2\sdk\lib\msvc
所以我的oci.pro文件内容如下:
TARGET = qsqloci
SOURCES = main.cpp
OTHER_FILES += oci.json
include(../../../sql/drivers/oci/qsql_oci.pri)
PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
INCLUDEPATH += E:\Oracle\x86_instantclient_11_2\sdk\include
LIBPATH += E:\Oracle\x86_instantclient_11_2\sdk\lib\msvc
然后保存,并关闭Qt Creator。
编译源码
使用Qt命令行工具编译Qt的Oracle组件:
打开Qt命令行工具,如下图
进入源码目录:cd E:\Qt\Qt5.6.1\5.6\Src\qtbase\src\plugins\sqldrivers\oci\
执行:qmake -makefile oci.pro
执行:mingw32-make
编译完成,qsqloci.dll 和 qsqlocid.dll 在 E:\Qt\Qt5.6.1\5.6\Src\qtbase\plugins\sqldrivers目录下。
将这两个dll拷贝至 E:\Qt\Qt5.6.1\5.6\mingw49_32\plugins\sqldrivers,使Qt可以直接调用。
---------------------------------------------------------------------------------------------------------------------
测试
使用Qt调用编译好的Oracle组件连接OEL服务器。
两个文件,connectOracle.pro 和 mian.cpp
connectOracle.pro 代码:
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
SOURCES += \
main.cpp
QT += sql
mian.cpp 代码:
#include <QWidget>
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>
#include <QDebug>
#include <QLibrary>
#include <QSqlError>
int main(int argc, char *argv[])
{
// 手动导入windows10中的oracle客户端的dll,也可以配置环境变量,由于我有多个版本的oracle客户端组件,这里就手动导入了
QLibrary * oracleLib = new QLibrary("E:\\Oracle\\x86_instantclient_11_2\\oci.dll");
oracleLib->load();
// 使用编译好的Oracle组件,连接Oracle数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setPort(1521);
db.setHostName("Oracle服务器地址");
db.setDatabaseName("数据库名");
db.setUserName("用户名");
db.setPassword("密码");
if (!db.open()) {
qDebug() << "ERROR";
// 输出打开数据库失败原因
qDebug() << db.lastError();
return 0;
}
QSqlQuery query(db);
// 执行sql语句,我的数据库中中有个表site(id int, name nvarchar2(20), address nvarchar2(50))
query.exec("select * from site");
// 打印得到的语句
while (query.next()){
qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toString();
}
// 使用QString创建sql语句,插入数据
QString sql = "insert into site(id, name, address) values(60, '分公司', '')";
query.exec(sql);
// 提交数据
query.exec("commit");
db.close();
QApplication a(argc, argv);
QWidget w;
w.resize(300,200);
w.show();
return a.exec();
}
备注:最好配置一下系统环境变量NLS_LANG,我试了TNS_ADMIN可以不配置。
NLS_LANG先查询OEL中的值
然后再windows10系统环境变量中配置NLS_LANG