有人把firebird比做數據庫界的瑞士軍刀,想學習一下其在QT5.6中的使用,因而便開始了一場本身挖坑,本身埋的旅程。mysql
環境說明:win7 64位+QT5.6 mingw4.9 32位(好像官網上也沒有64位,固然mingw也是32位的)+firebird 64位。再介紹一下中間人:Mysql5.7 64位版本(本文重點是介紹QT+FireBird,爲何要加入Mysql,切看下文)sql
1、先下載firebird。網址:www.firebirdsql.org。咱們選擇最新版本3.0.4,64位,zip格式的。固然您最好把32位的也一併下載。由於……,之後會用得着,而後分別解壓,鄙人的目錄分別是e:\firebird64和e:\firebird32。shell
2、按照網上資料,開始編譯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的錯誤。json
3、填坑1:上面這個INCLUDEPATH,很關鍵,當初哥們在這裏整整填了一天的坑。剛開始只下載了firebird64位版本,不管怎麼編譯都通不過。直接放棄。改用Mysq,心想Mysql是QT5.6原生支持。如何查看QT5.6支持哪些數據庫?一是能夠到下面目錄中查看 :session
E:\Qt\Qt5.6.3\5.6.3\mingw49_32\plugins\sqldrivers。裏面有哪些dll,QT就支持哪些,不用編譯。兩者固然也能夠在程序中經過如下方法來查看:ide
#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();ui
}加密
結果,在使用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
4、填坑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的密碼,一切好轉起來。