Qt + MySQL 增删改查

Qt + MySQL 简单构建项目后端总结

最近跟着同学第一次完成了一个小项目,项目大概意思就是设计一个PC端的应用,通过分析人的照片得到关节的一些数据,医生可以通过这些数据进行康复诊断。我主要负责的是其中的数据库搭建部分,前端用的Qt,后端的数据库增删改查操作都用Qt内部的接口实现

Qt 连接MySQL

  1. 在.pro文件中加上sql模块
QT  += core gui sql
  1. Qt提供了许多底层的驱动,对于很多个数据库都有着很好的支持,对于MySQL来说,Qt当中所使用的类名为QSqlDatabase ,连接代码如下
        QSqlDatabase sql;
        //声明使用的是MySQL的驱动
        sql = QSqlDatabase::addDatabase("QMYSQL");
        //连接云服务器的ip地址,我这里的是本地地址
        sql.setHostName("127.0.0.1");

        //服务器部署的数据库用户名
        sql.setUserName("");
        //密码
        sql.setPassword("");
        //端口,数据库默认3306
        sql.setPort(3306);

        //数据库名字
        sql.setDatabaseName("testmysql01");

        sql.open();
        
		//检查是否成功打开
        if(sql.open())
            qDebug()<<"yes";

这样的话,我们的连接就成功了

在进行连接的当中还容易出现这样的问题
在这里插入图片描述
驱动可用但是没有装载,网上给出的解答办法也很多。我是通过MySQL官网下载MySQL-connector-win32,将其中lib目录下的libmysql.dll移动到与项目相关的build文件夹中来解决的。下载的时候注意32位还是64位,别搞错了

Qt执行SQL查询语句

Qt提供了QSqlQuery类来完成指定的数据库查询工作,只要你熟悉SQL语言,写下来还是非常方便的,我这里直接贴代码了

  1. 向指定数据库中增加记录
//存用户的姓名、检测时间、以及角度
void api2(QString name, QString angle,double grades, QString comment,  unsigned int liaocheng)
{
    //获取当前时间
    QDateTime time = QDateTime::currentDateTime();
    QString t = time.toString("yyyy-MM-dd hh:mm:ss");
    
    //这里就是之前的连接数据库操作
    QSqlDatabase sql;
    login_connectfirst(sql);

    QSqlQuery query;
    QString str = QString("insert into records(name,date,angle,trial,grade,No) values('%1','%2','%3','%4','%5','%6')").arg(name).arg(t).arg(angle).arg(liaocheng).arg(grades).arg(no);
    no += 1;
    
    //exec执行语句
    query.exec(str);
	//避免数据库一直连接,在执行完一个操作之后我将连接中断
    sql.close();
}

下面这个是query的另外一种执行方法

//3.增加存储疗程信息的接口
//前序任务:数据库结构1.
//输入为treatment的各项信息
//其中不包括No,photo为电脑文件系统的一个图片地址
//输出为1添加成功,-1添加失败

int store_treatment(QString doc,QString patient,QString action,int act_time,QString keyword,QString weight,QString photo_path){

    QSqlDatabase sql;
    login_connectfirst(sql);


	/*
		存取图片 mysql当中采用mediumblob存储,将图片转化成一个大二进制文件存储,因此我们需要先在Qt当中
	*/
    QByteArray bytes;
    QBuffer buffer(&bytes);
    buffer.open(QIODevice::WriteOnly);



    QByteArray data;
    QFile* file=new QFile(photo_path); //file为二进制数据文件名
    file->open(QIODevice::ReadOnly);
    data = file->readAll();
    file->close();
    QVariant var(data);


    QSqlQuery query;
    QString str = QString("insert into treatment(doctor,patient_name,action_name,action_times,points_angles,weights,photo)"
                          "values('%1,'%2','%3','%4','%5','%6',?)")
            .arg(doc).arg(patient).arg(action).arg(act_time).arg(keyword).arg(weight);
//由于图片在Qt中转为二进制文件后,无法通过QString类型的arg代入参数,故采用第二种绑定参数的模式

    query.prepare(str);
    query.addBindValue(var);

    bool p = query.exec(str);
    sql.close();


    if(p)
        return 1;
    else
        return -1;

}
  1. 向指定数据库中删除记录
//大同小异
int delete_user(QString name){
    QSqlDatabase sql;
    login_connectfirst(sql);


    QString str = QString("delete from accounts where name='%1").arg(name);

    QSqlQuery query;
    bool ans = query.exec(str);
    sql.close();
    if(ans){
        return 1;
    }else
        return -1;
}
  1. 向指定数据库当中修改记录
int reset_pwd(QString name){
    QSqlDatabase sql;
    login_connectfirst(sql);


    QString str = QString("update accounts set passwd=12345reset where name='%1'").arg(name);

    QSqlQuery query;
    bool ans = query.exec(str);
    sql.close();
    if(ans){
        return 1;
    }else
        return -1;
}
  1. 向指定数据库中查询特定的记录
void doctor_return_history(QString name,QString treatment,QTableWidget *table){

    QSqlDatabase sql;
    login_connectfirst(sql);

    //从records当中获得评分和No
    QString str1 = QString("select count(*) from records where name='%1',trial='%2'")
            .arg(name).arg(treatment);
    QString str = QString("select No,grade from records where name='%1',trial='%2'")
            .arg(name).arg(treatment);

    //从treatment当中获取其他
    QString str2 = QString("select points,angles,weights from treatment where name='%1',action_name='%2'")
            .arg(name).arg(treatment);

    QSqlQuery query2;
    query2.exec(str2);


    QSqlQuery query;
    query.exec(str1);

    query.next();
    int ans = query.value(0).toInt();
	//使用QTableWidget显示查询到的内容
    table->setColumnCount(5);
    table->setRowCount(ans);
	
	//加头文件QStringList才能这样用
    table->setHorizontalHeaderLabels(QStringList()<<"No"<<"分数"<<"关键点"<<"角度"<<"权重");

    query.exec(str);

    int row = 0;

    while(query.next()){
        for(int i = 0;i < 2;i++){
            table->setItem(row,i,new QTableWidgetItem(query.value(i).toString()));
        }
        for(int i = 2;i < 5;i++){
            table->setItem(row,i,new QTableWidgetItem(query2.value(i-2).toString()));
        }

        row++;
    }
    sqlclose();
}

QSqlQuery中的query总结

query.exec(QString) – 执行相关的SQL语句
执行后的结果可以通过query.value()查看,query.value(0/1/2…)分别表示返回结果中的第一个字段、第二个字段的值…
注意query一开始处于的位置并不是查询得到的结果列的第一个位置,而是处于结果列的前一个位置,也就是空位,所以要得到查询的结果之前,必须先要执行一个query.next()
query会向后移动一个位置,这个时候query处于的位置才会使结果集的第一个结果处。

总结

Qt本身提供的功能也非常的多,比如还可以连接python脚本得到一系列的结果,这些网上都有详细的说明

你可能感兴趣的:(mysql,qt)