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