技术标签: Qt/C++学习笔记 Qt数据库操作 Qt数据库开发
近期花了两个多月时间,将数据库相关的代码重新封装成了各种轮子(这条路必须打通,打通以后,相关项目只需要引入这个组件pri即可),测试了从Qt4.7到Qt6.1的各种版本,测试了odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金仓等数据库,测试了本地连接、远程连接、阿里云连接等,测试了windows、linux、mac等系统,将所有项目数据库相关的代码全部更新了一遍。能够兼容这么多Qt版本和数据库插件以及测试验证系统,估计全网也没几个人,全国11W Qter开发者中应该也是最多不超过10人。
公众号:Qt实战,各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。
公众号:Qt入门和进阶,专门介绍Qt/C++相关知识点学习,帮助Qt开发者更好的深入学习Qt。多位Qt元婴期大神,一步步带你从入门到进阶,走上财务自由之路。
官方店:https://shop114595942.taobao.com//
void MainWindow::testDb()
{
//打印当前Qt对应支持的数据库驱动名称
qDebug() << QSqlDatabase::drivers();
//创建数据库对象,驱动名称根据打印的填写,"QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7"
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
//设置数据库参数,要查看Qt文档是否支持该数据库,一般建议默认的就好不用设置
//db.setConnectOptions("MYSQL_OPT_RECONNECT=1;MYSQL_OPT_CONNECT_TIMEOUT=1;");
//设置数据库的主机地址
db.setHostName("127.0.0.1");
//设置数据库通信端口,默认值 mysql:3306 postgres:5432 sqlserver:1433
db.setPort(5433);
//设置数据库名称,默认值 mysql:mysql postgres:postgres sqlserver:master
//如果是sqlite数据库只需要设置这个参数即可,其余参数都不用设置,因为sqlite不需要主机端口和用户
//参数内容为数据库文件的路径 db.setDatabaseName("c:/test.db");
db.setDatabaseName("postgres");
//设置登录用户名称,默认值 mysql:root postgres:postgres sqlserver:sa
db.setUserName("postgres");
//设置登录用户密码
db.setPassword("admin");
//打开数据库,如果失败打印错误信息
if (!db.open()) {
qDebug() << db.lastError();
return;
}
//执行增删改查
//常规查询语句
QString sql = "select UserName,UserPwd from UserInfo";
//带条件+排序+分组的查询语句
sql = "select UserName,UserPwd from UserInfo where UserName='admin' order by UserName asc group by UserGroup";
//构建查询对象,传入sql语句查询,可以先判断执行成功与否再来取值
QSqlQuery query;
if (query.exec(sql)) {
//循环取出所有查询结果,对应结果是QVariant类型可以自行to到其他类型
while(query.next()) {
qDebug() << query.value(0).toString() << query.value(1).toString();
}
}
//添加数据,拼接字符串的形式比较通用,还有占位符的形式
sql = "insert into UserInfo(UserName,UserPwd) values('ceshi', '12345')";
//删除数据,如果不加where条件则表示删除整个表的数据
sql = "delete from UserInfo where UserName='ceshi'";
//更新数据,如果不加where条件则表示更新整个表的数据
sql = "update UserInfo set UserPwd='admin123' where UserName='ceshi'";
//可以复用上面的QSqlQuery对象,也可以重新new,复用的话需要先调用clear
query.clear();
//添加+删除+更新 数据只需要知道执行成功与否就行
if (!query.exec(sql)) {
qDebug() << "执行sql语句失败";
}
//关闭数据库,程序自动关闭的时候也会关闭,所以只是用一个数据库的情况下无需手动关闭
db.close();
}
文章浏览阅读6.5k次,点赞12次,收藏108次。禁忌搜索算法求解TSP问题-python实现(附代码)
文章浏览阅读3k次,点赞3次,收藏6次。1.知识点:逆序建立链表+节点删除 2.题意:按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个) 3.注意事项:节点删除时若删除节点为尾节点的情况代码:#include <stdio.h>#include <stdlib.h>typedef struct str{ int num; ..._数据结构单链表怎么实现单链表数据的去重
文章浏览阅读974次。args: 要执行的shell命令,默认应该是一个字符串序列,如[‘df’, ‘-Th’]或(‘df’, ‘-Th’),也可以是一个字符串,如’df -Th’,但是此时需要把shell参数的值置为True。shell: 如果shell为True,那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性,如管道、文件名通配符、环境变量扩展功能,这将是非常有用的。_subprocess模块
文章浏览阅读2.6k次,点赞2次,收藏7次。1前端解决方案:https://juejin.im/post/5c51526fe51d455047338a2a这位大神的方法 获取到jsonlint.js然后导入本地vue项目本地使用import jsonlint from "@/utils/jsonlint.js"// 创建axios实例const service = axios.create({ 在这里重写方法 transformResponse: [function (data) { // Do whatever._vue 前端接受long类型数据,不对
文章浏览阅读2.7k次。Matlab 读写*.xml文件1.摘要 因为经常使用将图像中的目标标注信息保存在*.xml文件中。在训练深度神经网络是常用这样的训练数据。有时候需要使用原有的数据来扩充数据,而最常用的工具也就是Matlab(这里示例使用的Matlab2016b)。在这篇博文中主要介绍:①Matlab读取*.xml文件信息;②将*.xml文件中的信息显示在对应的图像上,可以简单可视化数据;③将在图像中..._如何用matlab将图像写入xml格式
文章浏览阅读1.8k次。应用场景是,在一个页面初始化的时候要给一个data内数据赋值,这个数据绑定到了页面v-for上,nvue中的所有生命周期都不能实现在渲染前给数据赋值,会报错,解决办法是定义一个常量去设置值,然后在data内把常量赋值给目标数据。..._uniapp data中的数据可以之前互相赋值吗
文章浏览阅读762次。来源:http://www.cnblogs.com/Tangf/archive/2012/09/16/2687236.html这个世界的坐标系统已经让人搞得昏头转向(请看这篇:国内各地图API比较),而百度地图还用了自家的坐标系统,今天偶然看到百度地图批量转换接口,心想看看代码反转一下,但尝试无果。虽然将百度坐标转换成火星坐标不成,但我还是有些东西想和大家分享,使用百度地图坐标接口实现地球_百度地图坐标转换接口实力
文章浏览阅读379次,点赞9次,收藏8次。测试串口我们需要一个串口调试工具,可以使用串口烧录工具或者STC8核心板扮演这个角色,具体的接线方式参考下面的表格。为要设置的停止位数,常见的取值为cstopb=1、-cstopb=2,基本上默认值为cstopb。为奇偶校验类型,可选值为-parity(无校验)、even(偶校验)和odd(奇校验)。从windows的串口助手发数据给泰山派,只需要查看 ttyS3的内容即可。 cs 数据位数,常见的取值为5、6、7、8,基本上默认都是8位。
文章浏览阅读1.2k次。请注意,这种方法仅适用于改变变量的输出值,而不会直接修改变量本身的存储值。如果你需要改变变量本身的有效位数,可能需要使用其他库或自定义数据类型来实现。对于改变变量本身的有效位数,C++标准库中没有直接提供内置函数。函数对结果进行四舍五入,并将结果除以因子,从而限制了浮点数的有效位数为指定的精度。这些方法都是通过控制输出的方式来实现保留有效位数,而不是直接修改变量本身。来将浮点数转换为字符串,并通过控制字符串的精度来实现保留有效位数。如果你需要限制变量的有效位数,可以使用一些数学函数来实现。_c++ double保留6位
文章浏览阅读1.6k次。本片文章重点参考《Android进阶解密》1.基于架构不同jvm 基于栈,需要去栈中读取数据,需要的指令多,效率慢(栈是内存上面的一段连续的存储空间)dvm是基于寄存器(寄存器是CPU上面的一块存储空间),没有类似jvm的栈操作指令(大量的出入栈打的指令)2.执行的字节码不同jvm是把java类编译成一个或者多个的.class文件,然后打包成jar文件的。dvm在jvm的基..._dvm和jvm区别
文章浏览阅读4.3k次,点赞29次,收藏41次。摘要:什么是Ajax,Ajax基本原理_ajax抓包
文章浏览阅读1.8k次。针对SpringBoot的开源渗透框架,以及Spring相关高危漏洞利用工具。_springboot漏洞检测工具