1. 程式人生 > 其它 >Qt5.9.6 vs2015 SQlite 資料庫增刪改查

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:\QT\Qt5.9.6\5.9.6\msvc2015_64\plugins\的資料庫驅動資料夾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