Qt数据库开发

Qt 提供了强大的数据库支持,可以方便地连接和操作各种数据库(如 SQLite、MySQL、PostgreSQL 等)。Qt 的数据库模块 QtSql 提供了统一的 API,使得开发者可以轻松地进行数据库操作。以下是 Qt 数据库开发的简介和基本步骤。


1. Qt 数据库模块的核心类

  1. QSqlDatabase

    • 用于管理数据库连接。

    • 支持多种数据库驱动(如 SQLite、MySQL、PostgreSQL 等)。

  2. QSqlQuery

    • 用于执行 SQL 语句并处理查询结果。

  3. QSqlTableModel 和 QSqlRelationalTableModel

    • 用于将数据库表映射到 Qt 的模型/视图框架中,方便在 GUI 中显示和编辑数据。

  4. QSqlError

    • 用于处理数据库操作中的错误。

  5. QSqlRecord

    • 表示数据库表中的一条记录。


2. 开发环境搭建

  1. 安装数据库驱动

    • 确保系统中安装了所需的数据库驱动(如 SQLite、MySQL、PostgreSQL 等)。

    • 对于 SQLite,Qt 自带驱动,无需额外安装。

    • 对于 MySQL 或 PostgreSQL,需要安装对应的客户端库。

  2. 在项目中启用数据库模块

    • 在 .pro 文件中添加 QT += sql,以启用数据库模块。


3. 连接数据库

连接 SQLite 数据库

cpp
复制
#include <QCoreApplication>
#include <QtSql>
#include <QDebug>

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

    // 创建数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:"); // 内存数据库
    // db.setDatabaseName("mydatabase.db"); // 文件数据库

    if (!db.open()) {
        qDebug() << "Failed to connect to database:" << db.lastError().text();
        return 1;
    }

    qDebug() << "Connected to database.";

    // 关闭数据库连接
    db.close();

    return app.exec();
}

连接 MySQL 数据库

cpp
复制
#include <QCoreApplication>
#include <QtSql>
#include <QDebug>

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

    // 创建数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("mydatabase");
    db.setUserName("root");
    db.setPassword("password");

    if (!db.open()) {
        qDebug() << "Failed to connect to database:" << db.lastError().text();
        return 1;
    }

    qDebug() << "Connected to database.";

    // 关闭数据库连接
    db.close();

    return app.exec();
}

4. 执行 SQL 语句

创建表

cpp
复制
QSqlQuery query;
if (!query.exec("CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT)")) {
    qDebug() << "Failed to create table:" << query.lastError().text();
}

插入数据

cpp
复制
QSqlQuery query;
query.prepare("INSERT INTO person (name) VALUES (:name)");
query.bindValue(":name", "Alice");
if (!query.exec()) {
    qDebug() << "Failed to insert data:" << query.lastError().text();
}

查询数据

cpp
复制
QSqlQuery query("SELECT * FROM person");
while (query.next()) {
    int id = query.value("id").toInt();
    QString name = query.value("name").toString();
    qDebug() << "ID:" << id << ", Name:" << name;
}

更新数据

cpp
复制
QSqlQuery query;
query.prepare("UPDATE person SET name = :name WHERE id = :id");
query.bindValue(":name", "Bob");
query.bindValue(":id", 1);
if (!query.exec()) {
    qDebug() << "Failed to update data:" << query.lastError().text();
}

删除数据

cpp
复制
QSqlQuery query;
query.prepare("DELETE FROM person WHERE id = :id");
query.bindValue(":id", 1);
if (!query.exec()) {
    qDebug() << "Failed to delete data:" << query.lastError().text();
}

5. 使用 QSqlTableModel 显示数据

QSqlTableModel 可以将数据库表映射到 Qt 的模型/视图框架中,方便在 GUI 中显示和编辑数据。

示例代码

cpp
复制
#include <QApplication>
#include <QtSql>
#include <QTableView>
#include <QSqlTableModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 连接数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydatabase.db");
    if (!db.open()) {
        qDebug() << "Failed to connect to database:" << db.lastError().text();
        return 1;
    }

    // 创建表模型
    QSqlTableModel model;
    model.setTable("person");
    model.select();

    // 创建视图并设置模型
    QTableView view;
    view.setModel(&model);
    view.show();

    return app.exec();
}

6. 使用 QSqlRelationalTableModel 处理关系表

QSqlRelationalTableModel 是 QSqlTableModel 的扩展,支持处理关系表(外键)。

示例代码

cpp
复制
#include <QApplication>
#include <QtSql>
#include <QTableView>
#include <QSqlRelationalTableModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 连接数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydatabase.db");
    if (!db.open()) {
        qDebug() << "Failed to connect to database:" << db.lastError().text();
        return 1;
    }

    // 创建关系表模型
    QSqlRelationalTableModel model;
    model.setTable("person");
    model.setRelation(2, QSqlRelation("department", "id", "name")); // 外键关系
    model.select();

    // 创建视图并设置模型
    QTableView view;
    view.setModel(&model);
    view.show();

    return app.exec();
}

7. 错误处理

通过 QSqlError 可以获取数据库操作中的错误信息。

示例代码

cpp
复制
QSqlQuery query;
if (!query.exec("SELECT * FROM nonexistent_table")) {
    QSqlError error = query.lastError();
    qDebug() << "Error:" << error.text();
}

8. 事务处理

通过 QSqlDatabase::transaction() 和 QSqlDatabase::commit() 可以实现事务处理。

示例代码

cpp
复制
QSqlDatabase::database().transaction();

QSqlQuery query;
query.exec("INSERT INTO person (name) VALUES ('Alice')");
query.exec("INSERT INTO person (name) VALUES ('Bob')");

if (/* 检查操作是否成功 */) {
    QSqlDatabase::database().commit();
} else {
    QSqlDatabase::database().rollback();
}

总结

Qt 数据库开发提供了统一的 API,支持多种数据库(如 SQLite、MySQL、PostgreSQL 等)。通过掌握数据库连接、SQL 语句执行、模型/视图框架和事务处理等技术,可以轻松开发数据库驱动的应用程序。

posted @ 2025-02-26 14:57  远方是什么样子  阅读(67)  评论(0)    收藏  举报