天天看點

2020+win10親測+QT5.14+OCI驅動編譯以及問題解決+基本使用

原文位址::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