有人把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. 实例的初始化由JVM装载类的时候进行,保证了线程的安全性

    在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...

  2. ArrayList 和 Vector 的区别

    这两个类都实现了 List 接口( List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取 ...

  3. linux 多线程之间信号传递

    函数 sigwait sigwait的含义就如同它的字面意思:等待某个信号的到来.如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠.要达到等到一个信号,我们得做下面的事: 首先,定义一个信号 ...

  4. 【Alpha】Phylab 展示博客

    目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...

  5. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  6. 配置tomcat-users

    <role rolename="admin-gui"/><role rolename="admin-script"/><role ...

  7. 天猫消息盒子的CSS实现

    css: body,h2,h3,ul,p{margin:0;padding:0;font-size:12px;} li{list-style: none; } a{text-decoration: n ...

  8. Java PrepareStatement

    1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象 ...

  9. redis数据类型(三)hash类型

    一.hash类型   hash是一个string类型的field和value的映射表.添加,删除操作都是O(1)(平均).   hash特别适合用于存储对象.相对于将对象的每个字段存成单个string ...

  10. tomcat主页打不开,tomcat manager 配置,Failed to start component [StandardEngine[Catalina].

    Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Serv]] ...