日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Qt】Qt5.12版本编译Oracle驱动教程

發布時間:2024/4/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】Qt5.12版本编译Oracle驱动教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

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

QT因為授權問題,默認是不支持Oracle數據庫連接驅動的,需要自己解決, 該方法適用于QT5.12版本或者以上

01. Qt5.12安裝

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

02. Qt安裝注意事項

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

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

Qt版本是Qt5.12

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

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

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

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

step 1: 打開源碼

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

選擇配置項目

直接編譯出現如下錯誤

step 2: 修改配置文件(如果編譯套件是64位的選擇64位的庫)

修改配置文件如下:

TARGET = qsqlociHEADERS += $$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\msvcdarwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environOTHER_FILES += oci.jsonPLUGIN_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. 贊賞

總結

以上是生活随笔為你收集整理的【Qt】Qt5.12版本编译Oracle驱动教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。