头文件包含
#include "sq.h"
#include <QSqlError>
#include <QDebug>
#include <QMutex>
判断数据库是否打开
bool SQ::isDatabaseOpen(const QSqlDatabase& db) const {
if (!db.isOpen()) {
qDebug() << "数据库未打开";
return false;
}
return true;
}
打开数据库
QSqlDatabase SQ::OpenDatabase(const QString& dbPath, const QString& connectionName) {
// 这一段代码的功能是判断数据库连接是否还存在,如果仍然存在线关闭之前的连接,避免造成资源浪费
if (QSqlDatabase::contains(connectionName)) {
QSqlDatabase oldDb = QSqlDatabase::database(connectionName);
if (oldDb.isOpen()) {
oldDb.close();
QSqlDatabase::removeDatabase(connectionName);
qDebug() << "旧数据库连接已关闭并移除";
}
}
// 在关闭连接之后就可以打开数据库了
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setDatabaseName(dbPath);
if (db.open()) {
qDebug("数据库连接成功");
} else {
qDebug()<< "数据库连接失败:" << db.lastError().text();
}
return db;
}
给数据库添加表(初始化数据库)
这里创建了,芯片表,版本表,结构体表,参数表和宏表,其中的连接关系是
graph LR
a[芯片表]-->b[版本表]
b[版本表]-->c[结构体表]
c[结构体表]-->d[参数表]
c[结构体表]-->e[宏表]
使用外键进行连接
void SQ::InitSQ(const QString& connectionName) {
// 获取数据库连接
QSqlDatabase db = QSqlDatabase::database(connectionName);
// 检查数据库是否已打开
if (!db.isOpen()) {
qDebug() << "数据库未打开";
return;
}
QSqlQuery query(db);
// 创建表
query.exec("CREATE TABLE IF NOT EXISTS chip (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
query.exec("CREATE TABLE IF NOT EXISTS version (id INTEGER PRIMARY KEY AUTOINCREMENT, chip_id INTEGER, name TEXT NOT NULL, FOREIGN KEY (chip_id) REFERENCES chip(id))");
query.exec("CREATE TABLE IF NOT EXISTS structure (id INTEGER PRIMARY KEY AUTOINCREMENT, version_id INTEGER, name TEXT NOT NULL, base_address INTEGER, FOREIGN KEY (version_id) REFERENCES version(id))");
query.exec("CREATE TABLE IF NOT EXISTS parameter (id INTEGER PRIMARY KEY AUTOINCREMENT, structure_id INTEGER, name TEXT NOT NULL, offset INTEGER, data_type TEXT, absolute_address INTEGER, FOREIGN KEY (structure_id) REFERENCES structure(id))");
query.exec("CREATE TABLE IF NOT EXISTS macro (name TEXT PRIMARY KEY, value INTEGER NOT NULL, structure_id INTEGER, FOREIGN KEY (structure_id) REFERENCES structure(id))");
qDebug() << "数据库表已初始化";
}
给芯片表添加芯片
给某表添加记录的一般方法都是:
graph TD
a["QSqlQuery query(db);" 创建查询变量]-->b[query.prepare语句]-->c[query.addBindValue 添加绑定值]-->d[query.exec 判断执行是否成功]
bool SQ::AddChip(const QString& connectionName, const QString& chipName) {
QSqlDatabase db = QSqlDatabase::database(connectionName);
if (!isDatabaseOpen(db)) return false;
QSqlQuery query(db);
// 在name字段下面添加芯片
query.prepare("INSERT INTO chip (name) VALUES (?)");
query.addBindValue(chipName);
// 执行一次
if (!query.exec()) {
qDebug() << "添加失败:" << query.lastError().text();
return false;
}
qDebug("添加成功");
return true;
}
在芯片表删除芯片(递归删除对应芯片下的版本)
bool SQ::RemoveChip(const QString& connectionName, const QString& chipName) {
QSqlDatabase db = QSqlDatabase::database(connectionName);
if (!isDatabaseOpen(db)) return false;
QSqlQuery query(db);
query.prepare("SELECT id FROM chip WHERE name = ?");
query.addBindValue(chipName);
if (!query.exec() || !query.next()) {
qDebug() << "芯片查询失败或未找到:" << query.lastError().text();
return false;
}
int chipId = query.value(0).toInt();
if (!db.transaction()) {
qDebug() << "无法启动事务:" << db.lastError().text();
return false;
}
// 删除版本记录和芯片记录
if (!executeDeleteQuery(db, "DELETE FROM version WHERE chip_id = ?", chipId) ||
!executeDeleteQuery(db, "DELETE FROM chip WHERE id = ?", chipId)) {
db.rollback();
return false;
}
if (!db.commit()) {
qDebug() << "无法提交事务:" << db.lastError().text();
return false;
}
qDebug() << "芯片及其所有版本已成功删除";
return true;
}
bool SQ::executeDeleteQuery(QSqlDatabase& db, const QString& queryStr, int id) {
QSqlQuery query(db);
query.prepare(queryStr);
query.addBindValue(id);
if (!query.exec()) {
qDebug() << "删除失败:" << query.lastError().text();
return false;
}
return true;
}
关闭数据库
bool SQ::CloseDatabase(QSqlDatabase db) {
QString connectionName = db.connectionName();
db.close();
QMetaObject::invokeMethod(Q_NULLPTR, [connectionName]() {
QSqlDatabase::removeDatabase(connectionName);
}, Qt::QueuedConnection);
return true;
}
获取芯片id
`int SQ::getChipId(QSqlDatabase& db, const QString& chipName) {
QSqlQuery query(db);
query.prepare("SELECT id FROM chip WHERE name = ?");
query.addBindValue(chipName);
if (!query.exec() || !query.next()) {
qDebug() << "查询芯片失败或未找到:" << query.lastError().text();
return -1;
}
return query.value(0).toInt();
}
loadChips(将芯片信息加载到combobox)
void SQ::loadChips(const QString& connectionName, QComboBox* comboBox) {
QSqlDatabase db = QSqlDatabase::database(connectionName);
if (!isDatabaseOpen(db)) return;
comboBox->clear();
QSqlQuery query(db);
query.prepare("SELECT id, name FROM chip");
if (query.exec()) {
while (query.next()) {
comboBox->addItem(query.value("name").toString(), query.value("id").toInt());
}
qDebug() << "芯片信息已加载到 ComboBox";
} else {
qDebug() << "查询芯片失败:" << query.lastError().text();
}
}
loadVersions(同理)
void SQ::loadVersions(const QString& connectionName, const QString& chipName, QComboBox* comboBox) {
QSqlDatabase db = QSqlDatabase::database(connectionName);
if (!isDatabaseOpen(db)) return;
int chipId = getChipId(db, chipName);
if (chipId == -1) {
qDebug() << "芯片未找到,无法加载版本";
return;
}
comboBox->clear();
QSqlQuery query(db);
query.prepare("SELECT id, name FROM version WHERE chip_id = ?");
query.addBindValue(chipId);
if (query.exec()) {
while (query.next()) {
comboBox->addItem(query.value("name").toString(), query.value("id").toInt());
}
qDebug() << "版本信息已加载到 ComboBox";
} else {
qDebug() << "查询版本失败:" << query.lastError().text();
}
}
添加版本
bool SQ::AddVersion(const QString& connectionName, const QString& chipName, const QString& versionName) {
QSqlDatabase db = QSqlDatabase::database(connectionName);
if (!isDatabaseOpen(db)) return false;
int chipId = getChipId(db, chipName);
if (chipId == -1) {
qDebug() << "芯片未找到,无法添加版本";
return false;
}
QSqlQuery query(db);
query.prepare("INSERT INTO version (chip_id, name) VALUES (?, ?)");
query.addBindValue(chipId);
query.addBindValue(versionName);
if (!query.exec()) {
qDebug() << "版本添加失败:" << query.lastError().text();
return false;
}
qDebug() << "版本添加成功";
return true;
}