一、封装一个mysql的模块
建立一个mysql.pri
HEADERS += \
$$PWD/CMySql.h
SOURCES += \
$$PWD/CMySql.cpp
INCLUDEPATH+="C:\Program Files (x86)\MySQL\MySQL Server 5.7\include"
LIBS+="C:\Program Files (x86)\MySQL\MySQL Server 5.7\lib\libmysql.lib"
INCLUDEPATH 存放的是Mysql的系统安装路径中mysql.h所在的目录
LIBS 存放的是Mysql的引入库文件
然后将libmysql.dll 放入C:/windows/System32 下
CMysql.h
#pragma once
#include <mysql.h>
//#include <WinSock2.h>
//#pragma comment(lib,"../mysql/libmysql.lib")
//
#include <list>
#include <string>
using namespace std;
class CMySql
{
public:
CMySql(void);
~CMySql(void);
public: //ip , 用户名, 密码 , 数据库
bool ConnectMySql(const char *host,const char *user,const char *pass,const char *db);
void DisConnect();
bool SelectMySql(const char* szSql,int nColumn,list<string>& lstStr);
//更新:删除、插入、修改
bool UpdateMySql(const char* szSql);
private:
MYSQL *sock;
MYSQL_RES *results;
MYSQL_ROW record;
};
CMysql.cpp
#include "CMySql.h"
CMySql::CMySql(void)
{
/*这个函数用来分配或者初始化一个MYSQL对象,用于连接mysql服务端。
如果你传入的参数是NULL指针,它将自动为你分配一个MYSQL对象,
如果这个MYSQL对象是它自动分配的,那么在调用mysql_close的时候,会释放这个对象*/
sock = new MYSQL;
mysql_init(sock );
mysql_set_character_set(sock,"utf8"); //gb2312 中华人民共和国简体字标准
}
CMySql::~CMySql(void)
{
if(sock)
{
delete sock;
sock = NULL;
}
}
void CMySql::DisConnect()
{
mysql_close(sock);
}
bool CMySql::ConnectMySql(const char *host,const char *user,const char *pass,const char *db)
{
//localhost 127.0.0.1
if (!mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0))
{
//连接错误
return false;
}
return true;
}
bool CMySql::SelectMySql(const char* szSql,int nColumn,list<string>& lstStr)
{
//mysql_query() 函数用于向 MySQL 发送并执行 SQL 语句
if(mysql_query(sock,szSql))return false;
/*·mysql_store_result 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等)
返回值:
. CR_COMMANDS_OUT_OF_SYNC 以不恰当的顺序执行了命令。
· CR_OUT_OF_MEMORY 内存溢出。
· CR_SERVER_GONE_ERROR MySQL服务器不可用。
· CR_SERVER_LOST 在查询过程中,与服务器的连接丢失。
· CR_UNKNOWN_ERROR 出现未知错误。*/
results=mysql_store_result(sock);
if(NULL == results)return false;
//获取第一行
while (record = mysql_fetch_row(results))
{
//遍历列
for(int i = 0;i < nColumn;i++)
{
if(NULL == record[i])
{
record[i] = (char*)"null";
}
lstStr.push_back(record[i]);
}
}
return true;
}
bool CMySql::UpdateMySql(const char* szSql)
{
if(!szSql)return false;
if(mysql_query(sock,szSql))return false;
return true;
}
二、测试使用
Qt的pro 文件
QT = core
CONFIG += c++17 cmdline
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
include(./mysql/mysql.pri)
main.cpp
#include <QCoreApplication>
#include "mysql/CMySql.h"
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CMySql sql; //ip, 用户名, 密码, 数据库
if(sql.ConnectMySql("localhost","root","123456","0814test")){
qDebug()<<"connect sql success";
char szsql[100] = "select snum,sname,sage from student";
list<string> lststr;
sql.SelectMySql(szsql,3,lststr);
while(lststr.size() >0){
string strNum = lststr.front();
lststr.pop_front();
string strName = lststr.front();
lststr.pop_front();
string strAge = lststr.front();
lststr.pop_front();
qDebug()<<strNum.c_str()<<":"<<strName.c_str()<<":"<<strAge.c_str();
}
// char szsql[100] = "insert into student(snum,sname) values(12,'test');";
// if(sql.UpdateMySql(szsql)){
// qDebug()<<"insert sql success";
// }else{
// qDebug()<<"insert sql err";
// }
}
else
qDebug()<<"connect sql err";
return a.exec();
}