【Qt】Qt5.12版本編譯Oracle驅動教程

00. 目錄

QT由於受權問題,默認是不支持Oracle數據庫鏈接驅動的,須要本身解決, 該方法適用於QT5.12版本或者以上sql

01. Qt5.12安裝

【Qt5.12】Qt5.12安裝教程數據庫

02. Qt安裝注意事項

安裝Qt的時候只須要選擇MinGW和Sources源碼json

在這裏插入圖片描述

03. Qt版本和Oracle安裝路徑說明

Qt版本是Qt5.12oracle

Qt安裝路徑是H:\Qt\Qt5.12.2app

Oracle客戶端安裝版本是Oracle 11g函數

Oracle客戶端安裝的路徑是H:\app\deng\product\11.2.0\client_1測試

04. Qt5.12編譯Oracle驅動(使用MinGW 64位)

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目錄下各類驅動。

05. 讚揚

若是該博客解決了你工做上的難題,請讚揚幾元,謝謝!

參考博客: https://blog.csdn.net/dengjin20104042056/article/details/94173613

相關文章
相關標籤/搜索