前段时间由于工作的关系,需要编写一个将数据插入到 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/plugins的sqldrivers文件夹下,你猜怎么着,根本就没有这个文件夹!
好吧,既然没有,那我就给你建立一个,但还是没什么鬼用……
终于,皇天不负有心人,我了解到,我现在使用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
*--------------------------------------
*/