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
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檔案
選擇配置項目
直接編譯出現如下錯誤
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();
}
測試結果:
注意