qt5.6.3下使用firebird
有人把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.
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.
In a suitable shell, start an isql interactive session, opening the employee database via its alias:
> isql -user sysdba employee
Create the SYSDBA user:
SQL> create user SYSDBA password 'SomethingCryptic';
SQL> commit;
SQL> quit; 好了,按照这个步骤,重新设置firebird的密码,一切好转起来。
qt5.6.3下使用firebird的更多相关文章
- 解决qt5在ubuntu下无法调用fcitx输入中文的问题
如题,在以前安装qt5.2.1的时候就遇到了这个问题.当时上网搜了很多资料,结果都解决不了,发现都是复制来复制去. 这次因为要用qt5.3.0在ubuntu下写个程序,所以不解决这个问题不行了.就继续 ...
- OpenCV+QT5在Window下的环境配置记录
在安装OpenCV时最需要注意的是,OpenCV库,也就是我们需要的dll和动态库需要我们使用CMake来生成. 虽然在官网上下载得到的文件中已经包含了库文件和.h等头文件,但是在具体开发中编译器编译 ...
- 关于qt5在win7下发布 & 打包
QT5 发布时,莫过于依赖动态链接库(dll) , 但是,QT5的动态链接库貌似都有2套 ,例如 Qt5Core (针对realese) , Qt5Cored (针对debug) ,凡事末尾带d的都是 ...
- 【Qt5】Windows下配置程序的产品、公司、版权、版本号等详细信息
在工程的pro文件中加入下面的配置 # 配置图标(仅Windows有效)# 本程序使用两个图标,这样其快捷方式可以有更多选择,也可以给关联文件提供图标选择RC_ICONS += icon1.ico \ ...
- Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案
最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective' was not declared ...
- linux下QtCreator无法输入中文的情况
解决linux下QtCreator无法输入中文的情况 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina ...
- Qt4过渡至Qt5
技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008 + Qt4.8也未曾及时更新.这几天,果断装上VS2010 + Qt5.1,开始研究.Qt ...
- Qt4升级到Qt5
QtWidgets作为一个独立的模块 例如编译时错误 error: QMainWindow: No such file or directory error: QToolButton: No such ...
- Qt5 程序发布打包
关于qt5在win7下发布 & 打包 ----------------------------------------------------------------------------- ...
随机推荐
- 实例的初始化由JVM装载类的时候进行,保证了线程的安全性
在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...
- ArrayList 和 Vector 的区别
这两个类都实现了 List 接口( List 接口继承了 Collection 接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取 ...
- linux 多线程之间信号传递
函数 sigwait sigwait的含义就如同它的字面意思:等待某个信号的到来.如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠.要达到等到一个信号,我们得做下面的事: 首先,定义一个信号 ...
- 【Alpha】Phylab 展示博客
目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...
- WCF系列教程之WCF服务宿主与WCF服务部署
本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...
- 配置tomcat-users
<role rolename="admin-gui"/><role rolename="admin-script"/><role ...
- 天猫消息盒子的CSS实现
css: body,h2,h3,ul,p{margin:0;padding:0;font-size:12px;} li{list-style: none; } a{text-decoration: n ...
- Java PrepareStatement
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象 ...
- redis数据类型(三)hash类型
一.hash类型 hash是一个string类型的field和value的映射表.添加,删除操作都是O(1)(平均). hash特别适合用于存储对象.相对于将对象的每个字段存成单个string ...
- tomcat主页打不开,tomcat manager 配置,Failed to start component [StandardEngine[Catalina].
Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Serv]] ...