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

在 Qt 中,使用 SQLite 数据库的基本方法与 MySQL 类似,但 SQLite 是一个轻量级的嵌入式数据库,通常不需要外部数据库服务器。你可以直接在本地磁盘上操作 SQLite 数据库文件。

1. 安装 SQLite 驱动

通常,Qt 默认包含了对 SQLite 的支持,所以不需要额外安装 SQLite 驱动。您可以通过 QSqlDatabase 类来直接操作 SQLite 数据库。

2. 连接到 SQLite 数据库

连接到 SQLite 数据库通常只需要指定数据库文件路径。SQLite 是一个文件级数据库,所以你需要提供文件路径来连接该数据库。如果该文件不存在,SQLite 会自动创建一个新的数据库文件。

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

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

    // 设置数据库文件路径
    db.setDatabaseName("test.db");  // 数据库文件名,可以是相对路径或者绝对路径

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

3. 执行 SQL 查询

与 MySQL 操作相似,SQLite 的操作也可以通过 QSqlQuery 类来进行。以下是常见的 SQL 操作:SELECT、INSERT、UPDATE 和 DELETE。

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. 创建表格

如果您需要创建一个表格,可以使用 CREATE TABLE SQL 语句:

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

    // 执行 CREATE TABLE 语句
    QString createQuery = "CREATE TABLE IF NOT EXISTS employees ("
                          "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                          "name TEXT, "
                          "age INTEGER)";
    if (query.exec(createQuery)) {
        qDebug() << "Table created successfully!";
    } else {
        qDebug() << "Table creation failed:" << query.lastError();
    }
}

5. 事务处理

事务可以确保多条 SQL 操作要么全部成功,要么全部失败。SQLite 支持事务操作:

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. 处理查询结果

在查询数据时,您可以通过 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;
}

7. 关闭数据库连接

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

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

8. 完整示例代码

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

bool connectToDatabase() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("test.db");

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

void createTable() {
    QSqlQuery query;
    QString createQuery = "CREATE TABLE IF NOT EXISTS employees ("
                          "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                          "name TEXT, "
                          "age INTEGER)";
    if (query.exec(createQuery)) {
        qDebug() << "Table created successfully!";
    } else {
        qDebug() << "Table creation failed:" << query.lastError();
    }
}

void insertData() {
    QSqlQuery query;
    query.prepare("INSERT INTO employees (name, age) VALUES (:name, :age)");
    query.bindValue(":name", "Alice");
    query.bindValue(":age", 28);

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

void queryData() {
    QSqlQuery query;

    if (query.exec("SELECT * FROM employees")) {
        while (query.next()) {
            QString name = query.value(1).toString();
            int age = query.value(2).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()) {
        createTable();
        insertData();
        queryData();
    }

    return a.exec();
}

总结

  • QSqlDatabase 用于连接数据库,addDatabase() 设置数据库驱动。
  • QSqlQuery 用于执行 SQL 查询和命令,可以绑定参数和获取查询结果。
  • SQLite 是一个文件级数据库,可以直接操作本地文件,无需额外的数据库服务器。
  • 使用 事务 可以确保多个 SQL 操作的原子性。
相关推荐
Polar__Star1 小时前
如何结合计划任务实现自动定时备份任务配置_全自动化运维管理
jvm·数据库·python
weixin_580614006 小时前
如何提取SQL日期中的年份_使用YEAR或EXTRACT函数
jvm·数据库·python
2301_813599556 小时前
SQL生产环境规范_数据库使用最佳实践
jvm·数据库·python
a9511416426 小时前
Go 中通过 channel 传递切片时的数据竞争与深拷贝解决方案
jvm·数据库·python
qq_189807036 小时前
如何修改RAC数据库名_NID工具在集群环境下的改名步骤
jvm·数据库·python
aXin_ya7 小时前
Redis 高级篇(最佳实践)
数据库·redis·缓存
zhangchaoxies7 小时前
如何检测SQL注入风险_利用模糊测试技术发现漏洞
jvm·数据库·python
zhangchaoxies7 小时前
CSS如何实现响应式弹性网格布局_配合media query修改flex-wrap属性
jvm·数据库·python
霖霖总总7 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
Polar__Star8 小时前
C#怎么操作Chart图表控件 C#如何用WinForms Chart控件绑定数据绘制统计图表【控件】
jvm·数据库·python