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的所有对应的数据,struct RcTxData { int patientId; int txDataId;

QString txPlanInfo;
QString txRegInfo;
QString txNavInfo;
QString txTreatInfo;}把每个患者的治疗数据存放在QVector<RcTxData> vRcTxData中
回答:

下面是一个使用C++、Qt和SQLite实现的管理TxData的类的示例。这个类提供了对TxData表中与patientId相关的增加、删除、修改和查找功能。

首先,确保你已经在Qt项目中包含了SQLite的支持。你可以在.pro文件中添加以下内容:

QT += sql

接下来,创建一个名为TxDataManager的类,代码如下:

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

struct RcTxData {
    int patientId;
    int txDataId;
    QString txPlanInfo;
    QString txRegInfo;
    QString txNavInfo;
    QString txTreatInfo;
};

class TxDataManager {
public:
    TxDataManager(const QString& dbName) {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName(dbName);
        if (!db.open()) {
            qDebug() << "Database error: " << db.lastError().text();
        }
    }

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

    bool addTxData(const RcTxData& 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);

        if (!query.exec()) {
            qDebug() << "Add TxData error: " << query.lastError().text();
            return false;
        }
        return true;
    }

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

        if (!query.exec()) {
            qDebug() << "Delete TxData error: " << query.lastError().text();
            return false;
        }
        return true;
    }

    bool updateTxData(const RcTxData& txData) {
        QSqlQuery query;
        query.prepare("UPDATE TxData SET patientId = :patientId, txPlanInfo = :txPlanInfo, "
                      "txRegInfo = :txRegInfo, txNavInfo = :txNavInfo, txTreatInfo = :txTreatInfo "
                      "WHERE treatmentId = :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);
        query.bindValue(":treatmentId", txData.txDataId);

        if (!query.exec()) {
            qDebug() << "Update TxData error: " << query.lastError().text();
            return false;
        }
        return true;
    }

    QVector<RcTxData> findTxDataByPatientId(int patientId) {
        QVector<RcTxData> vRcTxData;
        QSqlQuery query;
        query.prepare("SELECT treatmentId, patientId, txPlanInfo, txRegInfo, txNavInfo, txTreatInfo "
                      "FROM TxData WHERE patientId = :patientId");
        query.bindValue(":patientId", patientId);

        if (query.exec()) {
            while (query.next()) {
                RcTxData txData;
                txData.txDataId = query.value(0).toInt();
                txData.patientId = query.value(1).toInt();
                txData.txPlanInfo = query.value(2).toString();
                txData.txRegInfo = query.value(3).toString();
                txData.txNavInfo = query.value(4).toString();
                txData.txTreatInfo = query.value(5).toString();
                vRcTxData.append(txData);
            }
        } else {
            qDebug() << "Find TxData error: " << query.lastError().text();
        }
        return vRcTxData;
    }

private:
    QSqlDatabase db;
};

使用示例

你可以在你的主程序中使用TxDataManager类来管理TxData。例如:

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    TxDataManager manager("your_database_name.db");

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

    // 查找患者ID为1的所有治疗数据
    QVector<RcTxData> results = manager.findTxDataByPatientId(1);
    for (const RcTxData& data : results) {
        qDebug() << "Treatment ID:" << data.txDataId << "Patient ID:" << data.patientId;
        qDebug() << "Plan Info:" << data.txPlanInfo;
    }

    // 更新治疗数据
    newTxData.txDataId = 1; // 假设我们要更新treatmentId为1的记录
    newTxData.txPlanInfo = "Updated Plan A";
    manager.updateTxData(newTxData);

    // 删除治疗数据
    manager.deleteTxData(1); // 删除treatmentId为1的记录

    return app.exec();
}

注意事项

  1. 确保数据库和表结构已经创建。
  2. 处理数据库连接和错误时要小心,确保在适当的地方关闭数据库连接。
  3. 你可以根据需要扩展和修改这个类以满足特定需求。