qt5.6.3下使用firebird

有人把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.

  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的密碼,一切好轉起來。
相關文章
相關標籤/搜索