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; }