Qt如何操作SQL数据库?

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

准备工作

  1. 启用SQL模块
    在项目文件(.pro)中添加SQL支持:

    Qt如何操作SQL数据库?

    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数据库?

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

错误处理关键点

  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如何操作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

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/38684.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月25日 03:11
下一篇 2025年6月16日 08:19

相关推荐

  • Excel中SQL函数如何使用?

    Excel通过SQL函数连接外部数据库执行查询,使用CONNECT建立连接,SQL.REQUEST发送SQL命令并返回结果,适合复杂数据操作,需先启用相关加载项或权限,数据源需稳定支持。

    2025年6月16日
    000
  • 数据库如何添加字段值

    使用SQL的INSERT语句添加新记录时赋值,或用UPDATE语句修改已有记录的字段值,需指定表名、字段名及对应值,UPDATE必须包含WHERE条件限定目标记录。

    2025年6月3日
    800
  • 如何快速复制数据库?

    停止数据库写入,使用数据库管理工具(如mysqldump、pg_dump)导出完整数据结构和内容为SQL文件,或直接复制数据库物理文件,然后在目标服务器创建空数据库,导入SQL文件或粘贴物理文件,最后验证数据一致性。

    2025年6月17日
    100
  • iOS本地数据库文件如何查看

    在iOS设备上打开本地数据库文件(如SQLite的.db文件),需借助工具:可通过Xcode导出文件到电脑,使用数据库查看软件(如DB Browser for SQLite)打开;或在iOS上安装支持数据库预览的第三方文件管理器应用(如Documents by Readdle)直接查看。

    2025年6月24日
    000
  • 数据库无法登录如何快速解决

    检查账户密码是否正确,确认数据库服务是否正常运行,验证网络连接是否通畅,检查防火墙或安全组设置是否阻挡访问端口,查看数据库错误日志获取具体失败原因,逐步排查以上环节即可定位问题。

    2025年6月10日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN