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

自研股票智能分析报警软件更新链接 - 一字千金 - 博客园

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

Qt5.9.6 vs2015 SQlite 数据库增删改查相关推荐

  1. 基于python的SQLite数据库增删改查

    与其他数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是一种嵌入式数据库,他的数据库就是一个文件.SQLite将整个数据库,包括定义.表.索引以及数据本身,作为一个单独的.可 ...

  2. IOS sqlite数据库增删改查

    1.简介 简单封装sqlite数据库操作类 BaseDB 用于完成对sqlite的增删改查,使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h // ...

  3. Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】

    前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...

  4. Android Studio SQLite 数据库 增删改查 简单

    源码 效果展示     所有操作都在这个界面完成,操作完直接显示 设计     一个class用来创建数据库,建表,一个activity用来执行增删改查操作 代码 DatebaseHlper impo ...

  5. SQLite数据库-增删改查语句

    Android中自带的数据库----SQLite 这里使用Navicat工具来学习 1.创建新的SQLite连接 数据库文件名字和连接名一样就好 2.数据库的创建语句 //创建一个book表 crea ...

  6. Android SQLite数据库增删改查操作

    一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字). TEXT(字符 ...

  7. ios Sqlite数据库增删改查基本操作

    2019独角兽企业重金招聘Python工程师标准>>> 研究了几天的数据库,终于把它给搞出来了.Sqlite是ios上最常用的数据库之一,大家还是有必要了解一下的.这是仿照网上的一个 ...

  8. android 实现Sqlite的增删改查及系统的登录注册功能

    文章目录 1.用户实体类 2.SQLiteOpenHelper类 3.数据库名常量类 4.数据库增删改查方法封装 5.界面设计 5.1 登录页面 5.2 注册界面 5.3 修改密码界面 6. 源码下载 ...

  9. 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现

    常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现 以下方法全部亲测可用 //测试查找全部@Testpublic void testSelectAll(){List<U ...

  10. Mysql (一)Mysql 数据库增删改查

    mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...

最新文章

  1. CentOS7部署ELK5.2
  2. Python使用tpot获取最优模型并抽取最优模型模型参数
  3. 勒索软件出新招,小心你的隐私和財产安全!
  4. Java设计流程执行器_Java进阶面试精选系列:SpringMVC+SpringBoot+Hibernate+Mybatis+设计模式...
  5. python量化数据处理小细节(以后还会不断补充)
  6. mysql 异步复制建立过程_mysql生产环境高可用---基于GTID异步复制项目实施
  7. HDU1573 X问题【扩展欧几里得算法】
  8. RuiJie命令行划VLAN
  9. 不同版本操作系统和数据库的之间链接,和操作
  10. 机器视觉光源知识总结(二)
  11. JavaScript生成PDF
  12. Android吃鸡 3dtouch,绝地求生刺激战场3Dtouch怎么用 3Dtouch安卓手机可以用吗
  13. yarn install报错及解决办法
  14. 带你了解大数据时代的基本特征
  15. 接口和抽象类的区别是什么?抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
  16. 实验一 查看CPU和内存,用机器指令和汇编指令编程
  17. 世界著名logo设计文化解读
  18. 我热爱计算机作文450字,我的兴趣爱好作文450字精选5篇
  19. 谨慎处理 Service Worker 的更新
  20. 计算机应用与jaj,基于J2EE银鸽集团ERP系统的设计与应用-计算机应用技术专业论文.docx...

热门文章

  1. 分享一个插件-水珠自动下落效果
  2. 怎么修改CSDN的个性签名或者个人说明?
  3. html导航栏前面有图片,CSS带图片的漂亮导航菜单
  4. 解题:NOI 2010 航空管制
  5. Android API19 设置Alarm闹钟
  6. Parcelable encountered IOException
  7. linux 创建gpt分区,parted创建GPT分区
  8. 百度热力图颜色说明_千变万化的热力图,总有一款适合你!
  9. 百度热力图颜色说明_各大软件地图中的热力图是什么?如何正确使用?收藏了...
  10. PHP 操作MongoDB