上一篇                     
               
			  Qt如何操作SQL数据库?
- 数据库
- 2025-06-25
- 3118
 使用Qt操作SQL数据库需包含SQL模块,通过QSqlDatabase建立连接,设置主机、数据库名、用户名和密码,用QSqlQuery执行SQL语句(如SELECT/INSERT),遍历结果集处理数据,最后关闭连接,支持SQLite/MySQL等主流数据库。
 
准备工作
-  启用SQL模块 
 在项目文件(.pro)中添加SQL支持:QT += sql 
-  包含头文件 
 C++文件中引入必要头文件: #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug> 
连接数据库
SQLite(无需服务器)
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my_database.db");  // 文件路径
if (!db.open()) {
    qDebug() << "Error:" << db.lastError().text();
} 
MySQL/PostgreSQL
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");  // 或 "QPSQL"
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("test_db");
db.setUserName("root");
db.setPassword("password");
if (!db.open()) {
    qDebug() << "Connection error:" << db.lastError().text();
} 
注意:
- MySQL需手动安装驱动(官方教程)。
- PostgreSQL需在.pro中添加
LIBS += -lpq。
执行SQL操作
创建表
QSqlQuery query;
query.exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INT)");
if (query.lastError().isValid()) {
    qDebug() << "SQL Error:" << query.lastError().text();
} 
插入数据(防SQL注入)
query.prepare("INSERT INTO users (name, age) VALUES (?, ?)");
query.addBindValue("Alice");
query.addBindValue(30);
query.exec(); 
查询数据
query.exec("SELECT * FROM users");
while (query.next()) {
    int id = query.value("id").toInt();
    QString name = query.value("name").toString();
    qDebug() << id << name;
} 
更新/删除数据
query.prepare("UPDATE users SET age=? WHERE name=?");
query.addBindValue(31);
query.addBindValue("Alice");
query.exec(); 
使用模型视图(高级)
Qt提供QSqlTableModel实现数据与UI绑定:

#include <QSqlTableModel>
#include <QTableView>
// 创建模型
QSqlTableModel *model = new QSqlTableModel;
model->setTable("users");
model->select();
// 显示在表格视图
QTableView *view = new QTableView;
view->setModel(model);
view->show();
// 编辑后自动同步到数据库
model->setEditStrategy(QSqlTableModel::OnFieldChange); 
错误处理关键点
- 检查返回值:所有数据库操作后验证lastError()。
- 事务支持: db.transaction(); // 开始事务 // 执行多条SQL if (!db.commit()) { // 提交 db.rollback(); // 失败回滚 }
常见问题解决
- 驱动未加载:通过QSqlDatabase::drivers()查看可用驱动列表。
- 连接超时:MySQL默认8小时断开,需在连接字符串添加OPTION=3(自动重连)。
- 性能优化:批量插入使用事务,查询时仅获取必要字段。
最佳实践
- 封装数据库类:避免全局连接,管理生命周期。
- 异步操作:耗时查询移至线程(QThread+moveToThread)。
- 安全防护:永远使用prepare()而非字符串拼接SQL。
Qt的SQL模块通过统一API简化了跨数据库开发,结合模型视图可快速构建数据应用,重点在于正确管理连接、防范SQL注入,并利用事务保证数据一致性,实际开发中建议参考官方文档进行扩展。
引用说明
- Qt 6 SQL官方文档:https://doc.qt.io/qt-6/qtsql-index.html
- SQL驱动编译指南:https://doc.qt.io/qt-6/sql-driver.html
- 数据库模型示例:https://doc.qt.io/qt-6/qsqltablemodel.html
 
 
 
			