zoukankan      html  css  js  c++  java
  • 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了。

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

    高山流水,海纳百川!
  • 相关阅读:
    使用jmeter进行接口测试
    jenkins默认插件
    【机器学习】关于PCA 昕
    雲瑞文件直链分享软件
    FOB离岸价
    【数据分享】某地区1959~2019年60年降雨量时间序列数据
    【数据分享】银行客户流失Bank Customer Churn数据
    【数据分享】糖尿病患者研究数据集
    【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
    C# Speech
  • 原文地址:https://www.cnblogs.com/ahcc08/p/11337945.html
Copyright © 2011-2022 走看看