• 1027阅读
  • 1回复

[原创]Qt编译数据库插件通用步骤说明 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2022-06-24

近期特意花了点时间,在之前数据集成应用这个组件的基础上再次迭代完善,历经九九八十一难,将Qt的各种数据库插件,十几个Qt版本,全部编译一遍,同时打通了插件形式直连数据库和ODBC数据源连接方式,做过各种对比测试,不同数据库不同分页算法,不同日期时间范围判断查询等。

1. 安装对应的数据库,安装后会有include头文件和lib链接库文件,这是基本的前提,编译数据库插件必须要有这两个东西。务必注意,32位的Qt必须安装32位的数据库才能正常编译成功,位数要一致。
2. 准备好数据库插件源码,比如qt-everywhere-src-5.14.2\qtbase\src\plugins\sqldrivers\mysql,可以在安装Qt的时候勾选src,或者后期直接官网重新下载源码解压出来。
3. 打开你要编译的数据库插件源码,比如mysql就打开mysql.pro,oracle就打开oci.pro。
4. 在pro中注释掉一行 #QMAKE_USE += mysql,如果是oci项目则是#QMAKE_USE += oci。
5. qsqldriverbase.pri文件中注释掉 #include(\$$shadowed(\$$PWD)/qtsqldrivers-config.pri)。

6. mysql.pro文件内容下面加上如下代码。
```cpp
path = C:/Qt/mysql-5.7.30-winx64
INCLUDEPATH += $$path/include
win32:LIBS += -L$$path/lib -llibmysql
```

7. oci.pro文件内容下面加上如下代码。
```cpp
path = C:/app/Administrator/product/11.2.0/client_1
INCLUDEPATH += $$path/oci/include
win32:LIBS += -L$$path/oci/lib/msvc -loci
```

8. 以上写法同时支持mingw和msvc,其他系统编译过程也是类似。编译完成后默认会在你当前源码所在盘符的根目录下,会出现plugins目录,里面sqldrivers目录下就是对应编译生成好的插件动态库。
9. 默认oracle的插件驱动代码是按照oracle12的函数写的,如果链接的是oracle11,则需要改动两行代码才能编译成功。打开qsql_oci.cpp文件大概在1559行代码左右,有个OCIBindByPos2函数改成OCIBindByPos,下面还有一行bindColumn.lengths改成(ub2*)bindColumn.lengths。

10. 程序打包发布,所有前提:注意区分32/64位,你的程序是32位的就必须带上32位的库,64位的必须带上64位的库,这点Qt的库也是这个要求。mysql发布最简单,带上一个mysql的动态库文件就行(windows上的是libmysql.dll),非常简单。sqlserver不用带,因为是微软的亲儿子,一般操作系统自带。postgres需要带上libpq.dll、libintl-8.dll、libiconv-2.dll、libeay32.dll、ssleay32.dll这几个文件就行。oracle比较特殊,文件很多,基本上还是建议直接安装个oracle client客户端软件,然后对应bin目录设置到环境变量就好。

11. 打包发布后测试下来,发现32位的程序也可以正常连接64位的mysql,64位的程序也可以正常连接32位的mysql,因此判断只要和程序的库的位数一致就行(编译的时候也是这个规则,32位的Qt程序编译数据库插件也要用32位的数据库链接库。),不需要和具体的数据库的位数一致,测试过mysql、sqlserver数据库都是类似规则,postgresql只测试了32位,oracle只测试了64位,现在绝大部分系统也都是64位了。

12. 大量测试对比下来,通过odbc数据源的方式和直连数据库的方式批量插入大量数据记录,直连方式速度更快,约5%左右,所以建议尽量采用此方式,是在没有此方式的环境才采用odbc数据源的方式,Qt默认永远自带odbc数据库插件。
window.open('http://www.qtcn.org/bbs/attachment/Mon_2206/17_110085_c6c48789359ccd5.jpg?163');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >

4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2022-06-24
20091001753 贡献值 +1 - 2022-06-24
20091001753 威望 +1 - 2022-06-24
20091001753 金钱 +10 - 2022-06-24
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线tanyue.esec

只看该作者 1楼 发表于: 2022-06-24

数据库增删改查每次都写一遍真的是太痛苦了,纯纯的体力劳动。
不知道是不是支持sqlite
快速回复
限100 字节
 
上一个 下一个