关闭

qt学习笔记(七)之数据库简介

240人阅读 评论(0) 收藏 举报
分类:

笔者最近用Qt写公司的考勤机。本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手。 废话不多说,马上进入主题。


一、QtSql模块

Qt为数据库访问提供的QtSql模块实现了数据库和Qt应用程序的无缝集成,同时为开发人员提供了一套与平台无关和具体所用数据库均无关的调用接口。这使得开发人员只需掌握基本的SQL语句,就能进行简单的数据库应用程序开发。如下表所示,QtSql模块由3部分组成。

层次 描述
驱动层 驱动层实现了特定数据库与SQL接口的底层桥接。
SQL接口层 SQL接口层提供了数据库类的访问
用户接口层 用户接口层提供从数据库数据到用于数据库表示的窗体的映射
笔者有过在linux基于ncurses开发图形界面的经验。那项目要求提供记录查询功能,当时写那个就很费脑。控件都自己封装,Qt的用户接口层仍够完美的展示出数据库信息,这样的话开发人员就不用苦于设计表格控件了。

二、数据库驱动
Qt支持数据库驱动以插件的形式添加,当我们开发的时候,首先必须明确使用哪种数据库。目前Qt支持的数据库类型如下:

我们也可以通过代码来查看本机Qt支持的数据库。

如果想要使用QtSql模块,则必须在工程文件上加入一行:

[plain] view plaincopy
  1. QT += sql  
否则无法包含头文件<QtSql>

  1. qDebug() << "Available drivers:";  
  2. QStringList drivers = QSqlDatabase::drivers();  
  3. qDebug() << drivers;  
运行程序,可以显示现在所有能用的数据库驱动了。

[plain] view plaincopy
  1. Available drivers:  
  2. ("QSQLITE")  
三、简单的应用程序

最近在做考勤机,那么就以这个为例子吧。

  1. <pre name="code" class="cpp">    
  2. if(!QSqlDatabase::drivers().contains("QSQLITE"))  
  3.     {  
  4.         //如果数据库驱动里没有SQLite,则错误警告  
  5.         QMessageBox::critical(this, tr("数据库警告"), tr("系统需添加SQLite数据库驱动"), QMessageBox::Cancel);  
  6.     }  
  7.     QSqlError error = db_Init();  
  8.     if(error.type() != QSqlError::NoError)  
  9.     {  
  10.         showError(error);  
  11.         return;  
  12.     }

  13. 我使用的是SQLite数据库,所以要先确认下系统是否已安装该驱动,错误则出现消息对话框提示。  
  14. 在db_Init() 创建一张表,并且添加了一些数据。 接下来查看数据库数据,验证是否添加正确
  15. <pre name="code" class="cpp"><pre name="code" class="cpp">
  16. QSqlError MainWindow::db_Init()  
  17. {  
  18.     //QSqlDatabase::database("syscfg.dat").close();  
  19.     //QSqlDatabase::removeDatabase("syscfg.dat");  
  20.   
  21.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //添加数据库驱动  
  22.     db.setDatabaseName(":memory:");       //数据库文件名,setDatabaseName(":memory:")指的是内存数据库  
  23.   
  24.     if(!db.open())  
  25.     {  
  26.         //如果打开失败  
  27.         return db.lastError();  
  28.     }  
  29.   
  30.     //创建人员组别表,2个参量 组别ID 和组别名称  
  31.     QSqlQuery query;  
  32.     if(!query.exec("CREATE TABLE table_group(group_id INTEGER PRIMARY KEY, group_name VCHAR(10))"))  
  33.     {  
  34.         return query.lastError();  
  35.     }  
  36.   
  37.     //添加数据  
  38.     query.exec("INSERT INTO table_group VALUES(1, 'teacher')");  
  39.     query.exec("INSERT INTO table_group VALUES(2, 'student')");  
  40.   
  41.     //查看数据库  
  42.     query.exec("SELECT * FROM table_group");  
  43.   
  44.     while(query.next())       
  45.     {  
  46.         int group_id = query.value(0).toInt();  
  47.         QString group_name = query.value(1).toString();  
  48.         qDebug() << "group id=" << group_id;  
  49.         qDebug() << "group name=" << group_name;  
  50.     }  
  51.   
  52.     return QSqlError();  
  53. }
  54. 注释已经很详细了,这里只涉及了简单的SQL语句的使用。
  55. 执行程序后,可以看到我们对数据库的操作是正确的。
  56. </span></span></p><pre name="code" class="plain">
  57. group id= 1   
  58. group name= "teacher"   
  59. group id= 2   
  60. group name= "student" 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59945次
    • 积分:1039
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:89篇
    • 译文:9篇
    • 评论:0条