标题:关于Qt数据库开发的一些冷知识
作者:liudianwu
日期:2022-06-26 17:23
内容:
## 一、知识要点
- Qt即支持库的形式直接和数据库通信,也支持ODBC数据源的形式和各种数据库通信,这样就涵盖了所有的情况。
- Qt数据库程序打包发布,所有前提:注意区分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需要带上oci.dll、oraociei11.dll(这个文件很大有130MB+),如果不行建议直接安装个oracle client客户端软件,然后对应bin目录设置到环境变量就好。
- 打包发布后测试下来,发现32位的程序也可以正常连接64位的mysql,64位的程序也可以正常连接32位的mysql,因此判断只要和程序的库的位数一致就行(编译的时候也是这个规则,32位的Qt程序编译数据库插件也要用32位的数据库链接库。),不需要和具体的数据库的位数一致,测试过mysql、sqlserver、postgresql数据库都是类似规则。
- 大量测试对比下来,通过odbc数据源的方式和直连数据库的方式批量插入大量数据记录,直连方式速度更快,约5%左右,所以建议尽量采用此方式,是在没有此方式的环境才采用odbc数据源的方式,Qt默认自带odbc数据库插件。
- mysql、postgresql数据库在执行sql脚本的时候,会自动将表名和字段名全部转成小写,oracle全部转成大写,这就导致使用QSqlTableModel调用setTable设置数据库表名的时候,一定要和数据库中的表名一致,区分大小写,mysql数据库默认配置设置的不区分大小写所以没有这个问题,所以就是在对postgresql和oracle数据库的时候一定要注意,本人就是在这里卡了很久,差点要把这巨大的屎盆扣在Qt的BUG上。
```cpp
void DbHelper::bindTable(const QString &dbType, QSqlTableModel *model, const QString &table)
{
//postgresql全部小写,oracle全部大写,这两个数据库严格区分表名字段名的大小写卧槽
QString flag = dbType.toUpper();
if (flag == "POSTGRESQL") {
model->setTable(table.toLower());
} else if (flag == "ORACLE") {
..