Qt數據庫操作


博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 coologic博客 查閱,網址:www.coologic.cn

如本文記錄地址為 techieliang.com/A/B/C/ 請改為 www.coologic.cn/A/B/C/ 即可查閱

 

版權聲明:若無來源注明, Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:Qt數據庫操作     本文地址: http://techieliang.com/2017/11/335/
代碼較多,建議原地址查看

1. 基本操作

1.1. 連接

  1. if(!QSqlDatabase::contains()) {
  2. QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");//第二參數不提供名字,使用默認名稱,第一個參數為數據庫類型名
  3. database.setDatabaseName(m_db_file_name);//數據庫名--sqlite是文件名,sqlite不用寫下面的配置
  4. database.setHostName("techieliang.com"); //數據庫主機名
  5. database.setUserName("user"); //數據庫用戶名
  6. database.setPassword("******"); //數據庫密碼
  7. if(!database.open()) {
  8. qDebug()<<database.lastError();
  9. }
  10. }

注意addDatabase有兩個參數,第二個參數是用於給此連接命名的,若不命名則為默認名稱。

默認名稱為:qt_sql_default_connection

  1. static QSqlDatabase addDatabase(QSqlDriver* driver,
  2. const QString& connectionName = QLatin1String(defaultConnection));

1.2. 斷開連接

雖然關閉程序以后默認會斷開,不會導致文件永久占用,但是建議數據庫用完主動斷開

  1. QSqlDatabase database = QSqlDatabase::database();//根據連接名稱獲取數據庫,不填寫則為默認連接名
  2. database.close();

1.3. sql指令操作

簡單一次操作:

  1. const static QString mInsertCategorySql =
  2. "insert into category values (null,?)";//增,name名字

如果有自增量,或其他不需要輸入的字段,只需要在對應位置輸入null即可,注意不是字符串null

對於需要填充的地方可以用?代替,后續可直接用addBindValue或者bindValue指令替換,按照?出現順序替換

  1. bool SqlManager::InsertCategorySql(QString name) {
  2. QSqlQuery sql_query;//默認構造使用默認數據庫
  3. sql_query.prepare(mInsertCategorySql);
  4. sql_query.addBindValue(name);
  5. if(!sql_query.exec()) {
  6. qDebug() << sql_query.lastError();
  7. return false;
  8. }
  9. return true;
  10. }

多字段:

  1. const static QString mInsertJournalSql =
  2. "insert into journal values (null,:catagory,:date,:value,:remark,:auditing)";

使用”:XXXX”作為占位符,使用bindValue指令替換

注意,只需要給出對應類型即可,Qt會自動進行轉換,包括日期、時間均只給出Qt對應類型即可

在Sqlite中日期格式AAAA-BB-CC,也可以以字符串形式輸入但需要保證格式正確,不建議自行轉換格式

  1. bool SqlManager::InsertJournalSql(int catagory_id,
  2. QDate date,
  3. float value,
  4. QString remark,
  5. bool auditing) {
  6. QSqlQuery sql_query;//默認構造使用默認數據庫
  7. sql_query.prepare(mInsertJournalSql);
  8. sql_query.bindValue(":catagory",catagory_id);
  9. sql_query.bindValue(":date",date);
  10. sql_query.bindValue(":value",value);
  11. sql_query.bindValue(":remark",remark);
  12. sql_query.bindValue(":auditing",auditing);
  13. if(!sql_query.exec()) {
  14. qDebug() << sql_query.lastError();
  15. return false;
  16. }
  17. return true;
  18. }

有返回值的操作:

  1. const static QString mSelectAllJournalSql =
  2. "select * from journal ORDER BY data DESC";//查詢所有
  1. struct JournalStruct {
  2. long long id;//分類id
  3. QString catagory;//分類
  4. QString date;//日期
  5. float value;//值
  6. QString remark;//備注
  7. };
  8. QList<JournalStruct> SqlManager::SelectUnauditJournalSql(bool is_all) {
  9. QSqlQuery sql_query;//默認構造使用默認數據庫
  10. if(is_all)
  11. sql_query.prepare(mSelectAllJournalSql);
  12. else
  13. sql_query.prepare(mSelectUnauditJournalSql);
  14. QList<JournalStruct> s;
  15. if(!sql_query.exec()) {
  16. qDebug() << sql_query.lastError();
  17. return s;
  18. }
  19. else {
  20. //建立類型索引
  21. auto cates = SelectCategorySql();
  22. while(sql_query.next()) {
  23. s.append({sql_query.value(0).toLongLong(),
  24. sql_query.value(1).toInt(),
  25. sql_query.value(2).toString(),
  26. sql_query.value(3).toFloat(),
  27. sql_query.value(4).toString()});
  28. }
  29. return s;
  30. }
  31. }

注意:QSqlQuery 結果默認指向空,必須先調用一次next()會指向第一個結果值,通過.value(0)取對應字段值,通過toXXX轉換為對應格式。

詳細操作代碼請見流水賬記錄軟件→GitHub

2. 其他

2.1. 多數據庫情況下QSqlQuery 的使用

上述所有操作,均使用了Qt默認名稱數據庫,故可以直接通過 QSqlQuery XX構造實例。

若指定了特定的數據庫名稱,或者有多個數據庫需要使用

  1. QSqlQuery(QSqlDatabase db);

其中db可以下面的函數獲取

  1. static QSqlDatabase database(const QString& connectionName = QLatin1String(defaultConnection),
  2. bool open = true);
  3.  
  4. QSqlQuery query(QSqlDatabase::database("connectionName"));

2.2. Qt支持的數據庫

Driver Type Description
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server

上述數據取自Qt幫助文檔中QSqlDatabase的描述,其中sqlite驅動默認集成,其余數據庫需要安裝對應驅動否則無法使用

關於驅動的具體說明請見:SQL Database Drivers幫助文檔

2.3. 建議使用QSqlQuery及bindValue操作

不建議使用qstring的arg()方法自行拼接字符串,使用bindValue可以有效的防止SQL注入。

同時此方式可讀性強,也對對特殊字符具有良好的支持性。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM