天天看點

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

00. 目錄

文章目錄

    • 01. Qt5.12安裝
    • 02. Qt安裝注意事項
    • 03. Qt版本和Oracle安裝路徑說明
    • 04. Qt5.12編譯Oracle驅動(使用MinGW 64位)

QT因為授權問題,預設是不支援Oracle資料庫連接配接驅動的,需要自己解決, 該方法适用于QT5.12版本或者以上

【Qt5.12】Qt5.12安裝教程

安裝Qt的時候隻需要選擇MinGW和Sources源碼

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

Qt版本是Qt5.12

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

Oracle用戶端安裝版本是Oracle 11g

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

step 1: 打開源碼

打開目錄H:H:\Qt\Qt5.12.2\5.12.2\Src\qtbase\src\plugins\sqldrivers\oci下的oci.pro檔案

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

選擇配置項目

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

直接編譯出現如下錯誤

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

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)

           

紅色部分為修改部分

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

step3: 編譯

編譯之後報錯,錯誤資訊如下

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

問題分析

在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下面即可。

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

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();
    }
           

測試結果:

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

注意

繼續閱讀