目錄c++
QT由於受權問題,默認是不支持Oracle數據庫鏈接驅動的,須要本身解決, 該方法適用於QT5.12版本或者以上sql
安裝Qt的時候只須要選擇MinGW和Sources源碼json
Qt版本是Qt5.12oracle
Qt安裝路徑是H:\Qt\Qt5.12.2app
Oracle客戶端安裝版本是Oracle 11g函數
Oracle客戶端安裝的路徑是H:\app\deng\product\11.2.0\client_1測試
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目錄下各類驅動。
若是該博客解決了你工做上的難題,請讚揚幾元,謝謝!
參考博客: https://blog.csdn.net/dengjin20104042056/article/details/94173613