Qt5.6.1编译并连接Oracle11gR2

网上的资料比较散,而且其实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

发布了31 篇原创文章 · 获赞 11 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/MrRight17/article/details/89636133