有人把firebird比作数据库界的瑞士军刀,想学习一下其在QT5.6中的使用,于是便开始了一场自己挖坑,自己埋的旅程。

环境说明:win7 64位+QT5.6 mingw4.9 32位(好像官网上也没有64位,当然mingw也是32位的)+firebird 64位。再介绍一下中间人:Mysql5.7 64位版本(本文重点是介绍QT+FireBird,为什么要加入Mysql,切看下文)

一、先下载firebird。网址:www.firebirdsql.org。我们选择最新版本3.0.4,64位,zip格式的。当然您最好把32位的也一并下载。因为……,以后会用得着,然后分别解压,鄙人的目录分别是e:\firebird64和e:\firebird32。

二、按照网上资料,开始编译QIBASE,目的是生成qsqlibase.dll和qsqlibased.dll,首先进入E:\Qt\Qt5.6.3\5.6.3\Src\qtbase\src\plugins\sqldrivers\ibase,找到ibase.pro,打开它,修改成以下内容:

TARGET = qsqlibase

SOURCES = main.cpp
OTHER_FILES += ibase.json
INCLUDEPATH += E:\firebird32\include
LIBS += E:\firebird32\lib\fbclient_ms.lib
include(../../../sql/drivers/ibase/qsql_ibase.pri)

PLUGIN_CLASS_NAME = QIBaseDriverPlugin
include(../qsqldriverbase.pri)
请注意上面的红色代码部分:尽量放在include的前面。因为什么呢?我们看qsql_ibase.pri,这个文件引入了另外两个文件,在另外两个文件中需要用到INCLUDEPATH中的ibase.h,如果次序不对,可能会出现无法找到ibase.h的错误。

三、填坑1:上面这个INCLUDEPATH,很关键,当初哥们在这里整整填了一天的坑。刚开始只下载了firebird64位版本,无论怎么编译都通不过。直接放弃。改用Mysq,心想Mysql是QT5.6原生支持。如何查看QT5.6支持哪些数据库?一是可以到下面目录中查看 :

E:\Qt\Qt5.6.3\5.6.3\mingw49_32\plugins\sqldrivers。里面有哪些dll,QT就支持哪些,不用编译。二者当然也可以在程序中通过以下方法来查看:

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QDebug>
#include <QStringList>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

QStringList lists=QSqlDatabase::drivers();
    qDebug()<<lists.join("-");

 return a.exec();

结果,在使用mysql时,程序却提示QMYSQL找不到。把libmysql复制到mingw49\bin文件夹中,仍然不行。经查找资料,找到答案,原来需要使用32位版本的libmysql,于是从到mysql官网找到32位的libmysql.dll,复制到mingw49_32\bin文件夹中,发现QT可以操作mysql了,还可以直接使用64位版本mysql生成的数据库。在此,明白了先前为什么编译firebird不通过的原因:你引入的是64位的库文件及头文件,当然无法用32位的mingw32-make编译啦。于是哥们又重新找出32位的firebird,按照第二步提到的内容重新编译。哈,通过,生成了qsqlibase.dll和qsqlibased.dll。此时这两个Dll位于E:\Qt\Qt5.6.3\5.6.3\Src\qtbase\plugins\sqldrivers之下。再把32位firebird文件夹中的fbclient.dll复制到mingw49的bin文件夹中,发现可以使用QIBASE模块啦。

编译方法如下:(为方便操作,把qmake和mingw32-make放入到系统环境变量中)

进入E:\Qt\Qt5.6.3\5.6.3\Src\qtbase\src\plugins\sqldrivers\ibase\

qmake ibase.pro

mingw32-make

四、填坑2。有了dll,以为就万事大吉,按照网上资料,开始打开数据库进行操作,代码如下:

QSqlDatabase db=QSqlDatabase::addDatabase("QIBASE");
    db.setUserName("sysdba");
   db.setPassword("masterkey");
    db.setDatabaseName("D:\\SLj.FDB");
    if(!db.isValid())
    {
        QString lastError = db.lastError().text();
        qDebug()<<lastError;
    }
    else
        qDebug()<<"database connect success";
    if(db.open())
    {
        qDebug()<<"database open success";
        db.close();
    }
    else
    {
        qDebug()<<"database open error:"<<db.lastError().text();
        db.close();
    }

此时程序会提示:install incomplete please read compatibility chapter之类的信息。意思是说安装不完整,请阅读手册兼容性部分。哥们哪有时间去阅读啊,直接网上找,看别人是怎么解决不就成了。结果查了一天也没找出个结果。没办法,只好找官网上老老实实看手册。在各类guide中都没找到,最后看release notes吧。哈,果然在第12部分的Initializing the Security Database找到了答案,我们看一下官网是怎么说的:

By default, Firebird 3 is configured for the new authentication model which uses SRP to work with user passwords and generate unique session identifiers for traffic encryption. The security database (security3.fdb) has no predefined users. This is intentional.

啥意思,从3.0开始,默认用户名还是sysdba,但密码不再是masterkey啦,成了一个加密的随机字符串。上面的操作当然无法打开数据库啦。再看下面。

The SQL user management commands will work with any open database. Because the sample database employee.fdb is present in your installation and already aliased in databases.conf, it is convenient to use it for the user management task.

  1. Stop the Firebird server.  Firebird 3 caches connections to the security database aggressively. The presence of server connections may prevent isql from establishing an embedded connection.

  2. In a suitable shell, start an isql interactive session, opening the employee database via its alias:

      > isql -user sysdba employee
    
  3. Create the SYSDBA user:

      SQL> create user SYSDBA password 'SomethingCryptic';
    SQL> commit;
    SQL> quit; 好了,按照这个步骤,重新设置firebird的密码,一切好转起来。

qt5.6.3下使用firebird的更多相关文章

  1. 解决qt5在ubuntu下无法调用fcitx输入中文的问题

    如题,在以前安装qt5.2.1的时候就遇到了这个问题.当时上网搜了很多资料,结果都解决不了,发现都是复制来复制去. 这次因为要用qt5.3.0在ubuntu下写个程序,所以不解决这个问题不行了.就继续 ...

  2. OpenCV+QT5在Window下的环境配置记录

    在安装OpenCV时最需要注意的是,OpenCV库,也就是我们需要的dll和动态库需要我们使用CMake来生成. 虽然在官网上下载得到的文件中已经包含了库文件和.h等头文件,但是在具体开发中编译器编译 ...

  3. 关于qt5在win7下发布 & 打包

    QT5 发布时,莫过于依赖动态链接库(dll) , 但是,QT5的动态链接库貌似都有2套 ,例如 Qt5Core (针对realese) , Qt5Cored (针对debug) ,凡事末尾带d的都是 ...

  4. 【Qt5】Windows下配置程序的产品、公司、版权、版本号等详细信息

    在工程的pro文件中加入下面的配置 # 配置图标(仅Windows有效)# 本程序使用两个图标,这样其快捷方式可以有更多选择,也可以给关联文件提供图标选择RC_ICONS += icon1.ico \ ...

  5. Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案

          最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective'  was not declared ...

  6. linux下QtCreator无法输入中文的情况

    解决linux下QtCreator无法输入中文的情况 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina ...

  7. Qt4过渡至Qt5

    技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008 + Qt4.8也未曾及时更新.这几天,果断装上VS2010 + Qt5.1,开始研究.Qt ...

  8. Qt4升级到Qt5

    QtWidgets作为一个独立的模块 例如编译时错误 error: QMainWindow: No such file or directory error: QToolButton: No such ...

  9. Qt5 程序发布打包

    关于qt5在win7下发布 & 打包 ----------------------------------------------------------------------------- ...

随机推荐

  1. Centos7 自定义systemctl服务脚本

    序言篇: 之前工作环境一直使用Centos6版本,脚本一直在使用/etc/init.d/xxx:系统升级到Cento7后,虽然之前的启动脚本也可以使用,但一直没有使用systemctl 的自定义脚本. ...

  2. leetcode-8-字符串转整数 (atoi)

    题目描述: 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符 ...

  3. 为阿里云域名配置免费SSL支持https加密访问简单教程

    阿里云之前有免费ssl入口申请,现在已经关闭了.那么现在怎么为自己的域名配置https呢? 首先打开阿里云域名控制台,如以下界面.(这里暂且用我的这个域名讲解吧)  如上图点击ssl证书,点击单域名免 ...

  4. #Go# 点滴积累

    此篇仅为不断记录趟过的坑 StringToTimestamp import ( "time" ) const TimeFormat = "2006-01-02T15:04 ...

  5. USACO The Lazy Cow

    题目描述 这是一个炎热的夏天,奶牛贝茜感觉到相当的疲倦而且她也特别懒惰.她要在她的领域中找到一个合适的位置吃草,让她能吃到尽可能多的美味草并且尽量只在很短的距离.奶牛贝茜居住的领域是一个 N×N 的矩 ...

  6. Mac下使用Wine安装文件内容搜索工具Search and Replace

    下载: (链接: https://pan.baidu.com/s/1mij7WX6 密码: xsu8) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...

  7. Mac下用Launchd实现使用rc.local执行开机启动命令

    其实原理很简单,使用Launchd创建一个开机启动的服务,然后这个服务关联/etc/rc.local文件,那么接下来操作rc.local就和Linux下一样的了. 当然,这种思路还可以直接使用在~/. ...

  8. 自定义类型转换器之TypeConverter

    C#提供了很多类型转换的方法如ConvertToInt.int.Parse.int.tryParse等等,这些方法都能将一个C#的基本数据类型转换成另一个C#基本数据类型.那么.既然如此,C#肯定会提 ...

  9. 关于dubbo调度时出现Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method insertTestTb in the service cn.cuibusi.core.service.TestTbService.的解决办法

    在用dubbo跨项目调度service时出现如下错误: 错误原因:pojo没有实现序列化 解决方法:在pojo实现序列化接口即可

  10. 关于function构造函数特别注意的

    function在javascript中是对象,所以function持有构造函数例子:var a = new Function("x","y","re ...