N_QT

QT with MySQL

  1. 项目配置文件, 加入模块 QT += sql

驱动

只需要下载mysql-connector-c-6.1.3-win32.zip./lib/libmysql.dll库文件

和QT5以后的自带编译后的.\5.13.0\mingw73_32\plugins\sqldrivers文件夹下的 qsqlmysql.dllqsqlmysqld.dll

总是 QMYSQL driver not loaded !!!

总TM QMYSQL driver not loaded QSqlDatabase::drivers() return empty!

参考 - https://stackoverflow.com/questions/14362881/qt-mysql-cant-load-plugin-driver-qlibrary-qpluginloader-successfully-loaded

It seems that even if Qt have paths to it’s own folder you need to specify them before loading the drivers.
You can do this by adding those lines:

    QStringList liblist;
    liblist.push_back("c:/Qt/4.8.0/plugins/");
    liblist.push_back("c:/Qt/4.8.0/bin/");
    QCoreApplication::setLibraryPaths(liblist);

原因QT有自己的文件路径,指定lib 加载路径

QStringList liblist;
liblist.push_back("./");//效果 bin和plugins 都是./, 所以需要创建sqldrivers文件夹,或者整个复制..
QCoreApplication::setLibraryPaths(liblist);

其实 用ProcessExplorer 看下 它也总是加载 F:\software\qt5.11.2\5.11.2\mingw53_32\plugins\sqldrivers\qsqlmysql.dll的dll, 把路径改下测试, 本机也不行了; 离谱!

其实不需要下载 mysql-connector-c-6.1.3-win32

同CPU位数的(x86/x64) 的mysql压缩包下的libmysql.dll也能用, 只是不能自动识别, 需要强制加载libmysql; 我k

QApplication::addLibraryPath(".\\");
QLibrary libmysql("libmysql.dll");
libmysql.load();

编译mysql 驱动

  1. 下载MySQL, 其中就包含了,c++需要的lib; ./include头文件, ./lib下的libmysqld.lib 编译 和libmysql.dll 运行库

  2. QT需要下载或者安装时候包括源代码,

cd到QT plugins sql驱动目录 例如: D:\Qt\Qt5.13.0\5.13.0\Src\qtbase\src\plugins\sqldrivers\mysql 用文本编辑器打开mysql.pro, 修改内容如下:

#QMAKE_USE += mysql
QMAKE_LFLAGS +=D:\Qt\Qt5.13.0\5.13.0\Src\qtbase\src\plugins\sqldrivers\mysql\lib\libmysql.dll

修改上一层目录中的qsqldriverbase.pri, 修改内容如下:

 For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include($$shadowed($$PWD)/configure.pri)
  1. 执行

qmake "INCLUDEPATH+=D:\Qt\Qt5.13.0\5.13.0\Src\qtbase\src\plugins\sqldrivers\mysql\include" "LIBS+=D:\Qt\Qt5.13.0\5.13.0\Src\qtbase\src\plugins\sqldrivers\mysql\lib\libmysql.lib" -o Makefile mysql.pro

此时可以正常产生Makefile文件, 继续执行命令

mingw32-make -r -j

至此编译完成, 可以执行mingw32-make install 安装库; 该命令会将刚刚编译生成的两个dll文件拷贝到qt的插件目录中;

参考 mysql mysql-connector-c-6.1.3-win32.zip驱动

使用实例

//部分

database = QSqlDatabase::addDatabase("QMYSQL");
database.setHostName(localhost);
database.setDatabaseName(dbName);
database.setUserName(userName);
database.setPassword(password);
database.setPort(port);
isOpened =  database.open();
 
....
    QSqlQuery*  qQuery = database->createQuery("insert into catch_frame (catch_date, file_name, path, cam_bean_id) values  "
                                     "(:catch_date,:file_name, :path, :cam_bean_id) ");
    if(qQuery== nullptr){
        std::cout<<asName.toStdString()<<" QSqlQuery is nullptr  "<<std::endl;
        return ;
    }
 
  /**
     * @brief createQuery 记得删除指针啊~
     * @param sql
     * @return
     *
     */
QSqlQuery* Database::createQuery(QString sql){
    if(checkConnect()){
        QSqlQuery *query = new QSqlQuery(database);
        query->prepare(sql);
        return query;
    }
    return nullptr;
}
....
 
bool Database::excuteSQL(QString sql){
    if(checkConnect()){
        QSqlQuery query(database);
        return query.exec(sql);
    }
    return false;
}
 
 
 

参考项目