QT with MySQL
- 项目配置文件, 加入模块
QT += sql
驱动
只需要下载mysql-connector-c-6.1.3-win32.zip的 ./lib/libmysql.dll库文件
和QT5以后的自带编译后的.\5.13.0\mingw73_32\plugins\sqldrivers文件夹下的
qsqlmysql.dll和qsqlmysqld.dll
总是 QMYSQL driver not loaded !!!
总TM QMYSQL driver not loaded 和 QSqlDatabase::drivers() return empty!
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 驱动
-
下载MySQL, 其中就包含了,c++需要的lib;
./include头文件,./lib下的libmysqld.lib编译 和libmysql.dll运行库 -
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)- 执行
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;
}