" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt 數(shù)據(jù)庫QSqlDatabase使用示例

 更新時間:2023年12月15日 15:45:22   作者:kahh  
本文主要介紹了Qt數(shù)據(jù)庫QSqlDatabase使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

記錄一些在QT中使用QSqlDatabase操作數(shù)據(jù)庫時,需要注意的地方

創(chuàng)建數(shù)據(jù)庫

bool CDBOperatorAbstract::_openDBConn(CDatabaseConfig config)
{
    QWriteLocker locker(&m_locker);
    QSqlDatabase db;
    if(QSqlDatabase::contains(m_connectionName))
    {
        db = QSqlDatabase::database(m_connectionName);
        QStringList tables = db.tables();
        if(db.isOpen() && tables.contains(config.m_databaseName))
        {
            m_isConnected = true;
            return true;
        }
    }
    else
    {
        // 此時目標數(shù)據(jù)庫不一定存在,不指定數(shù)據(jù)庫名,會默認連接到mysql的主數(shù)據(jù)庫(mysql數(shù)據(jù)庫)
        db = QSqlDatabase::addDatabase("QMYSQL",m_connectionName);
        db.setHostName(config.m_hostAddress);   // 數(shù)據(jù)庫服務器IP
        db.setPort(config.m_port);              // 端口號
        db.setUserName(config.m_userName);      // 用戶名
        db.setPassword(config.m_userPwd);       // 密碼
    }
    // 連接數(shù)據(jù)庫
    if(!db.open())
    {
        qDebug() << db.lastError().text();
        m_isConnected = false;
        return false;
    }

    QSqlQuery query(db);
    QString strSql = QString("CREATE DATABASE IF NOT EXISTS `%1`").arg(config.m_databaseName);
    //執(zhí)行建表語句,若執(zhí)行成功
    if(query.exec(strSql))
    {
        //若查詢語句有錯
        if(query.lastError().isValid())
        {
            qDebug()<< query.lastError().text();
            m_isConnected = false;
            return false;
        }
    }
    else
    {
        m_isConnected = false;
        return false;
    }

// 確認目標數(shù)據(jù)庫創(chuàng)建成功,關閉之前打開的默認數(shù)據(jù)庫
db.close();
// 重新設置連接的數(shù)據(jù)庫名
db.setDatabaseName(config.m_databaseName);
// 重新打開數(shù)據(jù)庫
if(!db.open())
{
    m_isConnected = false;
    return false;
}
else
{
    m_isConnected = true;
    return true;
}
}

在上述創(chuàng)建數(shù)據(jù)庫的代碼中有幾個需要注意的地方:
1、一個QSqlDatabase對象表示的是一個數(shù)據(jù)庫連接,而不是字面上的數(shù)據(jù)庫(數(shù)據(jù)庫連接與數(shù)據(jù)庫的關系是:一個數(shù)據(jù)庫連接可以通過修改配置連接到多個數(shù)據(jù)庫,一個數(shù)據(jù)庫也可以有多個數(shù)據(jù)庫連接)

2、addDatabase()方法需要指定數(shù)據(jù)庫驅動類型,如MySQL、SQLite……,如果沒有指定連接名,將默認使用defaultConnection作為連接名。對于同一個連接,重復調用addDatabase(),會提示:

QSqlDatabasePrivate::addDatabase: duplicate connection name
‘qt_sql_default_connection’, old connection removed.

3、removeDatabase()刪除數(shù)據(jù)庫連接,需要在確保所有QSqlQuery查詢操作執(zhí)行完畢并且銷毀,否則會提示:

QSqlDatabasePrivate::removeDatabase: connection ‘qt_sql_default_connection’ is still in use, all queries will cease to work.

4、在進行數(shù)據(jù)庫連接時,目標數(shù)據(jù)庫可能還不存在,這時候可以不指定數(shù)據(jù)庫名進行連接,此會將連接到數(shù)據(jù)庫服務器的主數(shù)據(jù)庫,例如我使用的是MySQL數(shù)據(jù)庫服務器,就會連接到mysql數(shù)據(jù)庫

在這里插入圖片描述

5、數(shù)據(jù)庫連接建立成功后,創(chuàng)建目標數(shù)據(jù)庫(不存在時才創(chuàng)建),確保目標數(shù)據(jù)庫創(chuàng)建成功后,先關閉之前的數(shù)據(jù)庫連接,設置數(shù)據(jù)庫名稱后再重新打開。(只有重新打開數(shù)據(jù)庫連接,數(shù)據(jù)庫配置才會生效)

多線程使用數(shù)據(jù)庫

QSqlDatabase是非線程安全的,意味著在多線程環(huán)境下同時使用同一個數(shù)據(jù)庫連接對象可能會導致競態(tài)條件和數(shù)據(jù)一致性問題。因此,每個線程最好都維護一個獨立的數(shù)據(jù)庫連接,并且在同一個線程中創(chuàng)建、使用和關閉數(shù)據(jù)庫連接。如果數(shù)據(jù)庫連接有父對象,它和父對象也必須在同一個線程。
一般用QMap來管理線程和對應的數(shù)據(jù)庫連接,可以用QMap<QThread*,QSqlDatabase*>來存儲,也可以用QMap<QThread*,QString>來存儲(存連接名)

由于程序可能在各個地方操作數(shù)據(jù)庫,為了讓數(shù)據(jù)庫連接的創(chuàng)建和使用保持在同一個線程中,可以用QMetaObject::invokeMethod()將數(shù)據(jù)庫的創(chuàng)建、使用、關閉都移動到數(shù)據(jù)庫連接所在的線程中

bool CDBOperatorAbstract::checkIsInWorkThread()
{
    if(QThread::currentThread() == this->m_pThread)
        return true;
    else
        return false;
}

bool CDBOperatorAbstract::openDBConn(CDatabaseConfig config)
{
    if(checkIsInWorkThread())
    {
        return _openDBConn(config);
    }
    else
    {
        bool isOk = false;
        QMetaObject::invokeMethod(this,"_openDBConn",Qt::BlockingQueuedConnection,
                                  Q_RETURN_ARG(bool,isOk),
                                  Q_ARG(CDatabaseConfig,config));
        return isOk;
    }
}

用BlockingQueuedConnection的連接方式,會將目標函數(shù)放在接收者的生存線程中執(zhí)行,并且阻塞發(fā)送者所在的線程,直到目標函數(shù)執(zhí)行完畢。

增刪改查

numRowsAffected()這個函數(shù)返回最后一個執(zhí)行的 SQL 查詢語句所影響的行數(shù)。通常用于 INSERT、UPDATE 或 DELETE 查詢之后,用來確定有多少行受到了影響。返回值是一個整數(shù)。

lastInsertId()這個函數(shù)用于在主鍵自增的情況下,獲取最后一次 INSERT 操作生成的主鍵,返回值為QVariant類型,需要根據(jù)主鍵實際的類型進行轉換。

size()這個函數(shù)用于獲取當前查詢結果集中的記錄數(shù)。例如執(zhí)行 SELECT 查詢后需要確定返回的記錄數(shù)量。返回值是一個整數(shù)。

isValid()這個函數(shù)用于檢查 QSqlQuery 對象是否有效,即它是否正常地初始化以執(zhí)行 SQL 查詢。

到此這篇關于Qt 數(shù)據(jù)庫QSqlDatabase使用示例的文章就介紹到這了,更多相關Qt QSqlDatabase內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ LeetCode1945題解字符串轉化后的各位數(shù)字之和

    C++ LeetCode1945題解字符串轉化后的各位數(shù)字之和

    這篇文章主要為大家介紹了C++ LeetCode1945題解字符串轉化后的各位數(shù)字之和示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • C++中vector迭代器失效問題的原因及解決方案

    C++中vector迭代器失效問題的原因及解決方案

    迭代器(iterator)是一種用于遍歷數(shù)據(jù)集合的的對象,它提供了一種訪問數(shù)據(jù)集合中元素的方式,而無需暴露數(shù)據(jù)集合內部的細節(jié),使用迭代器,我們可以對數(shù)據(jù)集合中的每個元素進行處理,本文介紹了C++中關于vector迭代器失效問題的原因及解決方案,需要的朋友可以參考下
    2024-09-09
  • QT實現(xiàn)簡單打地鼠游戲

    QT實現(xiàn)簡單打地鼠游戲

    這篇文章主要為大家詳細介紹了QT實現(xiàn)簡單打地鼠游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++ Boost log日志庫超詳細講解

    C++ Boost log日志庫超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C語言操作符超詳細講解下篇

    C語言操作符超詳細講解下篇

    C?語言提供了豐富的操作符,有:算術操作符,移位操作符,位操作符,賦值操作符,單目操作符,關系操作符,邏輯操作符,條件操作符等。本篇為第二篇,讓我們通讀本篇來詳細了解吧
    2022-04-04
  • vs2022重新編譯opencv-python?cuda加速時報錯的問題解決

    vs2022重新編譯opencv-python?cuda加速時報錯的問題解決

    本文主要介紹了vs2022重新編譯opencv-python?cuda加速時報錯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • C++的sstream標準庫詳細介紹

    C++的sstream標準庫詳細介紹

    以下是對C++中的的sstream標準庫進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++中的對象數(shù)組詳細解析

    C++中的對象數(shù)組詳細解析

    在建立數(shù)組時,同樣要調用構造函數(shù)。如果有50個元素,就需要調用50次構造函數(shù)。在需要的時候,可以在定義數(shù)組時提供實參以實現(xiàn)初始化
    2013-10-10
  • C++中STL的優(yōu)先隊列priority_queue詳解

    C++中STL的優(yōu)先隊列priority_queue詳解

    這篇文章主要介紹了C++中STL的優(yōu)先隊列priority_queue詳解,今天講一講優(yōu)先隊列(priority_queue),實際上,它的本質就是一個heap,我從STL中扒出了它的實現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08
  • C++中replace()函數(shù)使用方法匯總

    C++中replace()函數(shù)使用方法匯總

    這篇文章主要介紹了C++中replace()函數(shù)使用方法匯總,在這篇文章中為大家詳細介紹C++ replace()函數(shù)的各種應用方式,希望朋友們可以從這里介紹的內容充分掌握這一應用技巧
    2015-11-11

最新評論

布尔津县| 甘洛县| 曲松县| 响水县| 宜兰县| 洞口县| 禹州市| 竹山县| 潼关县| 河源市| 柞水县| 湾仔区| 曲麻莱县| 卢龙县| 姜堰市| 右玉县| 普安县| 大丰市| 拜城县| 郸城县| 黑河市| 辛集市| 伊金霍洛旗| 株洲市| 江阴市| 阜平县| 东源县| 三门县| 牟定县| 株洲市| 吉林省| 深圳市| 河间市| 沂源县| 汽车| 平舆县| 南华县| 阳原县| 柳河县| 邓州市| 璧山县|