0、背景
在使用QT開(kāi)發(fā)應(yīng)用的過(guò)程中,往往會(huì)把應(yīng)用使用過(guò)程中產(chǎn)生的數(shù)據(jù)放入數(shù)據(jù)庫(kù)進(jìn)行統(tǒng)一存儲(chǔ),因此通過(guò)QT實(shí)現(xiàn)數(shù)據(jù)庫(kù)的訪問(wèn)可以說(shuō)是必須的一個(gè)知識(shí)點(diǎn),其實(shí)QT訪問(wèn)數(shù)據(jù)庫(kù)的語(yǔ)法及相關(guān)類(lèi)和方法的使用并不復(fù)雜,但是對(duì)于使用QT的新人來(lái)說(shuō)往往會(huì)開(kāi)在數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載的地方,比如遇到以下問(wèn)題:
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMARIADB QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
雖然QT的驅(qū)動(dòng)列表中有QPSQL,但是確保不能加載。下面就來(lái)說(shuō)一下正確使用QT方法數(shù)據(jù)的驅(qū)動(dòng)問(wèn)題。
QT最新的安裝包安裝完畢后,默認(rèn)支持ODBC和SQLITE數(shù)據(jù)庫(kù),要想使用其他的數(shù)據(jù)庫(kù)那么你在安裝QT的時(shí)候要把源碼選項(xiàng)勾上。
1、環(huán)境以及條件說(shuō)明
操作系統(tǒng):windows10專(zhuān)業(yè)版
數(shù)據(jù)庫(kù)服務(wù)器版本:oracle 11.2 g
oracle instant client版本:19.19.0.0.0
QT版本:5.15.2,且安裝的時(shí)候勾選了源碼
QT安裝目錄:D:\Qt
QT編譯套件1:MinGW64(關(guān)于32位位與64位問(wèn)題要與數(shù)據(jù)庫(kù)一致)
QT編譯套件2:MSVC2019_64(不同的編譯套件默認(rèn)內(nèi)置的數(shù)據(jù)庫(kù)驅(qū)動(dòng)是不一樣的,具體看套件的plugins/sqldrivers/目錄下的庫(kù)文件)
2、編譯驅(qū)動(dòng)
2.1 下載oracle instant client
1、首先要下載oracleclient,因?yàn)樵诰幾goci驅(qū)動(dòng)時(shí)要依賴oracleclient中的庫(kù)和頭文件。下載地址為:
https://www.oracle.com/database/technologies/instant-client/downloads.html
如下圖:
Oracle Instant Client的下載要根據(jù)操作系統(tǒng)版本和Oracle服務(wù)器版本匹配才行。我開(kāi)發(fā)環(huán)境是Windows10 64位系統(tǒng),因此選擇的是Instant Client for Microsoft Windows (x64)
2、點(diǎn)擊后會(huì)出現(xiàn)Oracle Instant Client版本選擇,如下圖:
不同的Oracle Instant Client版本支持的Oracle服務(wù)器的版本也不相同,我用的Oracle服務(wù)器版本是11.2,這里選擇的版本是Version 19.xx.x.x.x,我之前下載的是19.19,現(xiàn)在截圖的時(shí)候已經(jīng)是19.20,差別不大。
3、點(diǎn)開(kāi)后可以看到有BasicPackage、SQL*Plus Package、Tools Package、SDK Package、JDBC Supplement Package、ODBC Package等包的下載,如下圖:
編譯oci,需要至少2個(gè)包,就是Baisc Package、SDK Package
4、下載后如下圖:
然后解壓basic和sdk這2個(gè)壓縮包。
5、我這個(gè)把解壓后的文件夾復(fù)制到D盤(pán)了,復(fù)制不復(fù)制可以根據(jù)實(shí)際情況定。如下圖:
2.2 編譯qt oci驅(qū)動(dòng)
2.2.1 修改oci.pro
1、首先找到qt oci項(xiàng)目的源碼,我的源碼(記住安裝QT的時(shí)候一定要勾選源碼)位置如下:
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci
2、然后用qtcreator打開(kāi)oci.pro,并對(duì)oci.pro的內(nèi)容進(jìn)行修改(修改之前最好先對(duì)oci項(xiàng)目進(jìn)行一下備份),如下:
TARGET = qsqloci
HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp
#注釋該行
#QMAKE_USE += oci
#根據(jù)Oracle客戶端安裝路徑 指定oci.dll
QMAKE_LFLAGS += D:\oracleinstantclient_19_19\oci.dll
#根據(jù)Oracle客戶端安裝路徑 指定頭文件目錄
INCLUDEPATH += D:\oracleinstantclient_19_19\sdk\include
#根據(jù)Oracle客戶端安裝路徑 指定庫(kù)文件(.lib)路徑
LIBS += -LD:\oracleinstantclient_19_19\sdk\lib\msvc -loci
darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
如下圖:
2.2.2 MinGW64構(gòu)建套件編譯
1、在qtcreator設(shè)置項(xiàng)目使用的構(gòu)建套件為MinGW64,如下圖:
2、分別進(jìn)行Debug編譯和Release編譯,編譯完畢后出現(xiàn)如下圖:
在D:\plugins\sqldrivers目錄生成的libqsqloci.a、qsqloci.dll、qsqloci.dll.debug
3、讓QT的程序能找到編譯好的驅(qū)動(dòng)。
qt工程在編譯是默認(rèn)尋找數(shù)據(jù)庫(kù)驅(qū)動(dòng)的路徑(注意項(xiàng)目使用的編譯套件是MinGw 64位的)是:D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers,因此需要把上一步編譯生成的3個(gè)文件libqsqloci.a、qsqloci.dll、qsqloci.dll.debug復(fù)制到D:\Qt\5.15.2\mingw81_64\plugins\sqldrivers目錄下。如下圖:
2.2.3 MSVC2019_64構(gòu)建套件編譯
1、在qtcreator設(shè)置項(xiàng)目使用的構(gòu)建套件為MSVC2019_64,如下圖:
這時(shí)切換到代碼編輯會(huì)發(fā)現(xiàn)一個(gè)錯(cuò)誤,內(nèi)容為:Project ERROR: msvc-version loaded but QMAKE_MSC_VER isn’t set,如下圖:
為了解決這個(gè)問(wèn)題,我們需要在D:\Qt\5.15.2\msvc2019_64\mkspecs\common\msvc-version.conf中設(shè)置一下QMAKE_MSC_VER的值,如下圖:
注意:1919那個(gè)值應(yīng)該是從下面的版本設(shè)置列表中找到才行。
2、然后關(guān)閉qtcreator,重新打開(kāi)qtcreator,并在qtcreator中打開(kāi)oci.pro項(xiàng)目,然后使用MSVC2019_64構(gòu)建套件進(jìn)行編譯,又出現(xiàn)了一個(gè)錯(cuò)誤,內(nèi)容為:LNK1107:文件無(wú)效或損壞:無(wú)法在0x2F8處讀取 - oci.dll,如下圖:
在使用MSVC構(gòu)建套件進(jìn)行編譯oci時(shí)不需要在pro中指定oci.dll的路徑
我們需要再修改一下pro文件的內(nèi)容,修改后內(nèi)容如下:
TARGET = qsqloci
HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp
#注釋該行
#QMAKE_USE += oci
#根據(jù)Oracle客戶端安裝路徑 指定oci.dll
!msvc {
QMAKE_LFLAGS += D:\oracleinstantclient_19_19\oci.dll
}
#根據(jù)Oracle客戶端安裝路徑 指定頭文件目錄
INCLUDEPATH += D:\oracleinstantclient_19_19\sdk\include
#根據(jù)Oracle客戶端安裝路徑 指定庫(kù)文件(.lib)路徑
LIBS += -LD:\oracleinstantclient_19_19\sdk\lib\msvc -loci
darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
如下圖:
這樣修改后,無(wú)論我們使用msvc構(gòu)建套件還是mingw構(gòu)建套件都可以正常編譯過(guò)去了。
3、為了防止msvc構(gòu)建套件編譯生成的庫(kù)文件與mingw構(gòu)建套件編譯生成的庫(kù)文件混淆,我們先把D:\plugins\sqldrivers目錄中的文件刪除,然后通過(guò)msvc構(gòu)建套件編譯oci項(xiàng)目,編譯完畢后生成的庫(kù)文件如下圖:
4、讓QT的程序能找到編譯好的驅(qū)動(dòng)。
qt工程在編譯是默認(rèn)尋找數(shù)據(jù)庫(kù)驅(qū)動(dòng)的路徑(注意項(xiàng)目使用的編譯套件是MSVC2019_64位的)是:D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers,因此需要把上一步編譯生成的3個(gè)文件libqsqloci.a、qsqloci.dll、qsqloci.dll.debug復(fù)制到D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers目錄下。如下圖:
3、訪問(wèn)數(shù)據(jù)庫(kù)運(yùn)行成功
1、需要在代碼中指定引用的oci庫(kù)的路徑
QLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");
oci_lib->load();
if (!oci_lib->isLoaded())
{
qDebug() << "oracle oci動(dòng)態(tài)庫(kù)加載失敗!";
return;
}
2、完整測(cè)試代碼如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-650049.html
#ifdef Q_OS_WIN
QLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");
oci_lib->load();
if (!oci_lib->isLoaded())
{
qDebug() << "oracle oci動(dòng)態(tài)庫(kù)加載失敗!";
return;
}
#else
// QLibrary *oci_lib = new QLibrary("/usr/lib/oracleclient/instantclient_19_19/libclntsh.so");
// bool loadresult = oci_lib->load();
// qDebug() << "oracle oci動(dòng)態(tài)庫(kù)load result is " << loadresult;
// if (!loadresult)
// {
// qDebug() << oci_lib->errorString();
// }
// if (!oci_lib->isLoaded())
// {
// qDebug() << "oracle oci動(dòng)態(tài)庫(kù)libclntsh.so加載失敗!";
// return;
// }
#endif
QStringList driverList = QSqlDatabase::drivers();
qDebug() << driverList;
//以下代碼測(cè)試訪問(wèn)Oracle數(shù)據(jù)庫(kù)
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("172.16.12.6");
db.setPort(1521);
db.setDatabaseName("orcl");
db.setUserName("mes");
db.setPassword("oracle");
if (!db.open())
{
qDebug() << "數(shù)據(jù)庫(kù)連接失敗!";
}
else
{
qDebug() << "數(shù)據(jù)庫(kù)連接成功!";
}
3、運(yùn)行結(jié)果如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-650049.html
到了這里,關(guān)于QT學(xué)習(xí)筆記-QT安裝oracle oci驅(qū)動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!