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有如下几个步骤

  1. 通过调用 mysql_library_init()来初始化MySQL库。
  2. 通过调用 mysql_init()来初始化一个连接句柄。
  3. 通过调用mysql_real_connect()来连接服务器。
  4. 使用SQL语句操作数据库,并处理这些结果。
  5. 通过调用mysql_close()来关闭MySQL服务器的连接。
  6. 通过调用 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 ( == mysql_query(&mysqlInstance, queryStr.c_str()))
{
queryStr = "use ";
queryStr += dbname;
if ( == mysql_query(&mysqlInstance, queryStr.c_str()))
{
return true;
} }
errorIntoMySQL();
return false;
}

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

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

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

bool MySQLServer::setReconnect()
{
char reconnect = ;
mysql_options(&mysqlInstance, MYSQL_OPT_RECONNECT, (char *)&reconnect);
return true;
}

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

如写入操作:

//写入数据
bool MySQLServer::mysql_execsql(LPCTSTR queryStr)
{
m_DataBaseMutex.lock();
if ( == 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 ( != mysql_query(&mysqlInstance, queryStr))
{
errorIntoMySQL();
m_DataBaseMutex.unlock();
return -;
} 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 = ;
std::string temp;
while (NULL != lineData)
{
for (int i = ; 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、如果涉及到多线程的频繁查询和写入的话,最好创建多个连接,每个线程操作一个连接,否则也会有崩溃的风险

MFC下使用Mysql的更多相关文章

  1. 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库

    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所 ...

  2. Linux学习之CentOS(二十)--CentOS6.4下修改MySQL编码方法

    但是当我们在试图对数据库中的数据进行备份或者将sql文件导入到我们的数据库时可能就会碰到编码的问题,在windows下安装mysql时我们可以在安装的时候就选择好整个数据库的编码方式(通常设置成utf ...

  3. Linux下安装 MySQL

    Ubuntu环境 使用二进制安装包安装,相对简单绿色 1.到官网下载二进制压缩包http://dev.mysql.com/downloads/mysql/ 2.选择需要的版本 目前最新为5.7.之后选 ...

  4. Linux下修改Mysql的用户(root)的密码

    修改的用户都以root为列.一.拥有原来的myql的root的密码: 方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password " ...

  5. Ubuntu下的MySQL安装

    <1>安装mysql-server sudo apt-get update sudo apt-get install mysql-server mysql-client <2> ...

  6. Ubuntu 下安装 Mysql

    这里讲用Ubuntu下安装MySql ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server   2. apt-get ...

  7. ubuntu16.04.1下的mysql修改默认编码

    在Ubuntu 下配置 Mysql 的字符编码.安装完 Mysql 后,系统默认的字符编码是 latin1 ,输入的是中文,可是输出却是一堆乱码.现在要做的就是把 Mysql的默认字符编码设置为支持中 ...

  8. ubuntu 下安装mysql,以及配置远程登录

    安装MysQL 在Ubuntu14.04下安装MySQL比较简单,只需下面这条命令就行了: 1.输入 sudo apt-get install mysql-server 2.继续执行后,需要设定MyS ...

  9. MFC下OpenGL入门(可以用)

    MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...

随机推荐

  1. python自学Day01(自学书籍python编程从入门到实践)

    第二章 变量和简单的数据类型 2.1 运行.py文件 解释器会读取整个程序,确定其中的每个单词含义并且通过解释器传输给电脑. 编辑.py文件,读取文件中的程序,确定文件中单词(代码)的含义,解释后执行 ...

  2. java中存储机制堆栈。

    一.java的六种存储地址及解释 1) 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不 ...

  3. 致初学者(三): HDU 2033~ 2043题解

    下面继续给出HDU 2033~2043的AC程序,供大家参考.2033~2043这10道题就被归结为“ACM程序设计期末考试(2006/06/07) ”和“2005实验班短学期考试 ”. HDU 20 ...

  4. 七个开源的 Spring Boot 前后端分离项目,一定要收藏!

    前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了.即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开发,以免在公司干了两三年 ...

  5. 弄懂Java为何只有值传递

    最近有同学问我关于Java中值传递与引用传递的问题,在此小结一下 值传递是指在函数调用时将实参内容复制一份传递给形参,这样在函数中改变该参数不会对原参数产生影响. 引用传递是指将对象地址的引用传递给该 ...

  6. 54 (OC)* 网络七层架构

    一:TCP/IP协议 二:七层协议 1:物理层 物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境.  1.1:传输媒体和互连设备        物理层的媒体包括架空明线.平衡 ...

  7. moment实现计算两个时间的差值

    var m1 = moment('2018-08-14 11:00:00'), m2 = moment('2018-08-14 12:10:00'); console.log(m1)console.l ...

  8. SpringBoot起飞系列-配置文件(三)

    一.SpringBoot中的配置文件 说起到配置文件,大家并不陌生,早在springboot之前,我们用ssh,ssm框架开发的时候整天都要接触配置文件,那时候的配置文件基本上都是.propertie ...

  9. java Mail如何发送邮件

    1.应用场景:在系统需要发送与用户相关的消息时,而用户不在线,可以采取发送邮件的方式,使用户了解最新的系统情况 或者发送验证码等验证场景 2.实验环境 主要使用mail.jar和activation. ...

  10. Spring boot集成Rabbit MQ使用初体验

    Spring boot集成Rabbit MQ使用初体验 1.rabbit mq基本特性 首先介绍一下rabbitMQ的几个特性 Asynchronous Messaging Supports mult ...