在Qt中使用数据库通常涉及以下步骤和方法。以下是一个汇总,结合了之前讨论的内容,展示如何在Qt中使用数据库(以SQLite为例):
1. 添加数据库驱动
Qt支持多种数据库驱动,如QSQLITE、QMYSQL、QPSQL等。确保在项目文件(.pro)中包含相应的模块:
QT += core sql
2. 创建或打开数据库连接
使用 QSqlDatabase 类来创建或打开数据库连接。
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
bool openDatabase() {
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("example.db"); // 设置数据库文件名
if (!db.open()) {
qDebug() << "数据库打开失败:" << db.lastError().text();
return false;
}
return true;
}
3. 创建表
使用 QSqlQuery 执行 SQL 语句来创建表
4. 插入数据
使用 QSqlQuery 执行 INSERT 语句插入数据。
单条插入
bool insertData() {
QSqlQuery query;
query.prepare("INSERT INTO Users (Name, Age, Email) VALUES (:name, :age, :email)");
query.bindValue(":name", "John Doe");
query.bindValue(":age", 30);
query.bindValue(":email", "john.doe@example.com");
if (!query.exec()) {
qDebug() << "插入失败:" << query.lastError();
return false;
}
return true;
}
批量插入
bool insertMultipleRecords(const QList<QMap<QString, QVariant>>& records) {
QSqlDatabase db = QSqlDatabase::database();
db.transaction();
QSqlQuery query;
query.prepare("INSERT INTO Users (Name, Age, Email) VALUES (:name, :age, :email)");
for (const auto& record : records) {
query.bindValue(":name", record["Name"]);
query.bindValue(":age", record["Age"]);
query.bindValue(":email", record["Email"]);
if (!query.exec()) {
db.rollback();
qDebug() << "插入失败:" << query.lastError();
return false;
}
}
db.commit();
return true;
}
5. 查询数据
使用 QSqlQuery 执行 SELECT 语句查询数据。
bool queryData() {
QSqlQuery query;
query.exec("SELECT ID, Name, Age, Email FROM Users");
while (query.next()) {
int id = query.value("ID").toInt();
QString name = query.value("Name").toString();
int age = query.value("Age").toInt();
QString email = query.value("Email").toString();
qDebug() << "ID:" << id << "Name:" << name << "Age:" << age << "Email:" << email;
}
return true;
}
6. 获取末尾行ID
使用 MAX(ID) 函数获取表中最大的ID值。
int getLastRowId(const QString& tableName) {
QSqlQuery query;
query.exec(QString("SELECT MAX(ID) FROM %1").arg(tableName));
if (query.next()) {
return query.value(0).toInt();
}
return -1; // 如果没有记录,返回-1
}
7. 更新数据
使用 QSqlQuery 执行 UPDATE 语句更新数据。
bool updateData(int userId, const QString& newName) {
QSqlQuery query;
query.prepare("UPDATE Users SET Name = :name WHERE ID = :id");
query.bindValue(":name", newName);
query.bindValue(":id", userId);
if (!query.exec()) {
qDebug() << "更新失败:" << query.lastError();
return false;
}
return true;
}
8. 删除数据
使用 QSqlQuery 执行 DELETE 语句删除数据。
bool deleteData(int userId) {
QSqlQuery query;
query.prepare("DELETE FROM Users WHERE ID = :id");
query.bindValue(":id", userId);
if (!query.exec()) {
qDebug() << "删除失败:" << query.lastError();
return false;
}
return true;
}
9. 事务处理
使用事务确保数据一致性。
bool performTransaction() {
QSqlDatabase db = QSqlDatabase::database();
db.transaction();
QSqlQuery query1;
query1.prepare("INSERT INTO Users (Name, Age, Email) VALUES (:name1, :age1, :email1)");
query1.bindValue(":name1", "Alice");
query1.bindValue(":age1", 25);
query1.bindValue(":email1", "alice@example.com");
if (!query1.exec()) {
db.rollback();
qDebug() << "事务回滚:" << query1.lastError();
return false;
}
QSqlQuery query2;
query2.prepare("UPDATE Users SET Age = :newAge WHERE Name = :name");
query2.bindValue(":newAge", 30);
query2.bindValue(":name", "Alice");
if (!query2.exec()) {
db.rollback();
qDebug() << "事务回滚:" << query2.lastError();
return false;
}
db.commit();
return true;
}
10. 关闭数据库
在应用程序结束时关闭数据库连接。
void closeDatabase() {
QSqlDatabase db = QSqlDatabase::database();
if (db.isOpen()) {
db.close();
}
}
总结
以上代码展示了在Qt中使用SQLite数据库的基本操作,包括连接数据库、创建表、插入数据、查询数据、更新数据、删除数据、事务处理以及关闭数据库。这些方法适用于大多数数据库操作场景,可以根据具体需求进行调整和扩展。

269

被折叠的 条评论
为什么被折叠?



