C++与Qt实现TxData管理类的示例代码

ChatGPT 使用 GPT 回答

问题:

有一个数据库RcPatData,里面有两个表patients、TxData。patients用来存储患者信息,TxData用来存储每个患者每次治疗的信息。patients的主键是patientId;TxData的主键是treatmentId,外键是patientId,对于每个患者的每次治疗TxData记录的内容是txPlanInfo、txRegInfo、txNavInfo、txTreatInfo。使用C++、QT、sqlite写一个管理TxData的类,可以实现TxData关于patientId的增加、删除、修改、查找功能。 比如数据库中TxData中treatmentId为1,2,3,4,5,6,7,8,9对应的patientId为1,2,1,2,3,3,4,5,1;查找patientId=1的所有对应的数据

回答:

为了实现一个管理 TxData 的类,我们可以使用 C++ 和 Qt 框架来与 SQLite 数据库进行交互。以下是一个简单的示例,展示了如何创建一个 TxDataManager 类,该类可以实现对 TxData 表中与 patientId 相关的增加、删除、修改和查找功能。

1. 数据库连接和类定义

首先,我们需要确保 Qt 的 SQL 模块已被包含,并且我们可以连接到 SQLite 数据库。

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QString>
#include <QList>
#include <QDebug>

class TxData {
public:
    int treatmentId;
    int patientId;
    QString txPlanInfo;
    QString txRegInfo;
    QString txNavInfo;
    QString txTreatInfo;
};

class TxDataManager {
public:
    TxDataManager(const QString& dbName);
    ~TxDataManager();

    bool addTxData(const TxData& txData);
    bool deleteTxData(int treatmentId);
    bool updateTxData(const TxData& txData);
    QList<TxData> findTxDataByPatientId(int patientId);

private:
    QSqlDatabase db;
};

2. 构造函数和析构函数

在构造函数中,我们将连接到 SQLite 数据库。

TxDataManager::TxDataManager(const QString& dbName) {
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbName);

    if (!db.open()) {
        qDebug() << "Database error occurred: " << db.lastError().text();
    }
}

TxDataManager::~TxDataManager() {
    db.close();
}

3. 增加、删除、修改和查找功能的实现

接下来,我们实现 addTxDatadeleteTxDataupdateTxDatafindTxDataByPatientId 方法。

bool TxDataManager::addTxData(const TxData& txData) {
    QSqlQuery query;
    query.prepare("INSERT INTO TxData (patientId, txPlanInfo, txRegInfo, txNavInfo, txTreatInfo) "
                  "VALUES (:patientId, :txPlanInfo, :txRegInfo, :txNavInfo, :txTreatInfo)");
    query.bindValue(":patientId", txData.patientId);
    query.bindValue(":txPlanInfo", txData.txPlanInfo);
    query.bindValue(":txRegInfo", txData.txRegInfo);
    query.bindValue(":txNavInfo", txData.txNavInfo);
    query.bindValue(":txTreatInfo", txData.txTreatInfo);

    return query.exec();
}

bool TxDataManager::deleteTxData(int treatmentId) {
    QSqlQuery query;
    query.prepare("DELETE FROM TxData WHERE treatmentId = :treatmentId");
    query.bindValue(":treatmentId", treatmentId);

    return query.exec();
}

bool TxDataManager::updateTxData(const TxData& txData) {
    QSqlQuery query;
    query.prepare("UPDATE TxData SET patientId = :patientId, txPlanInfo = :txPlanInfo, "
                  "txRegInfo = :txRegInfo, txNavInfo = :txNavInfo, txTreatInfo = :txTreatInfo "
                  "WHERE treatmentId = :treatmentId");
    query.bindValue(":treatmentId", txData.treatmentId);
    query.bindValue(":patientId", txData.patientId);
    query.bindValue(":txPlanInfo", txData.txPlanInfo);
    query.bindValue(":txRegInfo", txData.txRegInfo);
    query.bindValue(":txNavInfo", txData.txNavInfo);
    query.bindValue(":txTreatInfo", txData.txTreatInfo);

    return query.exec();
}

QList<TxData> TxDataManager::findTxDataByPatientId(int patientId) {
    QList<TxData> txDataList;
    QSqlQuery query;
    query.prepare("SELECT * FROM TxData WHERE patientId = :patientId");
    query.bindValue(":patientId", patientId);
    
    if (query.exec()) {
        while (query.next()) {
            TxData txData;
            txData.treatmentId = query.value("treatmentId").toInt();
            txData.patientId = query.value("patientId").toInt();
            txData.txPlanInfo = query.value("txPlanInfo").toString();
            txData.txRegInfo = query.value("txRegInfo").toString();
            txData.txNavInfo = query.value("txNavInfo").toString();
            txData.txTreatInfo = query.value("txTreatInfo").toString();
            txDataList.append(txData);
        }
    } else {
        qDebug() << "Query error: " << query.lastError().text();
    }

    return txDataList;
}

4. 使用示例

最后,我们可以在主函数中使用 TxDataManager 类来管理 TxData

int main() {
    TxDataManager manager("RcPatData.db");

    // 添加数据示例
    TxData newTxData = {0, 1, "Plan A", "Reg A", "Nav A", "Treat A"};
    manager.addTxData(newTxData);

    // 查找 patientId = 1 的所有数据
    QList<TxData> results = manager.findTxDataByPatientId(1);
    for (const TxData& data : results) {
        qDebug() << "Treatment ID:" << data.treatmentId << "Patient ID:" << data.patientId;
    }

    return 0;
}

注意事项

  1. 确保在使用之前,SQLite 数据库和表已经创建。
  2. 处理错误和异常情况,以确保程序的健壮性。
  3. 根据需要扩展类的功能,例如添加事务处理、批量操作等。

以上代码提供了一个基本的框架,可以根据具体需求进行扩展和修改。