QSql 基本用法

一、QtSql模块

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

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

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

QSql 基本用法_第1张图片

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

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

[plain]  view plain copy
  1. QT += sql  
否则无法包含头文件

[cpp]  view plain copy
  1. qDebug() << "Available drivers:";  
  2. QStringList drivers = QSqlDatabase::drivers();  
  3. qDebug() << drivers;  

运行程序,可以显示现在所有能用的数据库驱动了。

[plain]  view plain copy
  1. Available drivers:  
  2. ("QSQLITE")  

在之前已经说了用户接口层提供从数据库数据到用户数据表示的窗体的映射。

除了QSqlQuery类外,Qt还提供了三种用于访问数据库的高层类。

类名 用途
QSqlQueryMdoel 基于任意SQL语句的只读模型
QSqlTableModel 基于单个表的读写模型
QSqlReltionalTableModel QSqlTableModel的子类,增加了外键支持
这三个类在不涉及数据库库的图形表示时可以单独使用,进行数据库操作。同时也可以作为数据源映射到QListView和QTableView等基于视图模式的Qt类中表示出来。

下面的代码是在上一节的基础上添加的。

1、QSqlQueryMdoel

[cpp]  view plain copy
  1. QSqlQueryModel *model = new QSqlQueryModel();  
  2. model->setQuery("SELECT table_user.user_id, table_group.group_name FROM table_group,"  
  3.                 "table_user WHERE table_group.group_id=table_user.group_id");  
  4.   
  5. for(int i = 0; i < model->rowCount(); i++)  
  6. {  
  7.     qDebug() << model->record(i).value("user_id").toString();  
  8.     qDebug() << model->record(i).value("group_name").toString();  
  9. }  
这段代码使用了多表查询,目的是得到工号和对应组别的数据。

这里顺带提一提SQLite 多表查询的方法。

多表查询方法:

[sql]  view plain copy
  1. sqlite3可以有多种多表查询方法,比如  select (select * from table2)  from table1 where xxx=xxx;  

[sql]  view plain copy
  1. select table1.abc from table1,table2 where table1.xxx=table2.xxx;  

或这种

[sql]  view plain copy
  1. select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;  
在使用QSqlQueryModel::setQuery()进行查询语句的设置后(执行后得到查询结果集),我们就可以使用record(i)访问每一条单独的记录了。

2、QSqlTableModel

[cpp]  view plain copy
  1. QSqlTableModel tablemodel;      //单表查询  
  2. tablemodel.setTable("table_user");  //绑定表  
  3. tablemodel.setFilter("group_id=1"); //设置查询条件  
  4. tablemodel.select();                //查询  
  5. for(int i = 0; i < tablemodel.rowCount(); i++)  
  6. {  
  7.     qDebug() << tablemodel.record(i).value(1).toString();  
  8. }  
QSqlTableModel的使用也比较简单。注意的一点是,他只能操作单个表。

因为table_user表只有2个字段。所以通过value()指定字段索引的时候,直接写了索引值。在操作大量数据的时候,最好通过索引指定字段。如:

[cpp]  view plain copy
  1. int UserID_Index = tablemodel.record().indexOf("user_id");  
  2. qDebug() << tablemodel.record(i).value(UserID_Index).toString();  
或者

[cpp]  view plain copy
  1. tablemodel.record(i).value("user_id").toString();  

注意,一定要调用select()。否则不能得到查询结果集

3、QSqlReltionalTableModel

[cpp]  view plain copy
  1. QSqlRelationalTableModel *model = new QSqlRelationalTableModel();  
  2. model->setTable("table_user");  
  3. model->setRelation(1, QSqlRelation("table_group""group_id""group_id")); //表明table_group.group_id是table_group的主键  
  4. model->setHeaderData(0, Qt::Horizontal, tr("工号"));  
  5. model->setHeaderData(1, Qt::Horizontal, tr("组别"));  
  6.   
  7. if(!model->select())  
  8. {  
  9.     QMessageBox::critical(this, tr("错误提示"), model->lastError().text(), QMessageBox::Cancel);  
  10. }  

QSqlReltionalTableModel的用法和QSqlTableModel大同小异。第四行和第五行的作用相当为model的表头指定列设定名称(相当于数据库字段的别名)

你可能感兴趣的:(Qt)