当前位置: 首页 > ds >正文

Qt操作SQLite数据库教程

Qt 中操作 SQLite 数据库的步骤如下:

1. 添加 SQLite 驱动并打开数据库

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>// 创建数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydatabase.db"); // 可以是绝对路径或相对路径if (!db.open()) {qDebug() << "Error opening database:" << db.lastError().text();return;
}

2. 执行 SQL 语句

创建表
QSqlQuery query;
if (!query.exec("CREATE TABLE IF NOT EXISTS users (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""age INTEGER)")) {qDebug() << "Create table error:" << query.lastError().text();
}
插入数据(两种方式)
// 方式1:直接执行 SQL
query.exec("INSERT INTO users (name, age) VALUES ('Alice', 25)");// 方式2:参数化查询(推荐)
query.prepare("INSERT INTO users (name, age) VALUES (:name, :age)");
query.bindValue(":name", "Bob");
query.bindValue(":age", 30);
query.exec();
批量插入(使用事务)
db.transaction();
QSqlQuery batchQuery;
batchQuery.prepare("INSERT INTO users (name) VALUES (?)");for (const QString &name : {"Tom", "Jerry", "Mike"}) {batchQuery.addBindValue(name);batchQuery.exec();
}
db.commit();

3. 查询数据

QSqlQuery selectQuery("SELECT id, name, age FROM users");
while (selectQuery.next()) {int id = selectQuery.value(0).toInt();QString name = selectQuery.value("name").toString();int age = selectQuery.value(2).toInt();qDebug() << id << name << age;
}

4. 使用模型视图(示例)

#include <QSqlTableModel>
#include <QTableView>// 创建模型
QSqlTableModel *model = new QSqlTableModel;
model->setTable("users");
model->select();// 显示数据
QTableView *view = new QTableView;
view->setModel(model);
view->show();

5. 关闭数据库

db.close();

注意事项:

  1. SQLite 驱动默认包含在 Qt 中,不需要额外配置
  2. 数据库文件会被创建在程序的工作目录(除非指定绝对路径)
  3. 使用参数化查询可防止 SQL 注入
  4. 重要操作建议使用事务(BEGIN TRANSACTION/COMMIT)
  5. 错误检查推荐使用 lastError() 方法

常见错误处理:

if (query.lastError().isValid()) {qDebug() << "SQL Error:" << query.lastError().text();qDebug() << "Executed SQL:" << query.lastQuery();
}

完整示例代码可参考 Qt 官方文档:https://doc.qt.io/qt-5/sql-example.html

建议结合 Qt 的信号槽机制和 Model/View 架构实现数据库应用的高效开发。

http://www.xdnf.cn/news/6163.html

相关文章:

  • Spark 集群配置、启动与监控指南
  • AI模型开发全流程笔记
  • hacker送书第23期
  • Java实现美术机构教务管理系统:基于爱耕云功能模式的解决方案
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的CNC机床控制器技术方案‌
  • 深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察
  • 如何通过外卖系统源码打造本地O2O外卖配送生态?全链路技术解析
  • 磁盘存储链式的 B 树与 B+ 树
  • 解决LEENSA/LEENSA无法使用的方法
  • linux创建自己的服务
  • 后量子密码通信协议测试指南
  • 计算机组成与体系结构:组相联映射(Set-Associative Mapping)
  • NHANES指标推荐:AGR
  • 每日算法-250513
  • 使用PocketFlow构建Web Search Agent
  • java为什么要实现自动装箱和拆箱
  • Promise.all静态方法
  • 乙酰基六肽-39/Silusyne 新型减肥活性肽,减少脂肪堆积
  • 火山引擎发展初始
  • 高效跨平台文件传输与管理的工具
  • SimScape物理建模实例2--带控制的单质量弹簧阻尼系统
  • PPT制作-平滑切换
  • logback 日志归档,解决主日志和归档日志分别定义不同的周期
  • Manus 开放注册:AI 智能体领域的新起点
  • 岩土拉压试验机
  • ​​华为云服务器:智能算力网格​
  • 计数循环java
  • 24年面试问题总结记录
  • 光学(1)
  • CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开