原文位址::https://blog.csdn.net/Dxs4396/article/details/104145244
相關文章
1、Win10 Qt5.12 oracle11g 64位下編譯oci驅動 Qt5.12遠端連接配接Oracle資料庫----https://blog.csdn.net/liukun0928/article/details/86314104?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase
2、win7 qt5 oracle11g 64位下編譯oci驅動----https://blog.csdn.net/sdqyhn/article/details/39855847?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
1.QT5.14下OCI驅動編譯完整步驟
1.安裝qt的時候手動選擇安裝源碼資源(預設不安裝Source的)
2.進入QT安裝目錄下E:\Qt5.14\5.14.0\Src\qtbase\src\plugins\sqldrivers\oci
輕按兩下用qtcreator打開oci.pro檔案
進行如下圖檔内對oci.pro的修改
前提準備:
找到本地oracle用戶端的目錄 例如:C:\Oracle\instantclient_11_2
(溫馨提示:oracle用戶端的版本不能比oracle服務端的低)
3.建構項目産生如下錯誤:’OCIBindByPos2’ was not declared in this scop
4.輕按兩下錯誤可以進入錯誤顯示在qsql_oci.cpp檔案的1559行
5.錯誤原因以及解決方式
新的OCIBindByPos2()函數和以前的OCIBindByPos()函數産生出入
新版本OCIBindByPos2()函數第九個參數的資料類型是ub4*
舊版本OCIBindByPos()函數第九個參數的資料類型是ub2*
故此進行一個強制類型轉化,将新版的第九個參數改位ub2*類型即可,同時函數名也要改為舊版本。
1
2
3
4
6.進行項目建構,産生的驅動程式在qt所在盤符下的plugins目錄下的sqldrivers目錄中
注意并不是在qt的目錄下,如下圖所示
7.将這産生的幾個檔案拷貝到Qt下你所用編譯器下即可,如下所示
8.如果使用驅動失敗(連接配接Oracle資料庫失敗)
問題:可能是Oracle用戶端的oci.dll動态庫識别不到
解決方案兩個:
一、可以将Oracle用戶端的oci.dll動态庫所在的檔案夾的絕對路徑添加到系統環境變量當中。
二、可以将Oracle用戶端的oci.dll動态庫直接拷貝到qt項目下
三、可以在qt中直接加載Oracle用戶端oci.dll動态庫,如下操作
//使用的時候要加入頭檔案 #include <QLibrary>
QLibrary *joker_lib = NULL;
joker_lib = new QLibrary("C:\\Oracle\\instantclient_11_2\\oci.dll");
joker_lib->load();
if(!joker_lib->isLoaded()){
qDebug()<<"動态庫沒有被加載!";
return -1;
}
1
2
3
4
5
6
7
8
2. qt中的資料庫操作
// 需要添加的子產品
QT += sql
1
2
建立資料庫執行個體, 并且登入資料庫 -> QSqlDataBase
// 得到不同的資料庫驅動的名字, 如果能得到資料庫對應的驅動名說明支援, 如果得不到, 說明不支援連接配接該資料庫
// ("QSQLITE", "QMYSQL", "QMYSQL3", "QOCI", "QOCI8", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
[static] QStringList QSqlDatabase::drivers();
// 添加一個資料庫執行個體
// 連接配接oracle 需要的驅動名 -- QOCI
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ));
參數:
- type: 指定要連接配接什麼樣的資料庫, 這個字元串是資料庫驅動的名字
- connectionName: 資料庫連接配接名, 使用這個名字區分不同的資料庫
傳回值: 得到一個資料庫執行個體
// 設定資料庫的連接配接資訊
// 使用者名, 密碼, 資料庫執行個體名, 資料庫的IP, 資料庫的端口
// 設定使用者名
void QSqlDatabase::setUserName(const QString &name);
// 設定密碼
void QSqlDatabase::setPassword(const QString &password);
// 設定資料庫執行個體名
void QSqlDatabase::setDatabaseName(const QString &name);
// 設定資料庫的IP
// 參數: IP/域名
// 本地連接配接使用域名: localhost == "127.0.0.1"
// 域名需要綁定IP位址
void QSqlDatabase::setHostName(const QString &host);
// 設定資料庫的端口
// 連接配接資料庫的時候這個函數一般不需要調用, 如果資料庫伺服器綁定的不是預設端口, 需要調用該函數
void QSqlDatabase::setPort(int port);
// 連接配接/登入/打開資料
// 登入成功: true, 失敗: false
bool QSqlDatabase::open();
// 如果登入失敗, 擷取錯誤資訊
QSqlError QSqlDatabase::lastError() const;
QString QSqlError::text() const;
// 事務操作
// 開啟一個事務
bool QSqlDatabase::transaction();
// 送出資料
bool QSqlDatabase::commit();
// 資料復原
bool QSqlDatabase::rollback();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 示例程式
// 列印支援的資料庫的驅動
qDebug() << QSqlDatabase::drivers();
// 建立資料庫執行個體
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
// 設定連接配接資訊
db.setHostName("192.168.xxx.xxx");
db.setDatabaseName("orcl");
db.setUserName("scott");
db.setPassword("tiger");
// 連接配接資料庫
bool bl = db.open();
if(!bl)
{
qDebug() << "連接配接資料失敗" << db.lastError().text();
}
else
{
qDebug() << "連接配接資料成功";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
用于執行sql語句的類 -> QSqlQuery
// 常用的構造函數
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
參數:
- query: 即将要被執行的sql語句
- db: 資料庫執行個體
// 設定并執行sql語句
// sql語句執行成功了:true, 失敗: false
bool QSqlQuery::exec(const QString &query);
bool QSqlQuery::exec();
// 如果執行的查詢的語句, 會的得到一個結果集, 這個結果集在 QSqlQuery 對象内部
// 如何周遊結果集?
// 如果得到一個條記錄傳回: true, 否則: false
bool QSqlQuery::next();
while(q->next())
{
// 将目前記錄的字段值取出
}
// 如何将目前記錄的字段值取出?
// 參數 index -> 字段的下标(編号), 第一個字段用0表示
QVariant QSqlQuery::value(int index) const;
// 參數: name: 字段的名字
QVariant QSqlQuery::value(const QString &name) const;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
示例代碼
// 列印支援的資料庫的驅動
qDebug() << QSqlDatabase::drivers();
// 建立資料庫執行個體
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
// 設定連接配接資訊
db.setHostName("192.168.xxx.xxx");
db.setDatabaseName("orcl");
db.setUserName("scott");
db.setPassword("tiger");
// 連接配接資料庫
bool bl = db.open();
if(!bl)
{
qDebug() << "連接配接資料失敗" << db.lastError().text();
}
else
{
qDebug() << "連接配接資料成功";
}
// 對資料操作使用sql語句
// 建立一個操作sql語句的類
QSqlQuery query;
QString sql = "select * from dept";
bl = query.exec(sql);
if(bl == false)
{
qDebug() <<"查詢失敗...";
return;
}
// 周遊結果集
while(query.next())
{
// 将目前記錄的字段值取出
qDebug() << "編号: " << query.value("deptno").toInt()
<< ", 姓名: " << query.value("dname").toString()
<< ", 位置: " << query.value("loc").toString();
}
// 開啟一個事務
db.transaction();
sql = "insert into dept values(01, 'Joker', '上海')";
bl = query.exec(sql);
if(bl)
{
// 送出資料
db.commit();
}
else
{
// 資料復原
db.rollback();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
qt連接配接mysql資料錯誤資訊
// "Driver not loaded Driver not loaded"
————————————————
版權聲明:本文為CSDN部落客「Mongo兵長」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/Dxs4396/article/details/104145244