MFC下使用Mysql
mysql mfc 使用
2023-09-27 14:20:05 时间
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了。
2、到mysqlserver目录里得到libmysql.lib文件和include头文件,自己的MFC工程引入即可。
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,然后再切换过去。
bool MySQLServer::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函数,设置下重连。
bool MySQLServer::setReconnect()
{
char reconnect = 1;
mysql_options(&mysqlInstance, MYSQL_OPT_RECONNECT, (char *)&reconnect);
return true;
}
6、对于多线程的查询和写入执行等操作时,一定要加锁操作,否则会有崩溃风险
如写入操作:
//写入数据
bool MySQLServer::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::string temp;
while (NULL != lineData)
{
for (int i = 0; i<field; 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();
return row;
}
7、如果涉及到多线程的频繁查询和写入的话,最好创建多个连接,每个线程操作一个连接,否则也会有崩溃的风险
相关文章
- 【MySQL高级】MySql中常用工具及Mysql 日志
- MySQL数据恢复的九把瑞士军刀
- mysql大数据量分页查询靠后页数的语句写法
- [转]【MySQL】关于时间的查询,比如本月,本年,本季度
- is not allowed to connect to this mysql server
- Linux-011-Centos 使用 yum 安装 mysql 5.6.50
- Spring Boot应用连接数据库MySQL、及一个简单的demo
- IDE连接MySQL报错:Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ property