一、简介

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

层次 描述
驱动层 驱动层实现了特定数据库与SQL接口的底层桥接
SQL接口层 SQL接口层提供了数据库类的访问
用户接口层 用户接口层提供从数据库数据到用于数据库表示的窗体的映射

二、数据库驱动

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

Driver Type Description
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server

我们也可以根据代码来查看本机Qt支持的数据库,

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

    1. QT += sql
  2. 然后通过代码:

    1. qDebug() << "Available drivers:";
    2. QStringList drivers = QSqlDatabase::drivers();
    3. qDebug() << drivers;
  3. 运行程序,可以显示现在所有能用的数据库驱动了,如:
    1. Available drivers:
    2. ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
    三、例子 ```cpp QSqlDatabase database; database = QSqlDatabase::addDatabase(“QSQLITE”); database.setDatabaseName(“database.db”); database.setUserName(“root”); database.setPassword(“123456”);

// 打开数据库 if (!database.open()) { qFatal(“failed to connect.”); return; } // QSqlQuery类提供执行和操作的SQL语句的方法 // 可以用来执行DML(数据操作语句), 如SELECT INSERT UPDATA DELETE // 以及DDL(数据定义语句), 例如CREATE TABLE // 也可以用来执行那些不是标准的SQL的数据库特定的命令

QString create_sql = “create table student (id int primary key, name varchar(30), age int);”; QString select_max_sql = “select max(id) from student”; QString insert_sql = “insert into student values (?, ?, ?)”; QString update_sql = “update student set name=:name where id=:id;”; QString select_sql = “select id, name from student;”; QString select_all_sql = “select * from student”; QString delete_sql = “delete from student where id = ?;”; QString clear_sql = “delete from student;”;

QSqlQuery query; bool isQuery = query.prepare(create_sql); qDebug() << isQuery; if (!query.exec()) { qDebug() << “create:” << query.lastError(); return; } else { qDebug() << “table created!”; } qDebug() << “start insert sql!”; int maxID = 0;

// 查询最大id query.prepare(select_max_sql); if (!query.exec()) { qDebug() << query.lastError().text(); }

while (query.next()) { maxID = query.value(0).toInt(); qDebug() << QString(“max id:%1”).arg(maxID); }

// 插入数据 query.prepare(insert_sql); query.addBindValue(maxID + 1); query.addBindValue(“name”); query.addBindValue(“25”); if (!query.exec()) { qDebug() << query.lastError(); } else { qDebug() << “inserted!”; }

// 更新数据 query.prepare(update_sql); query.bindValue(“:name”, “Qt”); query.bindValue(“:id”, 1); if (!query.exec()) { qDebug() << query.lastError(); } else { qDebug() << “update.”; }

// 查询部分数据 if (!query.exec(select_sql)) { qDebug() << query.lastError(); } else { while (query.next()) { int id = query.value(“id”).toInt(); QString name = query.value(“name”).toString(); qDebug() << QString(“id:%1 name:%2”).arg(id).arg(name); } }

// 查询所有数据 query.prepare(select_all_sql); if (!query.exec()) { qDebug() << query.lastError(); } else { while (query.next()) { int id = query.value(0).toInt(); QString name = query.value(1).toString(); int age = query.value(2).toInt();

  1. qDebug() << QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
  2. }

} // 删除数据 query.prepare(delete_sql); query.addBindValue(maxID); if (!query.exec()) { qDebug() << query.lastError(); } else { qDebug() << “deleted!”; } // 清空表 query.prepare(clear_sql); if (!query.exec()) { qDebug() << query.lastError(); } else { qDebug() << “cleared”; }

// 关闭数据库 database.close();

// 删除数据库 QFile::remove(“database.db”); ```