推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

全国11WQter开发者的数据库开发经验总结

   2023-06-15 网络整理佚名2120
核心提示:二、数据库开发经验总结使用mysql、等支持远程访问的数据库的时候,并不需要本地安装数据库,只需要发布程序的时候带上对应数据库的动态库即可,比如mysql对应带上.创建数据库、创建表、创建索引、初始化数据等这些都可以通过执行sql语句来实现,强烈建议在对常用的数据量比较多的表创建表的时候要创建索引,在大量的数据查询更新操作的时候先启动数据库事务,执行完成以后提交数据库事务。

一、简介

最近用了两个多月的时间把数据库相关的代码重新打包成各种轮子(这条路一定要打通,打通后相关项目只需要引入这个组件pri),测试从Qt4.7到各个版本Qt6.1的,测试了odbc,mysql,,,,人大金仓等数据库,测试了本地连接,远程连接,阿里云连接等,测试了,linux,mac等系统,集成了所有项目数据库所有相关代码已更新。 兼容这么多的Qt版本、数据库插件和测试验证系统,估计全网的人不多,国内11W的Qter开发者应该不超过10个。

2.数据库开发经验总结

三、数据库连接说明

Qt5默认提供的数据库插件包括四种:QPSQL、QODBC。 后来的版本如5.12也去掉了mysql(可能是开源协议的问题),驱动打印中还有一个提示是老版本。 Now The above, 意思是老版本,现在默认一般在上面。

根据字面意思,很容易理解就是用来连接数据库,用来连接mysql数据库,QPSQL用来连接数据库,QODBC理论上可以用来连接任何数据库支持ODBC数据源,如,,mysql,等。

Qt4默认提供的数据库插件只有两个,一个是QODBC,因为QODBC理论上可以连接任何支持ODBC数据源的数据库,但是只能通过微软的数据源中间件,可能会损失效率,所以在 Qt5 中是新的。 增加了QPSQL等其他几个常用数据库的插件,但是其他数据库由于协议要求没有提供相应的插件,需要自己编译。

Qt内置了数据库,可以观察到.dll文件的大小明显比其他数据库插件大很多。 理论上,单个插件应该小得多。 毕竟属于小型数据库,所以必须直接编译成插件。 所以我们在使用数据库的时候不需要带.dll,但是在使用mysql的时候需要带.dll。

使用mysql等支持远程访问的数据库时,不需要在本地安装数据库。 发布程序时只需要带上对应数据库的动态库即可。 该地址可以连接,比如阿里云的mysql,以及其他云数据库。

mysql等支持远程连接的数据库,默认安装后出于安全考虑只支持本地访问,需要配置远程访问。 mysql需要添加用户root@%,即host设置为%,需要打开安装目录下的C:\\10\data\.conf文件,添加一行host all all 192.168.1.0 /24 md5 支持从192.168.1.1到192.168.1.255的IP访问,将C:\\10\data\.conf改为= '*'表示支持所有地址,具体含义可以通过搜索你自己。

mysql 数据库通信的默认端口是 3306,默认端口是 5432。这些端口可以在安装期间或以后更改。

数据库也有数字差异。 比如连接64位的数据库,就需要使用64位的Qt,64位的数据库插件和对应的动态库文件。 数字必须完全相同,否则无法连接。 路上,很多人都会倒在这个地方。 除了位数的差异,可能还需要注意版本的差异。 毕竟数据库已经更新升级了。 有些版本变化很大。 Qt发布版本时可能不支持最新的数据库。 因此,一般建议使用稍旧的数据库版本。 ,比如mysql一直在用5.6,Qt5.13版本支持到现在。

一般软件默认只需要连接一个数据库,所以建议在程序启动后直接打开数据库,然后执行其他需要用到数据库的地方,最后在程序关闭时关闭数据库。 很多新手每次增删改查都要打开数据库,操作完再关闭数据库,效率极低。 如果需要连接多个数据库,使用数据库连接名作为区分。 Qt 支持同时连接多个数据库。 数据库跨线程不安全,需要加锁。 因此,建议在该线程中打开任何线程使用的数据库。 不是主线程打开数据库,而是子线程使用数据库,这很容易出问题。 Qt5.10开始增加数据库跨线程使用的安全检查,运行时会打印提示。

创建数据库、创建表、创建索引、初始化数据等都可以通过执行SQL语句来实现。 强烈建议在为常用数据量较大的表建表时创建索引。 在大量数据的查询更新操作时,先启动数据库事务,执行完成后再提交数据库事务。

四、数据库操作流程代码

portant;overflow-wrap: break-word !important;">void MainWindow::testDb()portant;overflow-wrap: break-word !important;">{portant;overflow-wrap: break-word !important;">    //打印当前Qt对应支持的数据库驱动名称portant;overflow-wrap: break-word !important;">    qDebug() << QSqlDatabase::drivers();portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> //创建数据库对象,驱动名称根据打印的填写,"QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7"portant;overflow-wrap: break-word !important;"> QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");portant;overflow-wrap: break-word !important;"> //设置数据库参数,要查看Qt文档是否支持该数据库,一般建议默认的就好不用设置portant;overflow-wrap: break-word !important;"> //db.setConnectOptions("MYSQL_OPT_REConNECT=1;MYSQL_OPT_CONNECT_TIMEOUT=1;");portant;overflow-wrap: break-word !important;"> //设置数据库的主机地址portant;overflow-wrap: break-word !important;"> db.setHostName("127.0.0.1");portant;overflow-wrap: break-word !important;"> //设置数据库通信端口,默认值 mysql:3306 postgres:5432 sqlserver:1433portant;overflow-wrap: break-word !important;"> db.setPort(5433);portant;overflow-wrap: break-word !important;"> //设置数据库名称,默认值 mysql:mysql postgres:postgres sqlserver:masterportant;overflow-wrap: break-word !important;"> //如果是sqlite数据库只需要设置这个参数即可,其余参数都不用设置,因为sqlite不需要主机端口和用户portant;overflow-wrap: break-word !important;"> //参数内容为数据库文件的路径 db.setDatabaseName("c:/test.db");portant;overflow-wrap: break-word !important;"> db.setDatabaseName("postgres");portant;overflow-wrap: break-word !important;"> //设置登录用户名称,默认值 mysql:root postgres:postgres sqlserver:saportant;overflow-wrap: break-word !important;"> db.setUserName("postgres");portant;overflow-wrap: break-word !important;"> //设置登录用户密码portant;overflow-wrap: break-word !important;"> db.setPassword("admin");portant;overflow-wrap: break-word !important;"> //打开数据库,如果失败打印错误信息portant;overflow-wrap: break-word !important;"> if (!db.open()) {portant;overflow-wrap: break-word !important;"> qDebug() << db.lastError();portant;overflow-wrap: break-word !important;"> return;portant;overflow-wrap: break-word !important;"> }portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> //执行增删改查portant;overflow-wrap: break-word !important;"> //常规查询语句portant;overflow-wrap: break-word !important;"> QString sql = "select UserName,UserPwd from UserInfo";portant;overflow-wrap: break-word !important;"> //带条件+排序+分组的查询语句portant;overflow-wrap: break-word !important;"> sql = "select UserName,UserPwd from UserInfo where UserName='admin' order by UserName asc group by UserGroup";portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> //构建查询对象,传入sql语句查询,可以先判断执行成功与否再来取值portant;overflow-wrap: break-word !important;"> QSqlQuery query;portant;overflow-wrap: break-word !important;"> if (query.exec(sql)) {portant;overflow-wrap: break-word !important;"> //循环取出所有查询结果,对应结果是QVariant类型可以自行to到其他类型portant;overflow-wrap: break-word !important;"> while(query.next()) {portant;overflow-wrap: break-word !important;"> qDebug() << query.value(0).toString() << query.value(1).toString();portant;overflow-wrap: break-word !important;"> }portant;overflow-wrap: break-word !important;"> }portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> //添加数据,拼接字符串的形式比较通用,还有占位符的形式portant;overflow-wrap: break-word !important;"> sql = "insert into UserInfo(UserName,UserPwd) values('ceshi', '12345')";portant;overflow-wrap: break-word !important;"> //删除数据,如果不加where条件则表示删除整个表的数据portant;overflow-wrap: break-word !important;"> sql = "delete from UserInfo where UserName='ceshi'";portant;overflow-wrap: break-word !important;"> //更新数据,如果不加where条件则表示更新整个表的数据portant;overflow-wrap: break-word !important;"> sql = "update UserInfo set UserPwd='admin123' where UserName='ceshi'";portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> //可以复用上面的QSqlQuery对象,也可以重新new,复用的话需要先调用clearportant;overflow-wrap: break-word !important;"> query.clear();portant;overflow-wrap: break-word !important;"> //添加+删除+更新 数据只需要知道执行成功与否就行portant;overflow-wrap: break-word !important;"> if (!query.exec(sql)) {portant;overflow-wrap: break-word !important;"> qDebug() << "执行sql语句失败";portant;overflow-wrap: break-word !important;"> }portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;">
portant;overflow-wrap: break-word !important;"> //关闭数据库,程序自动关闭的时候也会关闭,所以只是用一个数据库的情况下无需手动关闭portant;overflow-wrap: break-word !important;"> db.close();portant;overflow-wrap: break-word !important;">}

5.数据库综合应用组件

(一)特点

同时支持odbc、mysql、、、、NPC金仓等多种数据库。

一个数据库类可以管理本地数据库通信,也可以支持远程数据库通信等。

数据库线程支持各种SQL语句的执行,包括单条和批处理。

组件中的所有类打印信息、错误信息和执行结果都作为信号发送出去。

将数据库的通用翻页类(负责具体的处理逻辑),与分页导航控件(负责外观)集成,形成一个超强大的翻页控件。

集成数据库自动清理类,设置最大记录数,后台自动清理前期数据。

集成自定义委托类,支持复选框、文本框、下拉框、日期框、微调器、进度条等。

同时支持Qt4-Qt6,亲测Qt4.6到Qt6.1任意版本,任意系统和编译器。

该组件已在至少数万个站点7次24小时360天无故障运行,具有商业级质量保证。

每节课对应一个完整详细的使用示例,并附有详尽的注释,非常适合阅读学习。

可以作为一个独立的程序运行,比如自动清理早期数据,同步数据到云端等。

全线程处理,无卡顿界面,自动重连数据库。

正常测试用例中,数据库和数据库生成器每秒插入1000条记录约0.003秒,而自动数据清洗类每秒删除1000条记录约0.13秒,不同线程互不干扰。

(2)数据库通信管理线程类

可以设置数据库类型,支持多种数据库类型。

数据库类型包括但不限于odbc、mysql、、、、仁达金仓等。

可以设置数据库连接信息,包括主机地址、用户信息等。

具有自动重连机制,可以设置是否检查连接和检查间隔。

支持单条sql语句队列,一般用于查询和返回数据,每插入一条执行一条。

支持多条sql语句队列,一般用于远程提交数据,一次插入一条执行多条。

支持批量sql语句队列,一般用于批量更新数据,每次插入多项,执行多项。

可以设置最大队列数来限制排队等待处理的sql语句集。

通过信号发出打印信息、错误信息和查询结果。

(3)数据库通用翻页类

可以设置每页显示多少行记录,并根据设置值自动分页。

可以设置要查询的表名、字段集、条件语句、排序语句。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON