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环境下验证通过。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/46452.html