当前位置:首页 > 数据库 > 正文

Qt如何操作SQL数据库?

使用Qt操作SQL数据库需包含SQL模块,通过QSqlDatabase建立连接,设置主机、数据库名、用户名和密码,用QSqlQuery执行SQL语句(如SELECT/INSERT),遍历结果集处理数据,最后关闭连接,支持SQLite/MySQL等主流数据库。

准备工作

  1. 启用SQL模块

    在项目文件(.pro)中添加SQL支持:

    Qt如何操作SQL数据库? 第1张

    QT += sql
  2. 包含头文件

    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(); }

注意

Qt如何操作SQL数据库? 第2张

  • 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绑定:

Qt如何操作SQL数据库? 第3张

#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);


错误处理关键点

  1. 检查返回值:所有数据库操作后验证lastError()。
  2. 事务支持: db.transaction(); // 开始事务 // 执行多条SQL if (!db.commit()) { // 提交 db.rollback(); // 失败回滚 }


常见问题解决

  • 驱动未加载:通过QSqlDatabase::drivers()查看可用驱动列表。
  • 连接超时:MySQL默认8小时断开,需在连接字符串添加OPTION=3(自动重连)。
  • 性能优化:批量插入使用事务,查询时仅获取必要字段。


最佳实践

  1. 封装数据库类:避免全局连接,管理生命周期。
  2. 异步操作:耗时查询移至线程(QThread + moveToThread)。
  3. 安全防护:永远使用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

0