Qt數據庫相關應用開發總結

一、前言

近期花瞭兩個多月時間,將數據庫相關的代碼重新封裝成瞭各種輪子(這條路必須打通,打通以後,相關項目隻需要引入這個組件pri即可),測試瞭從Qt4.7到Qt6.1的各種版本,測試瞭odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金倉等數據庫,測試瞭本地連接、遠程連接、阿裡雲連接等,測試瞭windows、linux、mac等系統,將所有項目數據庫相關的代碼全部更新瞭一遍。能夠兼容這麼多Qt版本和數據庫插件以及測試驗證系統,估計全網也沒幾個人,全國11W Qter開發者中應該也是最多不超過10人。

二、數據庫開發經驗總結

在數據庫相關的應用中,如果僅僅是單機版本,沒有特別的需要(比如領導指定,或者需要遠程存放數據),強烈建議使用sqlite數據庫,這是本人經過無數次的對比測試和N個商業項目應用得出的結論。

Qt天生內置瞭sqlite數據庫,隻需要發佈的時候帶上插件就行(可以看到插件動態庫文件比其他幾種都要大,那是因為直接將數據庫的源碼都編譯進去瞭,而其他隻編譯瞭中間通信交互的插件源碼),其他數據庫要麼還要帶上動態庫,要麼還需要創建數據源;速度上,絕對無與倫比的出類拔萃,同樣的數據庫結構(表結構、索引等完全一致),查詢速度和批量更新速度、數據庫事務等,速度都是其他幾種的至少3倍以上,而且隨著數據量的增大對比越發明顯;

幾千萬的數據量完全沒問題,而且速度和性能都還可以,不要以訛傳訛網上部分菜雞說的不支持百萬以上的數據量,本人親測億級別,數據量建議千萬級別以下,著重註意數據庫表和索引的設計;

其他數據庫還要註意版本的區別,ODBC數據源形式還容易出錯和執行失敗;

sqlite數據庫也有幾個重大缺點:不支持加密,不支持網絡訪問,不支持部分數據庫高級特性,不支持海量數據(億級別以上),但是對於絕大部分Qt項目還是足夠;

數據庫支持友好度大致是 sqlite > postgresql > mysql > odbc ;

以上都是在Qt環境中個人測試得出的結論,結果未必正確,作為參考即可,其他編程環境比如C#、JAVA請忽略,也許差別可能在中間通信的效率造成的;

三、數據庫連接說明

  1. Qt5默認提供的數據庫插件包括瞭QSQLITE、QMYSQL、QPSQL、QODBC四種,後期版本比如5.12開始把mysql也移除瞭(可能是因為開源協議的問題),其中驅動打印中還有個QMYSQL3是表示mysql3舊版本,現在默認一般都mysql5以上,QPSQL7表示postgres7舊版本,現在默認一般都postgres9以上。
  2. 根據字面意思很容易理解QSQLITE用來連接sqlite數據庫,QMYSQL用來連接mysql數據庫,QPSQL用來連接postgres數據庫,QODBC理論上可以用來連接任何支持ODBC數據源的數據庫,比如access、sqlserver、mysql、postgres、oracle等。
  3. Qt4默認提供的數據庫插件隻有QSQLITE、QODBC兩種,因為QODBC理論上可以用來連接任何支持ODBC數據源的數據庫,隻是通過瞭微軟的數據源中間件,效率上可能會有損耗,所以在Qt5又新增瞭其他幾個常用數據庫的插件比如QMYSQL、QPSQL,而其他數據庫由於協議的要求並沒有提供對應的插件需要自行編譯比如oracle。
  4. Qt內置瞭sqlite數據庫,可以觀察到qsqlite4.dll文件大小明顯比其他數據庫插件大很多,理論上光一個插件應該小很多才對,畢竟sqlite屬於小型數據庫,所以肯定是將sqlite的源碼直接編譯到插件瞭,所以我們在使用sqlite數據庫的時候無需帶一個sqlite.dll,而使用mysql則需要帶上libmysql.dll。
  5. 使用mysql、postgres等支持遠程訪問的數據庫的時候,並不需要本地安裝數據庫,隻需要發佈程序的時候帶上對應數據庫的動態庫即可,比如mysql對應帶上libmysql.dll即可,這樣程序指定數據庫主機地址就可以連接上,比如阿裡雲的mysql、postgres等雲端數據庫。
  6. mysql、posgrest等支持遠程連接的數據庫,默認安裝以後出於安全性考慮隻支持本地訪問,需要做設置才能支持遠程訪問,mysql需要增加用戶root@%即主機設置為%,postgres需要打開安裝目錄下的C:\PostgreSQL\10\data\pg_hba.conf文件,增加一行 host all all 192.168.1.0/24 md5 表示支持192.168.1.1到192.168.1.255的IP訪問,同時將C:\PostgreSQL\10\data\postgresql.conf改成listen_addresses = '*'表示支持所有地址,具體這個的含義可以自行搜索。
  7. mysql數據庫通信的默認端口是3306,postgres的是5432,這些端口都可以在安裝的時候或者後期更改。
  8. 數據庫也有位數的區別,比如你連接的是64位的數據庫那就需要用64位的Qt以及64位的數據庫插件和對應的動態庫文件,位數一定要完全一致才行,否則連不上,很多人會在這個地方摔一跤。除瞭位數的區別可能還要註意版本的區別,畢竟數據庫一直在更新升級換代,有些版本變動比較大,未必Qt發佈版本的時候對應就支持最新的數據庫,所以一般建議用稍微老一點的數據庫版本,比如mysql本人一直用5.6,測試到現在Qt5.13版本都支持。
  9. 一般的軟件默認都隻需要連接一個數據庫,所以建議直接在程序啟動以後就打開好數據庫,然後其他需要用到數據庫的地方就執行即可,最後程序關閉的時候關閉數據庫。很多初學者每次增刪改查都打開數據庫執行完成操作以後然後關閉數據庫,這樣效率極其低下。如果需要連接多個數據庫,則以數據庫連接名稱作為區分,Qt支持同時多個數據庫連接的,數據庫跨線程不安全,要加鎖,所以建議在哪個線程使用到的數據庫就在那個線程中打開,而不要主線程打開數據庫子線程使用數據庫,很可能會出問題。Qt5.10開始增加瞭數據庫跨線程使用的安全性檢查,運行時會打印提示。
  10. 創建數據庫、創建表、創建索引、初始化數據等這些都可以通過執行sql語句來實現,強烈建議在對常用的數據量比較多的表創建表的時候要創建索引,在大量的數據查詢更新操作的時候先啟動數據庫事務,執行完成以後提交數據庫事務。

四、數據庫操作流程代碼

void MainWindow::testDb()
{
    //打印當前Qt對應支持的數據庫驅動名稱
    qDebug() << QSqlDatabase::drivers();

    //創建數據庫對象,驅動名稱根據打印的填寫,"QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7"
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    //設置數據庫參數,要查看Qt文檔是否支持該數據庫,一般建議默認的就好不用設置
    //db.setConnectOptions("MYSQL_OPT_RECONNECT=1;MYSQL_OPT_CONNECT_TIMEOUT=1;");
    //設置數據庫的主機地址
    db.setHostName("127.0.0.1");
    //設置數據庫通信端口,默認值  mysql:3306  postgres:5432  sqlserver:1433
    db.setPort(5433);
    //設置數據庫名稱,默認值  mysql:mysql  postgres:postgres  sqlserver:master
    //如果是sqlite數據庫隻需要設置這個參數即可,其餘參數都不用設置,因為sqlite不需要主機端口和用戶
    //參數內容為數據庫文件的路徑 db.setDatabaseName("c:/test.db");
    db.setDatabaseName("postgres");
    //設置登錄用戶名稱,默認值  mysql:root  postgres:postgres  sqlserver:sa
    db.setUserName("postgres");
    //設置登錄用戶密碼
    db.setPassword("admin");
    //打開數據庫,如果失敗打印錯誤信息
    if (!db.open()) {
        qDebug() << db.lastError();
        return;
    }

    //執行增刪改查
    //常規查詢語句
    QString sql = "select UserName,UserPwd from UserInfo";
    //帶條件+排序+分組的查詢語句
    sql = "select UserName,UserPwd from UserInfo where UserName='admin' order by UserName asc group by UserGroup";

    //構建查詢對象,傳入sql語句查詢,可以先判斷執行成功與否再來取值
    QSqlQuery query;
    if (query.exec(sql)) {
        //循環取出所有查詢結果,對應結果是QVariant類型可以自行to到其他類型
        while(query.next()) {
            qDebug() << query.value(0).toString() << query.value(1).toString();
        }
    }

    //添加數據,拼接字符串的形式比較通用,還有占位符的形式
    sql = "insert into UserInfo(UserName,UserPwd) values('ceshi', '12345')";
    //刪除數據,如果不加where條件則表示刪除整個表的數據
    sql = "delete from UserInfo where UserName='ceshi'";
    //更新數據,如果不加where條件則表示更新整個表的數據
    sql = "update UserInfo set UserPwd='admin123' where UserName='ceshi'";

    //可以復用上面的QSqlQuery對象,也可以重新new,復用的話需要先調用clear
    query.clear();
    //添加+刪除+更新 數據隻需要知道執行成功與否就行
    if (!query.exec(sql)) {
        qDebug() << "執行sql語句失敗";
    }

    //關閉數據庫,程序自動關閉的時候也會關閉,所以隻是用一個數據庫的情況下無需手動關閉
    db.close();
}

五、數據庫綜合應用組件

(一)功能特點

  1. 同時支持多種數據庫比如odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金倉等。
  2. 一個數據庫類即可管理本地數據庫通信,也支持遠程數據庫通信等。
  3. 數據庫線程支持執行各種sql語句,包括單條和批量。
  4. 組件中的所有類打印信息、錯誤信息、執行結果都信號發出去。
  5. 集成數據庫通用翻頁類(負責具體處理邏輯),搭配分頁導航控件(負責外觀),形成超級牛逼的翻頁控件。
  6. 集成數據庫自動清理類,設定最大記錄數後臺自動清理早期數據。
  7. 集成自定義委托類,支持復選框、文本框、下拉框、日期框、微調框、進度條等。
  8. 同時支持Qt4-Qt6,親測Qt4.6到Qt6.1任意版本,任意系統和編譯器。
  9. 本組件無故障 360天7乘24小時 運行在至少上萬個現場,商業級別品質保證。
  10. 每個類都對應完整詳細的使用示例,註釋詳細,非常適合閱讀學習。
  11. 可以作為獨立的程序運行,比如自動清理早期數據,同步數據到雲端。
  12. 全部線程處理,不卡界面,自動重連數據庫。
  13. 普通測試情況,sqlite數據庫,數據庫發生器每秒鐘插入1000條記錄約0.003秒鐘,同時自動清理數據類每秒鐘刪除1000條記錄約0.13秒,不同線程互不幹擾。

(二)數據庫通信管理線程類

  1. 可設置數據庫類型,支持多種數據庫類型。
  2. 數據庫類型包括但不限於odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金倉等。
  3. 可設置數據庫連接信息包括主機地址、用戶信息等。
  4. 具有自動重連機制,可設置是否檢查連接以及檢查間隔。
  5. 支持單條sql語句隊列,一般用於查詢返回數據,每次插入一條執行一條。
  6. 支持多條sql語句隊列,一般用於遠程提交數據,每次插入一條執行多條。
  7. 支持批量sql語句隊列,一般用於批量更新數據,每次插入多條執行多條。
  8. 可設置隊列最大數量,限定排隊處理的sql語句集合。
  9. 通過信號發出 打印信息、錯誤信息、查詢結果。

(三)數據庫通用翻頁類

  1. 可設置每頁多少行記錄,自動按照設定的值進行分頁。
  2. 可設置要查詢的表名、字段集合、條件語句、排序語句。
  3. 可設置第一頁、上一頁、下一頁、末一頁、翻頁按鈕。
  4. 可設置當前頁、總頁數、總記錄數、每頁記錄數、查詢用時標簽頁。
  5. 多線程查詢總記錄數,數據量巨大時候不會卡主界面。
  6. 建議條件字段用整型類型的主鍵,速度極快。
  7. 提供查詢結果返回信號,包括當前頁、總頁數、總記錄數、查詢用時等信息。
  8. 可設置所有列或者某一列對齊樣式例如居中或者右對齊。
  9. 可增加列用於標識該條記錄,設定列的位置、標題、寬度。
  10. 提供函數直接執行第一頁、上一頁、下一頁、末一頁。
  11. 提供函數直接跳轉到指定頁。
  12. 根據是否第一頁、末一頁自動禁用對應的按鈕。
  13. 本控件是翻頁功能類,和翻頁控件navpage完美搭配,形成超級牛逼的翻頁控件。

(四)分頁導航控件

  1. 可設置頁碼按鈕的個數。
  2. 可設置字體大小。
  3. 可設置邊框圓角角度、大小、顏色。
  4. 可設置正常狀態背景顏色、文字顏色。
  5. 可識別懸停狀態背景顏色、文字顏色。
  6. 可設置按下狀態背景顏色、文字顏色。
  7. 可設置選中狀態背景顏色、文字顏色。
  8. 可設置導航位置居中對齊、左對齊、右對齊。
  9. 可設置是否顯示提示標簽控件。
  10. 自動計算總頁碼數顯示隱藏多餘按鈕。
  11. 自動計算切換頁碼導航。
  12. 和分頁導航功能類無縫對接完美融合。

(五)自動清理數據線程類

  1. 可設置要清理的對應數據庫連接名稱和表名。
  2. 可設置條件字段。
  3. 可設置排序字段。
  4. 可設置最大保留的記錄數。
  5. 可設置執行自動清理的間隔。
  6. 後期支持多個數據庫和多個表。
  7. 建議條件字段用數字類型的主鍵,速度極快。
  8. 增加統計用字段名稱設置。
  9. 增加自動清理文件夾,超過大小自動刪除文件夾中早期文件。

(六)自定義委托全傢桶

  1. 可設置多種委托類型,例如復選框、文本框、下拉框、日期框、微調框、進度條等。
  2. 可設置是否密文顯示,一般用於文本框。
  3. 可設置是否允許編輯,一般用於下拉框。
  4. 可設置是否禁用,一般用來禁用某列。
  5. 可設置數據集合,比如下拉框數據集合。
  6. 提供值變化信號,比方說下拉框值改動觸發。
  7. 可設置數據校驗自動產生不同的圖標。
  8. 支持設置校驗列、校驗規則、校驗值、校驗成功圖標、校驗失敗圖標、圖標大小。
  9. 可設置校驗數據產生不同的背景顏色和文字顏色。
  10. 校驗規則支持 == > >= < <= != contains,非常豐富。
  11. 復選框自動居中而不是左側,切換選中狀態發送對應的信號。
  12. 可設置顏色委托,自動根據顏色值繪制背景顏色,自動設置最佳文本顏色。
  13. 可設置按鈕委托,自動根據值生成多個按鈕,按鈕按下發送對應的信號。
  14. 當設置瞭委托列時自動繪制選中背景色和文字顏色。
  15. 可設置關鍵字對照表繪制關鍵字比如原始數據是 0-禁用 1-啟用。
  16. 可設置復選框對應的映射選中不選中關鍵字。
  17. 根據不同的委托類型繪制,可以依葫蘆畫瓢自行增加自己的委托。
  18. 所有功能封裝成1個類,核心代碼不到500行,使用極其方便友好。

(七)效果圖

(八)體驗地址

體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg  提取碼:uyes 文件名:bin_dbtool.zip

國內站點:https://gitee.com/feiyangqingyun

國際站點:https://github.com/feiyangqingyun

以上就是Qt數據庫相關應用開發總結的詳細內容,更多關於Qt數據庫開發的資料請關註WalkonNet其它相關文章!

推薦閱讀: