在 Qt 中读取数据库文件通常涉及以下步骤。这里以 SQLite 为例(Qt 内置支持),其他数据库(如 MySQL、PostgreSQL)需要对应驱动:
1. 添加 SQL 模块依赖
在项目文件 .pro
中添加:
QT += sql
2. 基本代码框架
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
// 创建数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("your_database.db"); // SQLite 数据库文件路径
if (!db.open()) {
qDebug() << "Error opening database:" << db.lastError().text();
return;
}
// 执行查询
QSqlQuery query;
if (!query.exec("SELECT * FROM your_table")) {
qDebug() << "Query error:" << query.lastError().text();
return;
}
// 遍历结果
while (query.next()) {
int id = query.value("id").toInt();
QString name = query.value("name").toString();
qDebug() << "ID:" << id << "Name:" << name;
}
// 关闭数据库(通常在程序退出时)
db.close();
关键点说明:
数据库驱动:
- SQLite:使用
QSQLITE
- MySQL:使用
QMYSQL
(需要 MySQL 客户端库) - PostgreSQL:使用
QPSQL
(需要 libpq)
- SQLite:使用
路径处理:
- 使用绝对路径更可靠:
db.setDatabaseName("/path/to/database.db")
- 资源文件:
":/database.db"
(如果数据库文件在 qrc 中)
- 使用绝对路径更可靠:
错误处理:
- 始终检查
db.open()
和query.exec()
的返回值 - 使用
lastError()
获取错误详情
- 始终检查
高级用法示例
// 参数化查询(防止 SQL 注入)
query.prepare("INSERT INTO users (name, age) VALUES (?, ?)");
query.addBindValue("John");
query.addBindValue(30);
query.exec();
// 事务操作
db.transaction();
// 执行多个操作...
if (success) {
db.commit();
} else {
db.rollback();
}
常见问题排查
驱动不可用:
- 检查可用驱动:
qDebug() << QSqlDatabase::drivers();
- 确保编译 Qt 时启用了相应数据库支持
- 检查可用驱动:
数据库文件权限:
- 确保应用程序有文件读写权限
连接泄漏:
- 使用
QSqlDatabase::removeDatabase()
关闭不再需要的连接
- 使用
如果要处理其他数据库类型,需要:
- 安装数据库客户端库
- 确保 Qt 编译时包含对应驱动
- 修改连接参数(主机、端口、用户名、密码等)
例如 MySQL 连接:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mydb");
db.setUserName("root");
db.setPassword("secret");