Qt Sql 模块是 Qt 框架中用于数据库访问的库。它的主要目标是提供一个独立于具体数据库系统的统一 API。
Qt Sql 模块的功能主要围绕三个核心任务:连接数据库、执行查询 ,以及将查询结果集成到 Qt 的模型/视图框架中。
🌟 Qt Sql 模块核心功能及其函数详解
1. 📂 数据库连接和管理 (QSqlDatabase)
QSqlDatabase 类用于创建、管理和释放与数据库的连接。它是访问任何数据库的第一步。
| 核心函数 (Function) | 作用描述 | 示例用法 |
|---|---|---|
addDatabase() |
添加数据库连接。 静态函数。指定数据库驱动(如 "QSQLITE", "QMYSQL")和连接名称。 | QSqlDatabase::addDatabase("QSQLITE", "my_conn"); |
setDatabaseName() |
设置数据库文件/名称。 对于 SQLite,这是数据库文件的路径;对于服务器,这是数据库名称。 | db.setDatabaseName("data.db"); |
setHostName() / setPort() |
设置连接参数。 用于连接到远程数据库服务器(如 MySQL, PostgreSQL)。 | db.setHostName("localhost"); |
setUserName() / setPassword() |
设置身份验证信息。 用于登录数据库。 | db.setUserName("user"); |
open() |
建立连接。 尝试使用配置好的参数建立到数据库的实际连接。 | if (!db.open()) { ... } |
close() |
断开连接。 关闭数据库连接并释放资源。 | db.close(); |
database() |
获取连接对象。 静态函数,通过连接名称获取已添加的连接实例。 | QSqlDatabase db = QSqlDatabase::database("my_conn"); |
isValid() |
检查连接有效性。 检查对象是否代表一个有效的、已配置的数据库连接。 | if (db.isValid()) { ... } |
tables() |
获取表列表。 返回当前数据库中所有表的名称列表 (QStringList)。 |
QStringList list = db.tables(); |
transaction() / commit() / rollback() |
事务管理。 用于启动、提交或回滚一组 SQL 操作,确保数据完整性。 | db.transaction(); if (error) db.rollback(); else db.commit(); |
2. 📝 SQL 查询执行 (QSqlQuery)
QSqlQuery 类用于执行 SQL 语句、遍历查询结果、以及进行数据绑定。
| 核心函数 (Function) | 作用描述 | 示例用法 |
|---|---|---|
QSqlQuery() |
构造函数。 创建一个用于执行查询的对象,通常与一个 QSqlDatabase 连接关联。 |
QSqlQuery query(db); |
exec() |
执行查询。 执行 SQL 语句。对于 SELECT 语句,返回 true 表示查询成功。 |
query.exec("SELECT * FROM users"); |
next() |
前进到下一条记录。 用于遍历查询结果集。必须在 exec() 之后调用。 |
while (query.next()) { ... } |
value() |
获取当前字段的值。 通过字段的索引或名称获取当前记录中某个字段的数据。 | QVariant name = query.value("name"); |
prepare() |
准备查询语句。 用于预编译带占位符的 SQL 语句,防止 SQL 注入。 | query.prepare("INSERT INTO users (name) VALUES (?)"); |
bindValue() |
绑定占位符的值。 将实际数据绑定到 prepare() 语句中的占位符。 |
query.bindValue(0, "Alice"); |
lastError() |
获取错误信息。 返回查询执行失败时的详细错误信息对象。 | qDebug() << query.lastError().text(); |
3. 📊 模型/视图集成 (QSqlTableModel, QSqlQueryModel)
这些类将 SQL 查询结果作为 模型 暴露给 Qt 的 视图 控件(如 QTableView),实现数据显示和编辑的自动化。
A. QSqlQueryModel (只读模型)
| 核心函数 (Function) | 作用描述 | 示例用法 |
|---|---|---|
setQuery() |
设置查询语句。 使用一个 SELECT 语句作为数据源。该模型是只读的。 |
model.setQuery("SELECT id, name FROM employees"); |
setHeaderData() |
设置列标题。 更改视图中显示的列标题文本。 | model.setHeaderData(0, Qt::Horizontal, "Employee ID"); |
B. QSqlTableModel (可读写模型)
| 核心函数 (Function) | 作用描述 | 示例用法 |
|---|---|---|
setTable() |
设置数据源表。 将模型绑定到数据库中的一个特定表。 | model.setTable("employees"); |
select() |
填充模型数据。 执行 SELECT 操作,从绑定表中加载数据。 |
model.select(); |
setFilter() |
设置过滤条件。 应用 SQL WHERE 子句来过滤显示的数据。 |
model.setFilter("salary > 50000"); |
setEditStrategy() |
设置编辑策略。 决定何时将更改写入数据库(如 QSqlTableModel::OnManualSubmit)。 |
model.setEditStrategy(QSqlTableModel::OnFieldChange); |
submitAll() / revertAll() |
提交/撤销更改。 将模型中缓存的修改批量提交到数据库,或撤销所有未提交的修改。 | model.submitAll(); |
总结:
Qt Sql 模块通过这三个核心类实现了完整的数据库操作流程:
QSqlDatabase: 配置和连接数据库。QSqlQuery: 执行自定义的 SQL 语句和遍历结果。QSqlTableModel/QSqlQueryModel: 将数据库数据集成到 GUI 界面中,实现高效的数据展示。