zoukankan      html  css  js  c++  java
  • Qt5.9.6 vs2015 SQlite 数据库增删改查

     

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

    https://www.cnblogs.com/bclshuai/p/11380657.html

    Qt使用数据库

    目录

    1       开发环境... 1

    2       配置工作... 1

    2.1      数据库驱动配置... 1

    2.2      创建数据库增加数据库表格... 2

    3       Qt使用数据库... 2

    3.1      包含头文件和库文件... 3

    3.2      初始化数据库... 3

    3.3      打开数据库... 4

    3.4      插入数据... 4

    3.5      更新数据... 5

    3.6      查询数据... 6

    3.7      删除数据... 9

    1         开发环境

    Qt5.9.6 vs2015,使用QSQLITE保存数据到本地数据库文件。实现增删改查的功能。

    2         配置工作

    2.1   数据库驱动配置

    将Qt安装目录下D:QTQt5.9.65.9.6msvc2015_64plugins的数据库驱动文件夹sqldrivers复制到你的开发程序exe路径下,如下图所示。

     

    2.2   创建数据库增加数据库表格

    使用Sqlite工具DB Browser for SQLite.exe创建数据库,并新建数据库的表格。

    3         Qt使用数据库

    3.1   包含头文件和库文件

     

     

      

    3.2   初始化数据库

    db_ = QSqlDatabase::addDatabase("QSQLITE");

        QString dbpath = QCoreApplication::applicationDirPath() + "/localSqliteDb";

        db_.setDatabaseName(dbpath);

    3.3   打开数据库

    if (!db_.open())

            {

                msg = tr("open local database fail");

                break;

            }

    3.4   插入数据

    Query是数据库请求,可以执行SQL语句,可以将数据组织成一个字符串,符合SQL的语法,就可以插入数据,也可以通过bindValue函数来绑定数值与SQL模板中的别名,例如绑定task中的数值name和SQL模板中的标签:name,执行SQL语句时,就会用task中的数值name替换:name,通过exec函数来执行SQL语句。

    int LocalDb::onSaveTask(QVariantMap & task,QString& strMsg)
    {
        int errorCode = -1;
        do
        {
            QSqlQuery query;
            query.prepare("INSERT INTO alarmTask (id, name,type,target,similarity,time,createtime) "
                "VALUES ( :id,:name,:type,:target,:similarity,:time,:createtime)");
            query.bindValue(":id", QUuid::createUuid());
            query.bindValue(":name", task.value("name"));
            query.bindValue(":type", task.value("type"));
            query.bindValue(":target", task.value("target"));
            query.bindValue(":time", task.value("time"));
            query.bindValue(":similarity", task.value("similarity"));
            query.bindValue(":createtime", task.value("createtime"));
            if (!query.exec())
            {
                QSqlError error = query.lastError();
                errorCode = error.type();
                strMsg = error.text();
                LOG_ERROR("insert task failed %s", strMsg.toStdString().c_str());
                break;
            }
            errorCode = 0;
            //创建图片解析任务
        } while (0);
        return errorCode;
    }

    3.5   更新数据

    更新数据采用update语句。同样采用QSqlQuery方法

    int LocalDb::onUpdateTask(QVariantMap & task, QString & strMsg)
    
    {
    
        int errorCode = -1;
    
        do
    
        {
    
            QSqlQuery query;
    
            query.prepare("update alarmTask set name=:name,type=:type,target=:target,similarity=:similarity,time=:time,createtime=:createtime where id=:id");
    
            query.bindValue(":id", task.value("id"));
    
            query.bindValue(":name", task.value("name"));
    
            query.bindValue(":type", task.value("type"));
    
            query.bindValue(":target", task.value("target"));
    
            query.bindValue(":time", task.value("time"));
    
            query.bindValue(":similarity", task.value("similarity"));
    
            query.bindValue(":createtime", task.value("createtime"));
    
            if (!query.exec())
    
            {
    
                QSqlError error = query.lastError();
    
                strMsg = error.text();
    
                errorCode = error.type();
    
                LOG_ERROR("UpdateTask  failed %s", strMsg.toStdString().c_str());
    
                break;
    
            }
    
            errorCode = 0;
    
            //创建图片解析任务
    
        } while (0);
    
        return errorCode;
    
    }

    3.6   查询数据

    在使用查询时,如果是多个条件,例如select * from vehicle where vehicletype in (: vehiclecolor),如果使用query.bindValue(":vehiclecolor ", task.value("vehiclecolor "));当vehiclecolor值为多个时,例如‘红’,‘黄’。如果用query.bindValue(":vehiclecolor", task.value("vehiclecolor"));绑定值,会发现执行语句时无效。只有用将颜色组织成字符串后才有效,strCondition += QString(" vehiclecolor in (%1)  AND").arg(strtemp);

    void LocalDb::SlotQueryVehicleByCondition(int pageno, int pagesize, QMap<QString, QMap<QString, QString>> cond)
    
    {
    
        int errorCode = 0;
    
        QString msg;
    
        QString sqlcount = "SELECT count(*) from vehicle ";
    
        QVariantMap bindvalue;
    
        QString sqlserchpage = "SELECT * from vehicle ";//ORDER BY time DESC LIMIT :limit OFFSET :offset";
    
        QString strCondition = "";
    
        QString strtemp = "";
    
        if (cond.size() > 0)
    
        {
    
            strCondition = "where";
    
            //车辆类型
    
            if (cond.contains("vehicletype"))
    
            {
    
                strtemp = GetStringCondition(cond["vehicletype"].keys());
    
                strCondition += QString(" vehicletype in (%1)  AND").arg(strtemp);
    
            }
    
            //车牌号码
    
            if (cond.contains("vehiclenum"))
    
            {
    
                strtemp = cond["vehiclenum"]["vehiclenum"];
    
                strCondition += QString(" vehiclenum in ('%1')  AND").arg(strtemp);
    
            }
    
            //特征标识
    
            if (cond.contains("mark"))
    
            {
    
                if (cond["mark"].contains("副驾驶"))
    
                {
    
                    strCondition += QString(" visepilot in ('是') AND");
    
                }
    
                if (cond["mark"].contains("挂件"))
    
                {
    
                    strCondition += QString(" hangthing in ('是') AND");
    
                }
    
                if (cond["mark"].contains("遮阳板"))
    
                {
    
                    strCondition += QString(" hidesunplate in ('是') AND");
    
                }
    
                if (cond["mark"].contains("危险品"))
    
                {
    
                    strCondition += QString(" danger in ('是') AND");
    
                }
    
            }
    
            //车牌颜色
    
            if (cond.contains("platecolor"))
    
            {
    
                strtemp = GetStringCondition(cond["platecolor"].keys());
    
                strCondition += QString(" platecolor in (%1)  AND").arg(strtemp);
    
            }
    
            //车身颜色
    
            if (cond.contains("vehiclecolor"))
    
            {
    
                strtemp = GetStringCondition(cond["vehiclecolor"].keys());
    
                strCondition += QString(" vehiclecolor in (%1)  AND").arg(strtemp);
    
            }
    
            if (cond.contains("time"))
    
            {
    
                if (cond["time"].contains("starttime"))
    
                {
    
                    strCondition += QString(" time >='%1' AND").arg(cond["time"]["starttime"]);
    
     
    
                }
    
                if (cond["time"].contains("endtime"))
    
                {
    
                    strCondition += QString(" time <='%1' AND").arg(cond["time"]["endtime"]);
    
                }
    
            }
    
            if (strCondition.right(4) == " AND")//去除最后的 AND
    
            {
    
                strCondition = strCondition.left(strCondition.length() - 4);
    
            }
    
            if (strCondition == "where")//无条件
    
            {
    
                strCondition = "";
    
            }
    
        }
    
        QVariantMap replyData;
    
        do
    
        {
    
            //先查出符合条件的总数量
    
            QSqlQuery countquery;
    
            //先删除数据库中的数据
    
            sqlcount += strCondition;
    
            countquery.prepare(sqlcount);
    
            if (!countquery.exec()
    
                || !countquery.next())
    
            {
    
                QSqlError error = countquery.lastError();
    
                errorCode = error.type();
    
                msg = error.text();
    
                LOG_ERROR("query vehicle count failed,msg:%s", msg.toStdString().c_str());
    
                break;
    
            }
    
            quint64 totalCount = countquery.record().value(0).toULongLong();
    
            if (0 >= totalCount)
    
            {
    
                break;
    
            }
    
            QVariantList dataList;
    
            QSqlQuery query;
    
            sqlserchpage += strCondition;
    
            sqlserchpage += QString(" ORDER BY time DESC LIMIT %1 OFFSET %2").arg(pagesize).arg((pageno)* pagesize);
    
            query.prepare(sqlserchpage);
    
            if (!query.exec())
    
            {
    
                QSqlError error = query.lastError();
    
                errorCode = error.type();
    
                msg = error.text();
    
                break;
    
            }
    
     
    
            while (query.next())
    
            {
    
                QSqlRecord record = query.record();
    
                int column = record.count();
    
                QVariantList recorditem;
    
                for (int i = 0; i < column; i++)
    
                {
    
                    QVariantMap data;
    
                    data.insert("N", record.fieldName(i));
    
                    data.insert("V", record.value(i));
    
                    recorditem.append(data);
    
                }
    
                QVariantMap item;
    
                item.insert("data", recorditem);
    
                dataList.append(item);
    
            }
    
            replyData.insert("totalCount", totalCount);
    
            replyData.insert("data", dataList);
    
     
    
        } while (0);
    
        singalQueryVehicle(errorCode, msg, replyData);
    
    }

    3.7   删除数据

    删除数据用delete,如果清空表格,则不带where条件。同样如果是一次删除多条记录,不能用bindValue去绑定值,计时绑定的值是拼接好的字符串,并且加上了引号都没用,需直接组织一个字符串。将多个taskId的值添加到字符串中。

    int LocalDb::deleteAlarmTask(QString id,QString& strMsg)
    
    {
    
        if (id=="")
    
        {
    
            return -1;
    
        }
    
        int errorCode = 0;
    
        QString msg;
    
        do
    
        {
    
     
    
            QSqlQuery query;
    
            //先删除数据库中的数据
    
            query.prepare("delete from alarmTask where id =:taskId");
    
            query.bindValue(":taskId",id);
    
            if (!query.exec())
    
            {
    
                QSqlError error = query.lastError();
    
                errorCode = error.type();
    
                msg = error.text();
    
                LOG_ERROR("delete %s failed,msg:%s", id.toStdString().c_str(), msg.toStdString().c_str());
    
                return -1;
    
            }
    
           
    
        } while (0);
    
        return 0;
    
    }
    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html
  • 相关阅读:
    Cornfields POJ
    二维RMQ模板
    降雨量 HYSBZ
    Frequent values UVA
    UVA
    Argus UVALive
    关于二分图有向边和无向边问题探讨
    Guardian of Decency UVALive
    SAM I AM UVA
    【062新题】OCP 12c 062出现大量新题-15
  • 原文地址:https://www.cnblogs.com/bclshuai/p/15476688.html
Copyright © 2011-2022 走看看