一、QtSql模块
Qt为数据库访问提供的QtSql模块实现了数据库和Qt应用程序的无缝集成,同时为开发人员提供了一套与平台无关和具体所用数据库均无关的调用接口。这使得开发人员只需掌握基本的SQL语句,就能进行简单的数据库应用程序开发。如下表所示,QtSql模块由3部分组成。
层次 | 描述 |
驱动层 | 驱动层实现了特定数据库与SQL接口的底层桥接。 |
SQL接口层 | SQL接口层提供了数据库类的访问 |
用户接口层 | 用户接口层提供从数据库数据到用于数据库表示的窗体的映射 |
二、数据库驱动
Qt支持数据库驱动以插件的形式添加,当我们开发的时候,首先必须明确使用哪种数据库。目前Qt支持的数据库类型如下:
我们也可以通过代码来查看本机Qt支持的数据库。
如果想要使用QtSql模块,则必须在工程文件上加入一行:
- QT += sql
- qDebug() << "Available drivers:";
- QStringList drivers = QSqlDatabase::drivers();
- qDebug() << drivers;
运行程序,可以显示现在所有能用的数据库驱动了。
- Available drivers:
- ("QSQLITE")
在之前已经说了用户接口层提供从数据库数据到用户数据表示的窗体的映射。
除了QSqlQuery类外,Qt还提供了三种用于访问数据库的高层类。
类名 | 用途 |
QSqlQueryMdoel | 基于任意SQL语句的只读模型 |
QSqlTableModel | 基于单个表的读写模型 |
QSqlReltionalTableModel | QSqlTableModel的子类,增加了外键支持 |
下面的代码是在上一节的基础上添加的。
1、QSqlQueryMdoel
- QSqlQueryModel *model = new QSqlQueryModel();
- model->setQuery("SELECT table_user.user_id, table_group.group_name FROM table_group,"
- "table_user WHERE table_group.group_id=table_user.group_id");
- for(int i = 0; i < model->rowCount(); i++)
- {
- qDebug() << model->record(i).value("user_id").toString();
- qDebug() << model->record(i).value("group_name").toString();
- }
这里顺带提一提SQLite 多表查询的方法。
多表查询方法:
- sqlite3可以有多种多表查询方法,比如 select (select * from table2) from table1 where xxx=xxx;
- select table1.abc from table1,table2 where table1.xxx=table2.xxx;
或这种
- select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;
2、QSqlTableModel
- QSqlTableModel tablemodel; //单表查询
- tablemodel.setTable("table_user"); //绑定表
- tablemodel.setFilter("group_id=1"); //设置查询条件
- tablemodel.select(); //查询
- for(int i = 0; i < tablemodel.rowCount(); i++)
- {
- qDebug() << tablemodel.record(i).value(1).toString();
- }
因为table_user表只有2个字段。所以通过value()指定字段索引的时候,直接写了索引值。在操作大量数据的时候,最好通过索引指定字段。如:
- int UserID_Index = tablemodel.record().indexOf("user_id");
- qDebug() << tablemodel.record(i).value(UserID_Index).toString();
- tablemodel.record(i).value("user_id").toString();
注意,一定要调用select()。否则不能得到查询结果集
3、QSqlReltionalTableModel
- QSqlRelationalTableModel *model = new QSqlRelationalTableModel();
- model->setTable("table_user");
- model->setRelation(1, QSqlRelation("table_group", "group_id", "group_id")); //表明table_group.group_id是table_group的主键
- model->setHeaderData(0, Qt::Horizontal, tr("工号"));
- model->setHeaderData(1, Qt::Horizontal, tr("组别"));
- if(!model->select())
- {
- QMessageBox::critical(this, tr("错误提示"), model->lastError().text(), QMessageBox::Cancel);
- }
QSqlReltionalTableModel的用法和QSqlTableModel大同小异。第四行和第五行的作用相当为model的表头指定列设定名称(相当于数据库字段的别名)