mysql mfc 源码_MFC下使用Mysql

MFC工程需要使用Mysql数据库中遇到的问题记录下。

1、首先去官网下载下Mysql安装包,安装下Mysql。

我在这边下载的是mysql-installer-community-5.7.16.0.msi,因为是默认安装,所以会根据系统是64位还是32位,来安装64位的mysql或者32位的mysql。

我的操作系统是64位的,所以安装后的mysql也是64位的,而我的MFC工程是32位的,所以安装目录得到的libmysql.lib文件使用。

解决方法:把64位的mysqlserver卸载,然后安装32位的mysqlserver。直接remove就行,卸载完,同样在这个界面Add就行。因为我的电脑已经做过这个操作了,所以显示的mysqlserver已经x86了。

627632-20190812091537194-1906479624.png

2、到mysqlserver目录里得到libmysql.lib文件和include头文件,自己的MFC工程引入即可。

627632-20190812091803132-776189527.png

627632-20190812091909514-1615598291.png

3、使用MySQL有如下几个步骤

通过调用 mysql_library_init()来初始化MySQL库。

通过调用 mysql_init()来初始化一个连接句柄。

通过调用mysql_real_connect()来连接服务器。

使用SQL语句操作数据库,并处理这些结果。

通过调用mysql_close()来关闭MySQL服务器的连接。

通过调用 mysql_library_end()来终止使用MySQL库。

4、假如我们使用的database,是需要自己先创建,应该先用mysql_real_connect连接什么。

我们可以先连接默认的database:mysql,然后去创建我们需要的database,然后再切换过去。

boolMySQLServer::createDatabase(LPCTSTR dbname)

{

std::string queryStr = "create database if not exists";

queryStr+=dbname;

queryStr+= "DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;";if (0 == mysql_query(&mysqlInstance, queryStr.c_str()))

{

queryStr= "use";

queryStr+=dbname;if (0 == mysql_query(&mysqlInstance, queryStr.c_str()))

{return true;

}

}

errorIntoMySQL();return false;

}

5、mysql断开后如何自动连接?

mysql默认的是连接时长是8小时,如果8小时内,没有数据进行交互,就会断开连接,所以我们希望断开后,能够自动重连。

在database连接之后,调用下面的setReconnect函数,设置下重连。

boolMySQLServer::setReconnect()

{char reconnect = 1;

mysql_options(&mysqlInstance, MYSQL_OPT_RECONNECT, (char *)&reconnect);return true;

}

6、对于多线程的查询和写入执行等操作时,一定要加锁操作,否则会有崩溃风险

如写入操作:

//写入数据

boolMySQLServer::mysql_execsql(LPCTSTR queryStr)

{

m_DataBaseMutex.lock();if (0 == mysql_query(&mysqlInstance, queryStr))

{

m_DataBaseMutex.unlock();return true;

}else{

errorIntoMySQL();

}

m_DataBaseMutex.unlock();return false;

}

查询操作:

//读取数据

int MySQLServer::readDatafromDB(LPCTSTR queryStr, Json::Value &result)

{

m_DataBaseMutex.lock();if (0 != mysql_query(&mysqlInstance, queryStr))

{

errorIntoMySQL();

m_DataBaseMutex.unlock();return -1;

}

MYSQL_RES*sqlResult =NULL;

sqlResult= mysql_store_result(&mysqlInstance);int row = (int)mysql_num_rows(sqlResult);int field = (int)mysql_num_fields(sqlResult);

MYSQL_FIELD* fieldArray =mysql_fetch_field(sqlResult);

MYSQL_ROW lineData=NULL;

lineData=mysql_fetch_row(sqlResult);int row_no = 0;

std::stringtemp;while (NULL !=lineData)

{for (int i = 0; i

{if(lineData[i])

{

temp=lineData[i];

result[row_no][fieldArray[i].name]=temp;

}else{

temp= "";

result[row_no][fieldArray[i].name]=temp;

}

}

row_no++;

lineData=mysql_fetch_row(sqlResult);

}

mysql_free_result(sqlResult);

m_DataBaseMutex.unlock();returnrow;

}

7、如果涉及到多线程的频繁查询和写入的话,最好创建多个连接,每个线程操作一个连接,否则也会有崩溃的风险

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值