首页 > 其他分享 >Qt 5.14 编译驱动库连接Firebird 3.0.x(编译驱动库,修改驱动库源代码以支持Boolean类型字段)

Qt 5.14 编译驱动库连接Firebird 3.0.x(编译驱动库,修改驱动库源代码以支持Boolean类型字段)

时间:2022-09-18 23:24:00浏览次数:101  
标签:Qt ibase 编译 文件夹 5.14 驱动 源代码 Firebird

本人一直喜欢用Firebird,目前用的3.0.X版本,更新的4.0.X尚未使用(主要是用不惯那个int128字段类型),

近期初学Qt,想连接firebird使用,照着网上教的方法,自己做了一些修改(网上以连接firebird 2.X版本居多),连接成功。

由于版权原因,Qt自带的SQLplugins没有编译好的firebird的驱动qsqlibase.dll,需要手工编译。

我用的Qt 5.14.2,更高版本因为不支持win7,没有去学习了。这里就说 Qt 5.14.2+mingw32+Firebird 3.0.10x32版本

1.进入Qt,打开ibase 的工程文件,位于Qt安装文件夹\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\ibase

2.修改工程文件,主要是把Firebird的include文件,和lib文件包括进来,就可以编译了。

趟过的坑:A.我的FireBird默认安装的,在program filesx86文件夹,由于这个文件夹路径有空格,导致Qt的工具链编译报错,因此卸载了Firebird,重装到一个简易的文件夹,一次性编译通过

                 B.自己在工程文件加入的路径,路径分隔符最好用Linux风格的 /   ,不要用windows风格的   \  ,这样更好兼容Qt编译工具链。

以下是我的ibase.pro工程文件

======================分割线========================
TARGET = qsqlibase

HEADERS += $$PWD/qsql_ibase_p.h
SOURCES += $$PWD/qsql_ibase.cpp $$PWD/main.cpp

INCLUDEPATH += C:/Firebird/Firebird_3_0/include
LIBS += C:/Firebird/Firebird_3_0/lib/fbclient_ms.lib

# FIXME: ignores libfb (unix)/fbclient (win32) - but that's for the test anyway
#QMAKE_USE += C:/Firebird/Firebird_3_0/fbclient.dll
#QMAKE_LFLAGS += C:/Firebird/Firebird_3_0/fbclient.dll

OTHER_FILES += ibase.json

PLUGIN_CLASS_NAME = QIBaseDriverPlugin
include(../qsqldriverbase.pri)

======================分割线========================

3.编译,网上帖子都是先用make命令生成makefile,在用mingw32-make生成dll,我没有这么做。因为安装了delphi,命令路径中它也有make,会导致错误调用delphi安装的make

我是启动Qt安装时配置的MinGW32 x32的那个命令符,它会设置好环境变量,进入命令行,切换到Qt安装文件夹\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\ibase,

键入:qmake

再键入:mingw-make

这样dll文件就生成出来了。

4.手工复制生成的qsqlibase.dll到Qt框架插件指定文件夹,这样用QSqlDatabase才能自动识别到这个驱动。

由于我用的时MinGW32,当然把这个DLL复制到MinGW32对应的sql plugins文件夹去了。

编译好的DL在这里:QT安装文件夹\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers

复制到MinGW32的sql插件文件夹即可:QT安装文件夹\Qt5.14.2\5.14.2\mingw73_32\plugins\sqldrivers

=====================分割线==================

复制好文件后,用QSqlDatabase的drives()静态成员枚举,果然有了Firebird驱动,文字标识符为大写的:QIBASE

跑一下Select,Delete,Update都没有问题,通过QSqlQueryModal,连接到界面的QTableView都能正确显示。

 

一个很大的坑:

Qt 5.14带的驱动源代码:qsql_ibase.cpp,并不支持Firebird的BOOLEAN字段的映射,select这种类型字段,firebird驱动报错 SQLDA结果错误,成员指针未分配内存。

打开这个自带的文件,发现果然所有字段都有枚举,通过switch分支进行判断,诸如:分配内存,数据库到C++对象,C++对象到数据库,就是没有对BOOLEAN进行处理。

不懂这个程序库,只有照着做,以SQL_SHORT(这个是Firebird 路径下提供的ibase.h头文件预定义的,当然也有SQL_BOOLEAN),查找,凡是SQL_SHORT有switch分支处理的,加上一个SQL_BOOLEAN分支,注意内存空间,映射类型,我用的是C++的bool

存盘这个文件。然后再按上面的方法编译DLL,就可以顺利处理 BOOLEAN字段类型了,可以Select出来,也可以把boolean字段当作QSqlQuery的参数条件进行bindvalue,都没有问题了。

  

 

标签:Qt,ibase,编译,文件夹,5.14,驱动,源代码,Firebird
From: https://www.cnblogs.com/nativecoder/p/16706178.html

相关文章