目录一、前言二、数据库开发经验总结三、数据库连接说明四、数据库操作流程代码五、数据库综合应用组件一、前言 近期花了两个多月时间,将数据库相关的代码重新封装成了各种轮子(这条路必须打通
近期花了两个多月时间,将数据库相关的代码重新封装成了各种轮子(这条路必须打通,打通以后,相关项目只需要引入这个组件pri即可),测试了从Qt4.7到Qt6.1的各种版本,测试了odbc、sqlite、Mysql、postgresql、sqlserver、oracle、人大金仓等数据库,测试了本地连接、远程连接、阿里云连接等,测试了windows、linux、Mac等系统,将所有项目数据库相关的代码全部更新了一遍。能够兼容这么多Qt版本和数据库插件以及测试验证系统,估计全网也没几个人,全国11W Qter开发者中应该也是最多不超过10人。
在数据库相关的应用中,如果仅仅是单机版本,没有特别的需要(比如领导指定,或者需要远程存放数据),强烈建议使用sqlite数据库,这是本人经过无数次的对比测试和N个商业项目应用得出的结论。
Qt天生内置了sqlite数据库,只需要发布的时候带上插件就行(可以看到插件动态库文件比其他几种都要大,那是因为直接将数据库的源码都编译进去了,而其他只编译了中间通信交互的插件源码),其他数据库要么还要带上动态库,要么还需要创建数据源;速度上,绝对无与伦比的出类拔萃,同样的数据库结构(表结构、索引等完全一致),查询速度和批量更新速度、数据库事务等,速度都是其他几种的至少3倍以上,而且随着数据量的增大对比越发明显;
几千万的数据量完全没问题,而且速度和性能都还可以,不要以讹传讹网上部分菜鸡说的不支持百万以上的数据量,本人亲测亿级别,数据量建议千万级别以下,着重注意数据库表和索引的设计;
其他数据库还要注意版本的区别,ODBC数据源形式还容易出错和执行失败;
sqlite数据库也有几个重大缺点:不支持加密,不支持网络访问,不支持部分数据库高级特性,不支持海量数据(亿级别以上),但是对于绝大部分Qt项目还是足够;
数据库支持友好度大致是 sqlite > postgresql > mysql > odbc ;
以上都是在Qt环境中个人测试得出的结论,结果未必正确,作为参考即可,其他编程环境比如C#、JAVA请忽略,也许差别可能在中间通信的效率造成的;
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();
}
(一)功能特点
(二)数据库通信管理线程类
(三)数据库通用翻页类
(四)分页导航控件
(五)自动清理数据线程类
(六)自定义委托全家桶
(七)效果图
(八)体验地址
体验地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取码:uyes 文件名:bin_dbtool.zip
国内站点:Https://gitee.com/feiyangqingyun
国际站点:https://GitHub.com/feiyangqingyun
以上就是Qt数据库相关应用开发总结的详细内容,更多关于Qt数据库开发的资料请关注编程网其它相关文章!
--结束END--
本文标题: Qt数据库相关应用开发总结
本文链接: https://www.lsjlt.com/news/139755.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0