上一篇
在Qt中建立数据库需使用QtSql模块:创建QSqlDatabase对象,指定数据库类型(如QSQLITE);调用open()连接数据库;通过QSqlQuery执行SQL语句创建表结构,需在pro文件中添加
QT += sql。
准备工作
添加依赖
在项目文件(.pro)中添加数据库模块:
QT += sql
包含头文件
#include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <QDebug>
连接数据库
SQLite(内置,无需安装)
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // 指定驱动类型
db.setDatabaseName("my_database.db"); // 数据库文件名(内存数据库用 ":memory:")
if (!db.open()) {
qDebug() << "Error: Failed to connect database." << db.lastError();
return;
}
MySQL(需安装驱动和服务器)
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost"); // 主机地址
db.setPort(3306); // 端口
db.setDatabaseName("test_db"); // 数据库名
db.setUserName("root"); // 用户名
db.setPassword("123456"); // 密码
if (!db.open()) {
qDebug() << "MySQL Error:" << db.lastError().text();
}
注意:MySQL需先安装驱动(Windows默认提供,Linux需安装
libqt5sql5-mysql)。
创建数据表
使用QSqlQuery执行SQL语句:
QSqlQuery query;
bool success = query.exec(
"CREATE TABLE IF NOT EXISTS users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(50) NOT NULL, "
"email VARCHAR(50) UNIQUE)"
);
if (!success) {
qDebug() << "Create table error:" << query.lastError();
}
插入数据
直接执行SQL
query.exec("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')");
参数化绑定(防SQL注入)
query.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
query.addBindValue("Bob");
query.addBindValue("bob@test.com");
query.exec();
查询数据
if (query.exec("SELECT id, name, email FROM users")) {
while (query.next()) {
int id = query.value("id").toInt();
QString name = query.value("name").toString();
QString email = query.value("email").toString();
qDebug() << "User:" << id << name << email;
}
} else {
qDebug() << "Query error:" << query.lastError();
}
错误处理
每次数据库操作后检查错误:
if (query.lastError().isValid()) {
qDebug() << "SQL Error:" << query.lastError().text();
}
使用模型类(高级操作)
Qt提供QSqlTableModel简化CRUD:
#include <QSqlTableModel>
QSqlTableModel *model = new QSqlTableModel;
model->setTable("users");
model->select(); // 加载数据
// 获取第一行数据
QString name = model->record(0).value("name").toString();
关闭连接
db.close(); // 显式关闭(析构时也会自动关闭)
常见问题
-
驱动未加载
检查是否遗漏QT += sql,或调用QSqlDatabase::drivers()查看可用驱动列表。 -
连接失败
- MySQL:确保服务已启动,用户权限正确。
- SQLite:检查文件路径是否可写。
-
中文乱码
在连接前设置编码:db.setConnectOptions("MYSQL_OPT_SET_CHARSET_NAME=utf8mb4");
最佳实践
- 使用事务:批量操作时提升性能
db.transaction(); // 批量插入... db.commit();
- 参数化查询:避免SQL注入风险
- 资源释放:及时关闭数据库连接
通过以上步骤,您已掌握在Qt中操作数据库的核心方法,根据需求扩展其他SQL语句(如更新、删除)即可。
引用说明参考Qt官方文档(Database Module)及最佳实践总结,代码示例在Qt 6.5环境下验证通过。
