Qt数据库使用指南

在Qt中使用数据库通常涉及以下步骤和方法。以下是一个汇总,结合了之前讨论的内容,展示如何在Qt中使用数据库(以SQLite为例):

1. 添加数据库驱动

Qt支持多种数据库驱动,如QSQLITE、QMYSQL、QPSQL等。确保在项目文件(.pro)中包含相应的模块:

QT += core sql

2. 创建或打开数据库连接

使用 QSqlDatabase 类来创建或打开数据库连接。

#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>

bool openDatabase() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("example.db"); // 设置数据库文件名

    if (!db.open()) {
        qDebug() << "数据库打开失败:" << db.lastError().text();
        return false;
    }
    return true;
}

3. 创建表

使用 QSqlQuery 执行 SQL 语句来创建表

4. 插入数据

使用 QSqlQuery 执行 INSERT 语句插入数据。

单条插入
bool insertData() {
    QSqlQuery query;
    query.prepare("INSERT INTO Users (Name, Age, Email) VALUES (:name, :age, :email)");
    query.bindValue(":name", "John Doe");
    query.bindValue(":age", 30);
    query.bindValue(":email", "john.doe@example.com");

    if (!query.exec()) {
        qDebug() << "插入失败:" << query.lastError();
        return false;
    }
    return true;
}
批量插入
bool insertMultipleRecords(const QList<QMap<QString, QVariant>>& records) {
    QSqlDatabase db = QSqlDatabase::database();
    db.transaction();

    QSqlQuery query;
    query.prepare("INSERT INTO Users (Name, Age, Email) VALUES (:name, :age, :email)");

    for (const auto& record : records) {
        query.bindValue(":name", record["Name"]);
        query.bindValue(":age", record["Age"]);
        query.bindValue(":email", record["Email"]);
        if (!query.exec()) {
            db.rollback();
            qDebug() << "插入失败:" << query.lastError();
            return false;
        }
    }

    db.commit();
    return true;
}

5. 查询数据

使用 QSqlQuery 执行 SELECT 语句查询数据。

bool queryData() {
    QSqlQuery query;
    query.exec("SELECT ID, Name, Age, Email FROM Users");

    while (query.next()) {
        int id = query.value("ID").toInt();
        QString name = query.value("Name").toString();
        int age = query.value("Age").toInt();
        QString email = query.value("Email").toString();

        qDebug() << "ID:" << id << "Name:" << name << "Age:" << age << "Email:" << email;
    }
    return true;
}

6. 获取末尾行ID

使用 MAX(ID) 函数获取表中最大的ID值。

int getLastRowId(const QString& tableName) {
    QSqlQuery query;
    query.exec(QString("SELECT MAX(ID) FROM %1").arg(tableName));

    if (query.next()) {
        return query.value(0).toInt();
    }
    return -1; // 如果没有记录,返回-1
}

7. 更新数据

使用 QSqlQuery 执行 UPDATE 语句更新数据。

bool updateData(int userId, const QString& newName) {
    QSqlQuery query;
    query.prepare("UPDATE Users SET Name = :name WHERE ID = :id");
    query.bindValue(":name", newName);
    query.bindValue(":id", userId);

    if (!query.exec()) {
        qDebug() << "更新失败:" << query.lastError();
        return false;
    }
    return true;
}

8. 删除数据

使用 QSqlQuery 执行 DELETE 语句删除数据。

bool deleteData(int userId) {
    QSqlQuery query;
    query.prepare("DELETE FROM Users WHERE ID = :id");
    query.bindValue(":id", userId);

    if (!query.exec()) {
        qDebug() << "删除失败:" << query.lastError();
        return false;
    }
    return true;
}

9. 事务处理

使用事务确保数据一致性。

bool performTransaction() {
    QSqlDatabase db = QSqlDatabase::database();
    db.transaction();

    QSqlQuery query1;
    query1.prepare("INSERT INTO Users (Name, Age, Email) VALUES (:name1, :age1, :email1)");
    query1.bindValue(":name1", "Alice");
    query1.bindValue(":age1", 25);
    query1.bindValue(":email1", "alice@example.com");
    if (!query1.exec()) {
        db.rollback();
        qDebug() << "事务回滚:" << query1.lastError();
        return false;
    }

    QSqlQuery query2;
    query2.prepare("UPDATE Users SET Age = :newAge WHERE Name = :name");
    query2.bindValue(":newAge", 30);
    query2.bindValue(":name", "Alice");
    if (!query2.exec()) {
        db.rollback();
        qDebug() << "事务回滚:" << query2.lastError();
        return false;
    }

    db.commit();
    return true;
}

10. 关闭数据库

在应用程序结束时关闭数据库连接。

void closeDatabase() {
    QSqlDatabase db = QSqlDatabase::database();
    if (db.isOpen()) {
        db.close();
    }
}

总结

以上代码展示了在Qt中使用SQLite数据库的基本操作,包括连接数据库、创建表、插入数据、查询数据、更新数据、删除数据、事务处理以及关闭数据库。这些方法适用于大多数数据库操作场景,可以根据具体需求进行调整和扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值