Qt中的QtSQL模块提供了对数据库的支持,该模块中的众多类基本上分为三类:用户接口层,SQL接口层,驱动层。其中,驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁;SQL接口层提供了对数据库的访问;用户接口层实现了将数据库中的数据链接到窗口部件上,这样即使是不熟悉SQL也可以操作数据库。
一、基本步骤:
1.添加SQL数据库驱动
Qt默认支持一些驱动,也可以添加其他驱动
#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers(); //此处用QSqlDatabase类的静态函数drivers()来获取可用的驱动列表,然后将其遍历输出
foreach(QString driver, drivers)
qDebug() << driver;
return a.exec();
}
2.创建数据库连接:创建并打开一个或多个数据库连接(QSqlDatabase支持默认连接,如果应用程序中只需要一个数据库连接,那么使用默认连接是很方便的)。数据库连接使用连接名定义,而不是数据库名。在使用某些成员函数时需要制定一个连接名作为参数。
创建连接对象举例:
QsqlDatabase firstDB=QSqlDatabase::addDatabase("QMYSQL","first");
创建完连接之后,可以在任何地方使用QSqlDatabase::database()静态函数通过连接名称获取指向数据库连接的指针。
下面通过一个具体的例子看一下数据库连接的建立过程:
下面是代码:
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //创建一个连接对象,这里使用的是默认连接
db.setDatabaseName(":memory:"); /*设置数据库名称时使用了“:memory:”,表明这个是建立在内存中的数据库 也就是说,这个数据库只在程序运行事有效,等程序运行结束时就会将其销毁 */
if (!db.open()) { /*open()函数用来打开数据库连接 如果打开失败则弹出提示对话框 */
QMessageBox::critical(0, "Cannot open database",
"Unable to establish a database connection.", QMessageBox::Cancel);
return false;
}
QSqlQuery query; /*使用QSqlQuery创建一个student表, 并插入包含id和name两个字段的三条记录*/
query.exec("create table student (id int primary key, "
"name varchar(20))"); //primary key用来指定主键
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();
}
3.创建多个连接
可以同时建立多个连接,但要注意:不同的连接要有不同的连接名
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
static bool createConnection()
{
// 创建一个数据库连接,使用“connection1”为连接名
QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");
db1.setDatabaseName("my1.db");
if (!db1.open()) {
QMessageBox::critical(0, "Cannot open database1",
"Unable to establish