Qt 使用 MySQL 数据库的基本方法

在 Qt 中,使用 MySQL 数据库的基本方法主要是通过 QSqlDatabase、QSqlQuery 等类来进行数据库的连接、查询和数据操作。以下是 Qt 中连接和操作 MySQL 数据库的基本步骤。

1. 安装 MySQL 驱动

首先,确保您的 Qt 环境已经配置了 MySQL 驱动。通常,您需要在 Qt 安装时选择支持 MySQL 的驱动。如果未安装 MySQL 驱动,您可以通过以下命令进行安装:

cpp 复制代码
sudo apt-get install libqt5sql5-mysql  # Ubuntu 系统安装 MySQL 驱动

如果您的 Qt 是从源代码编译的,确保在编译时包含了 MySQL 支持。

2. 连接到 MySQL 数据库

使用 QSqlDatabase 来建立与 MySQL 数据库的连接。可以使用 addDatabase() 方法指定驱动类型,然后设置数据库连接的相关信息。

cpp 复制代码
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

bool connectToDatabase() {
    // 创建数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");  // 使用 MySQL 驱动

    // 设置数据库连接的参数
    db.setHostName("localhost");     // 数据库服务器地址
    db.setDatabaseName("testdb");    // 数据库名
    db.setUserName("root");          // 用户名
    db.setPassword("password");      // 密码

    // 打开数据库连接
    if (!db.open()) {
        qDebug() << "Failed to connect to the database!";
        return false;
    } else {
        qDebug() << "Successfully connected to the database!";
        return true;
    }
}

3. 执行 SQL 查询

一旦成功连接到数据库,您可以使用 QSqlQuery 类来执行 SQL 查询。QSqlQuery 提供了对 SQL 语句的封装,可以执行 SELECT、INSERT、UPDATE、DELETE 等 SQL 操作。

3.1. 查询数据 (SELECT)

cpp 复制代码
void queryData() {
    QSqlQuery query;

    // 执行 SELECT 查询
    if (query.exec("SELECT * FROM employees")) {
        // 遍历查询结果
        while (query.next()) {
            QString name = query.value(0).toString(); // 获取第一列数据
            int age = query.value(1).toInt();         // 获取第二列数据
            qDebug() << "Employee name:" << name << ", Age:" << age;
        }
    } else {
        qDebug() << "Query failed:" << query.lastError();
    }
}

3.2. 插入数据 (INSERT)

cpp 复制代码
void insertData() {
    QSqlQuery query;

    // 执行 INSERT 语句
    query.prepare("INSERT INTO employees (name, age) VALUES (:name, :age)");
    query.bindValue(":name", "John Doe");
    query.bindValue(":age", 30);

    if (query.exec()) {
        qDebug() << "Data inserted successfully!";
    } else {
        qDebug() << "Insert failed:" << query.lastError();
    }
}

3.3. 更新数据 (UPDATE)

cpp 复制代码
void updateData() {
    QSqlQuery query;

    // 执行 UPDATE 语句
    query.prepare("UPDATE employees SET age = :age WHERE name = :name");
    query.bindValue(":age", 35);
    query.bindValue(":name", "John Doe");

    if (query.exec()) {
        qDebug() << "Data updated successfully!";
    } else {
        qDebug() << "Update failed:" << query.lastError();
    }
}

3.4. 删除数据 (DELETE)

cpp 复制代码
void deleteData() {
    QSqlQuery query;

    // 执行 DELETE 语句
    query.prepare("DELETE FROM employees WHERE name = :name");
    query.bindValue(":name", "John Doe");

    if (query.exec()) {
        qDebug() << "Data deleted successfully!";
    } else {
        qDebug() << "Delete failed:" << query.lastError();
    }
}

4. 处理查询结果

在查询数据时,您可以通过 QSqlQuery 对象的 next() 方法来遍历结果集,并使用 value() 方法来获取每一列的数据。您可以根据列的索引或列名来获取数据。

cpp 复制代码
QSqlQuery query;
query.exec("SELECT id, name FROM employees");

while (query.next()) {
    int id = query.value("id").toInt();       // 使用列名获取数据
    QString name = query.value(1).toString();  // 使用列索引获取数据
    qDebug() << "Employee ID:" << id << ", Name:" << name;
}

5. 事务处理

如果您需要执行多个 SQL 语句,并且这些语句之间需要保持原子性(即要么全部成功,要么全部失败),可以使用事务:

cpp 复制代码
void transactionExample() {
    QSqlQuery query;
    
    // 开始事务
    QSqlDatabase::database().transaction();

    // 执行多条 SQL 语句
    query.exec("UPDATE employees SET age = 25 WHERE name = 'Alice'");
    query.exec("INSERT INTO employees (name, age) VALUES ('Bob', 30)");

    // 提交事务
    if (query.isActive()) {
        QSqlDatabase::database().commit();
        qDebug() << "Transaction committed successfully!";
    } else {
        QSqlDatabase::database().rollback();
        qDebug() << "Transaction rolled back!";
    }
}

6. 错误处理

Qt 提供了对 SQL 查询的错误处理功能。您可以通过 lastError() 方法获取最近的错误信息:

cpp 复制代码
QSqlQuery query;
if (!query.exec("SELECT * FROM non_existent_table")) {
    qDebug() << "Query failed:" << query.lastError().text();
}

7. 关闭数据库连接

当您完成数据库操作后,记得关闭连接:

cpp 复制代码
QSqlDatabase::database().close();

8. 完整示例代码

cpp 复制代码
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

bool connectToDatabase() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("testdb");
    db.setUserName("root");
    db.setPassword("password");

    if (!db.open()) {
        qDebug() << "Failed to connect to database!";
        return false;
    }
    return true;
}

void queryData() {
    QSqlQuery query;
    if (query.exec("SELECT * FROM employees")) {
        while (query.next()) {
            QString name = query.value(0).toString();
            int age = query.value(1).toInt();
            qDebug() << "Employee name:" << name << ", Age:" << age;
        }
    } else {
        qDebug() << "Query failed:" << query.lastError();
    }
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    if (connectToDatabase()) {
        queryData();
    }

    return a.exec();
}

总结

  • QSqlDatabase 用于连接数据库,addDatabase() 设置数据库驱动。
  • QSqlQuery 用于执行 SQL 查询和命令,可以绑定参数和获取查询结果。
  • 通过 事务 可以确保多个 SQL 操作的原子性。
  • 在进行数据库操作时,确保处理好 错误异常 情况。
相关推荐
yuzhiboyouye6 分钟前
内连接,左连接,右连接怎么区别开来?
数据库
铭毅天下21 分钟前
Easysearch 版本进化全图——从 ES 国产替代到 AI Native 搜索数据库
大数据·数据库·人工智能·elasticsearch·搜索引擎
muddjsv28 分钟前
SQL 最常用技能详解与实战示例
数据库·sql·mysql
muddjsv2 小时前
大中小型企业数据配置年度成本估算分析
数据库·企业运营
ᰔᩚ. 一怀明月ꦿ2 小时前
MySQL 学习目标
学习·mysql·adb
塔能物联运维2 小时前
存量机房升级成为行业主流方向:热管理重构算力中心价值路径
数据库
lqj_本人2 小时前
鸿蒙electron跨端框架PC工志簿实战:项目、工时、阻塞和下一步都要有位置
数据库·华为·harmonyos
刘一说3 小时前
AI科技热点日报 | 2026年5月22日
数据库·人工智能·科技
LCG元3 小时前
RAG工程指南:从基础检索到生产部署全解析
java·运维·数据库
godspeed_lucip3 小时前
LLM和Agent——专题3: Agentic Workflow 入门(1)
大数据·数据库·人工智能