如何在 靜態編譯的QT 5.5.1 中 使用數據庫插件連接 ODBC

前段時間由於工作的關係,需要編寫一個將數據插入到 Sql server 2012 的桌面軟件。

由於之前使用的是MFC,偶然間接觸到了Qt後,被它的簡潔驚豔到了,於是便毅然而然的轉投到了Qt的懷抱,哈哈……


廢話不多說,我使用的是最新的Qt 5.5.1版本(Qt 5.5.1 for Windows 32-bit MinGW), 在一路查看幫助文檔後,

終於是把程序編譯出來,正常運行了。正當我滿心歡喜的交付出去的時候,遇到問題了,程序在對方的電腦上運行時,

提示缺少動態庫!而且不同電腦缺少的庫還不一定相同!費勁心思找好缺少的庫後,原本滿滿的成就感就降低了許多……

在網上尋求的幫助過程中,我想到了靜態編譯的方式……


How to build a static Qt version for Windows with gcc


說做就做,按着官方網站的說明,無腦照搬步驟編譯出來了靜態

版本,但是在使用的時候出問題了:

運行的時候提示:

"Driver not loaded Driver not loaded"
Available drivers:
     "QSQLITE"

擦,原來默認沒把odbc的驅動編譯進去,好吧,按照Qt幫助文檔的說明編譯出了  libqsqlodbcd.a 、libqsqlodbc.a
這兩個文件,然後想當然地把這兩個文件放到 %QT/pluginssqldrivers文件夾下,你猜怎麼着,根本就沒有這個文件夾!

好吧,既然沒有,那我就給你建立一個,但還是沒什麼鬼用……

終於,皇天不負有心人,我瞭解到,我現在使用ODBC驅動的方式 叫做“調用靜態插件”, Qt正好有那麼篇介紹的文章:

How to Create Qt Plugins


按照上面的說明,在.pro 文件中加入如下語句:

QTPLUGIN+= qsqlodbc


並在.cpp文件中添加語句:


#include<QtPlugin>

Q_IMPORT_PLUGIN(QODBCDriverPlugin)

這裏要說一下,插件的名字,也就是這裏的“QODBCDriverPlugin”,去哪裏找呢?這得到我們編譯這個驅動的.pro文件中找,這裏是 odbc.pro,
(目錄: %Qt\src\qt-everywhere-opensource-src-5.5.1\qtbase\src\plugins\sqldrivers\odbc)。

另外,還要把和 .a庫一起編譯出來的兩個 .prl 文件放到 %Qt\lib 目錄下,並編輯這兩個文件,把裏面 QMAKE_PRL_LIBS 中的靜態庫路徑修改成你編譯出來的靜態庫的路徑。

做完以上的,就執行一次 clean ,qmake 重新編譯就OK了,這時候是不是能連接上了啊,哈哈……(這過程的心酸,終於換來了收穫的喜悅……啊啊啊)


下面附上測試的 Demo 代碼

staticTest.pro

#-------------------------------------------------
#
# Project created by QtCreator 2016-01-16T20:55:32
#
#-------------------------------------------------

QT       += core gui sql


greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
QTPLUGIN += qsqlodbc
TEMPLATE = app



SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui


---------------------------------------------------
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlDriver>
#include <QtPlugin>
Q_IMPORT_PLUGIN(QODBCDriverPlugin)


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    qDebug()<<"haha";
    QSqlDatabase qDB = QSqlDatabase::addDatabase("QODBC");
    qDB.setHostName("127.0.0.1");
    qDB.setDatabaseName("Driver={sql server};server=127.0.0.1;database=MyTempDB;");
    qDB.setUserName("sa");
    qDB.setPassword("123456");
    bool IsOpen = qDB.open();
    if(IsOpen)
    {
       qDebug()<<"connect to Database Success.";
    }
    else
    {
        qDebug()<<"Connect failed!";
        QSqlError qerror = qDB.lastError();
        qDebug()<<qerror.text();
    }

    qDebug() << "Available drivers:";

    QStringList drivers = QSqlDatabase::drivers();

    foreach(QString driver, drivers)
    qDebug() << "\t" << driver;

}


*/

*--------------------------------------

** Edit by : 小菜

** Time:     2016-01-19

*--------------------------------------

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章