Qt 中的数据库操作比较简单,因为Qt提供了不需要SQL知识就可以浏览和编辑数据库的接口。
Qt中的Qtsql模块提供了对数据库的支持,该模块中的众多类基本可以分为3层:
- 用户接口层: QSqlQueryModel,QSqlTableModel 和 QSqlRelationalTableModel
- SQL接口层:QSqlDatabase、QSqlQuery,QSqlError、QSqlField、QSqlIndex
和QSqlRecord - 驱动层: QSqlDriver ,QSqlDriverCreator< T >,QSqlDriverCreatorBase,QSqlDriverPlugin 和 QSqlResult
驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁;
SQL接口层提供了对数据的访问,其中QSqlDatabase类用来创建连接,QSqlQuery类可以使用SQL语句来实现与数据库的交互;
用户接口层的类实现了将数据库链接到窗口部件上,这些类是使用模型、视图框架实现的。
如果要使用QtSql模块中的类,需要在项目文件(.pro)中添加“”“QT+=sql”;
执行如下代码:
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << driver;
输出:
Available drivers:
“QSQLITE”
“QODBC”
“QODBC3”
“QPSQL”
“QPSQL7”
可以发现Qt 默认并不支持mysql 的驱动。不过可以手动添加mysql 的驱动文件。这里先不作重点介绍了。
这里我们先就SQLite数据库,它是一款轻型的文件型数据库,主要用在嵌入式领域,支持跨平台。
1、创建数据库链接
QSqlDataBase db = QSqlDataBase :: addDataBase("QSQLITE");//以默认方式,创建连接对象
//初始化数据库信息
db.setHostName("bigblue"); //设置主机名
db.setDatabaseName("fightdb"); //设置数据库名
db.setUserName("myname"); //设置用户名
db.setPassword("lusfasdf"); //设置密码
bool ok = db.open(); //打开数据库
2、SQLite数据库的建立
先创建connection.h 文件,
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
QMessageBox::critical(0, "Cannot open database",
"Unable to establish a database connection.", QMessageBox::Cancel);
return false;
}
QSqlQuery query;
query.exec("create table student (id int primary key, "
"name varchar(20))");
query.exec("insert into student values(0, 'LiMing')");
query.exec("insert into student values(1, 'LiuTao')");
query.exec("insert into student values(2, 'WangHong')");
return true;
}
#endif // CONNECTION_H
创建连接并插入数据表项
然后在主函数调用并查询数据库。
#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 创建数据库连接
if (!createConnection()) return 1;
// 使用QSqlQuery查询整张表
QSqlQuery query;
query.exec("select * from student");
while(query.next())
{
qDebug() << query.value(0).toInt() << query.value(1).toString();
}
return a.exec();
}