• 如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件QTPLUGIN+= qsqlodbc)


    前段时间由于工作的关系,需要编写一个将数据插入到 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,
    (目录: %Qtsrcqt-everywhere-opensource-src-5.5.1qtbasesrcpluginssqldriversodbc)。
    
    另外,还要把和 .a库一起编译出来的两个 .prl 文件放到 %Qtlib 目录下,并编辑这两个文件,把里面 QMAKE_PRL_LIBS 中的静态库路径修改成你编译出来的静态库的路径。
    
    做完以上的,就执行一次 clean ,qmake 重新编译就OK了,这时候是不是能连接上了啊,哈哈……(这过程的心酸,终于换来了收获的喜悦……啊啊啊)
    
    
    下面附上测试的 Demo 代码
    
    staticTest.pro
    [cpp] view plain copy
     
    1. #-------------------------------------------------  
    2. #  
    3. # Project created by QtCreator 2016-01-16T20:55:32  
    4. #  
    5. #-------------------------------------------------  
    6.   
    7. QT       += core gui sql  
    8.   
    9.   
    10. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  
    11. QTPLUGIN += qsqlodbc  
    12. TEMPLATE = app  
    13.   
    14.   
    15.   
    16. SOURCES += main.cpp  
    17.         mainwindow.cpp  
    18.   
    19. HEADERS  += mainwindow.h  
    20.   
    21. FORMS    += mainwindow.ui  


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

    [cpp] view plain copy
     
    1. #include "mainwindow.h"  
    2. #include "ui_mainwindow.h"  
    3. #include <QDebug>  
    4. #include <QtSql/QSqlDatabase>  
    5. #include <QtSql/QSqlError>  
    6. #include <QtSql/QSqlDriver>  
    7. #include <QtPlugin>  
    8. Q_IMPORT_PLUGIN(QODBCDriverPlugin)  
    9.   
    10.   
    11. MainWindow::MainWindow(QWidget *parent) :  
    12.     QMainWindow(parent),  
    13.     ui(new Ui::MainWindow)  
    14. {  
    15.     ui->setupUi(this);  
    16. }  
    17.   
    18. MainWindow::~MainWindow()  
    19. {  
    20.     delete ui;  
    21. }  
    22.   
    23. void MainWindow::on_pushButton_clicked()  
    24. {  
    25.     qDebug()<<"haha";  
    26.     QSqlDatabase qDB = QSqlDatabase::addDatabase("QODBC");  
    27.     qDB.setHostName("127.0.0.1");  
    28.     qDB.setDatabaseName("Driver={sql server};server=127.0.0.1;database=MyTempDB;");  
    29.     qDB.setUserName("sa");  
    30.     qDB.setPassword("123456");  
    31.     bool IsOpen = qDB.open();  
    32.     if(IsOpen)  
    33.     {  
    34.        qDebug()<<"connect to Database Success.";  
    35.     }  
    36.     else  
    37.     {  
    38.         qDebug()<<"Connect failed!";  
    39.         QSqlError qerror = qDB.lastError();  
    40.         qDebug()<<qerror.text();  
    41.     }  
    42.   
    43.     qDebug() << "Available drivers:";  
    44.   
    45.     QStringList drivers = QSqlDatabase::drivers();  
    46.   
    47.     foreach(QString driver, drivers)  
    48.     qDebug() << " " << driver;  
    49.   
    50. }  


    */

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

    ** Edit by : 小菜

    ** Time:     2016-01-19

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

    */

    http://blog.csdn.net/humadivinity/article/details/50545100

  • 相关阅读:
    为了实现一个函数 clone ,可以对 JavaScript 中 5 种主要的数据类型 (包括 Number、 St「ing 、 Object、 A「「ay、 Boolean )进行值(深)复制。
    说说你对语义化的理解
    vue 根据字符串的长度控制显示的字数超出显示省略号
    加密号码将中间四位改为*
    前端项目部署错误:npm ERR! notarget No matching version found for event-stream@3.3.6
    npm报错:A complete log of this run can be fund in:........
    nrm插件的安装插件和使用
    Vue过渡搭配Velocity.js动画的基本使用
    Asp.Net Core&钉钉开发系列
    KnockoutJS知识规整目录
  • 原文地址:https://www.cnblogs.com/findumars/p/5621297.html
Copyright © 2020-2023  润新知