C++实现对MySQL数据库的连接,以及增删改查

安装好MySQL,建好数据表的前提下。

如果只是想简单实现添加数据或者其他一个操作数据,可以参考另一篇博客。
https://www.cnblogs.com/ming-4/p/11544514.html

先定义一个数据库管理的cpp文件和头文件。

MySQLManager.h 文件:

/*MySQLManager.h 文件:
    文件名:        MySQLManager.h
    内  容:        MySQL连接数据库管理类        
    创建日期:    2016年10月18日
    创建人:        AceTan
*/

#pragma once

// 网络通信头文件
#include <WinSock.h>

// 引入mysql头文件(比较好的做法是把文件夹拷到工程目录,也可以在vc目录里面设置)
#include "include/mysql.h"

#include <Windows.h>

// 包含附加依赖项,也可以在工程--属性里面设置
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "libmysql.lib")

// 连接数据库的一些必要信息
struct ConnectionInfo
{
    const char* host;            // 主机地址
    const char* user;            // 用户名
    const char* password;        // 密码
    const char*    database;        // 数据库名
    unsigned int port;            // 端口号
    const char*    unix_socket;    // unix连接标识
    unsigned long clientflag;    // 客户端连接标志

    // 构造函数,设置一些默认值
    ConnectionInfo() :
        host("127.0.0.1"),
        port(3306),
        unix_socket(NULL),
        clientflag(0)
    {

    }
};

class MySQLManager
{
public:

    // 连接数据库
    bool Init(ConnectionInfo& info);

    // 释放连接
    bool FreeConnect();

    // 增加数据
    // bool InsertData(const char* sql);

    // 删除数据
    // bool DeleteData(const char* sql);

    // 更新数据
    // bool UpdateData(const char* sql);

    // 执行sql语句, 包括增加、删除、更新数据
    bool ExecuteSql(const char* sql);

    // 查询数据
    MYSQL_RES* QueryData(const char* sql);

    // 打印结果集
    void PrintQueryRes();

private:
    MYSQL m_mysql;                // mysql连接
    MYSQL_RES* m_res;            // 查询结果集

};

MySQLManager.cpp 文件:

#include <iostream>
#include <stdio.h>
using namespace std;

// 连接数据库
bool MySQLManager::Init(ConnectionInfo& info)
{
    // 初始化mysql,连接mysql,数据库
    mysql_init(&m_mysql);

    // 连接失败
    if (!(mysql_real_connect(&m_mysql, info.host, info.user, info.password, info.database, info.port, info.unix_socket, info.clientflag)))
    {
        return false;
    }

    return true;
}

// 释放连接
bool MySQLManager::FreeConnect()
{
    //释放资源
    mysql_free_result(m_res);
    mysql_close(&m_mysql);

    return false;
}

// 执行sql语句, 包括增加、删除、更新数据
bool MySQLManager::ExecuteSql(const char * sql)
{
    if (mysql_query(&m_mysql, sql))
    {
        // 打错误log,这里直接显示到控制台
        cerr << "执行sql语句失败,错误信息为: " << mysql_error(&m_mysql) << endl;
        return false;
    }
    else
    {
        cout << "执行sql语句成功!" << endl;
    }

    return true;
}

// 查询数据
MYSQL_RES* MySQLManager::QueryData(const char* sql)
{
    if (mysql_query(&m_mysql, sql))
    {
        // 打错误log,这里直接显示到控制台
        cerr << "查询语句执行失败,错误信息为: " << mysql_error(&m_mysql) << endl;
        return nullptr;
    }
    else
    {
        cout << "查询语句执行成功!" << endl;
    }

    // 存储查询结果
    m_res = mysql_store_result(&m_mysql);

    return m_res;
}

// 遍历结果集
void MySQLManager::PrintQueryRes()
{
    if (nullptr == m_res || NULL == m_res)
    {
        return;
    }

    // 获取行数
    // unsigned int rows = mysql_affected_rows(m_mysql);

    // 字段列数组
    MYSQL_FIELD* field = nullptr;
    //存字段名二维数组
    char fieldName[64][32];  

    // 获取字段名
    for (int i = 0; field = mysql_fetch_field(m_res); ++i)
    {
        strcpy_s(fieldName[i], field->name);
    }

    // 获取列数
    int columns = mysql_num_fields(m_res);
    for (int i = 0; i < columns; ++i)
    {
        // 使用C语言的printf格式化更方便一点
        printf("%10s\t", fieldName[i]);
    }
    cout << endl;

    MYSQL_ROW row;
    while (row = mysql_fetch_row(m_res))
    {
        for (int i = 0; i < columns; ++i)
        {
            printf("%10s\t", row[i]);
        }
            
        cout << endl;
    }

}

main函数:

#include <iostream>
#include "MySQLManager.h"

using namespace std;

int main()
{
    MySQLManager mysql;
    ConnectionInfo info;
    // 填充ConnectionInfo这个结构体,项目中一般从配置文件这读取
    info.user = "root";
    info.password = "your_password";
    info.host = "localhost";
    info.port = 3306;
    info.database = "test";
    info.unix_socket = NULL;
    info.clientflag = 0;

    // mysql连接
    if (!mysql.Init(info))
    {
        return -1;
    }

    // 增加数据测试
    const char* sql1 = "insert into user values (NULL, 'Ada', 'password')";
    mysql.ExecuteSql(sql1);

    // 删除数据测试
    const char* sql2 = "delete from user where name = 'AceTan'";
    mysql.ExecuteSql(sql2);

    // 修改数据测试
    const char* sql3 = "update user set password='update_password' where name = 'Ada'";
    mysql.ExecuteSql(sql3);

    // 查询数据测试
    const char* sql4 = "select * from user";
    mysql.QueryData(sql4);
    mysql.PrintQueryRes();

    // 释放mysql资源
    mysql.FreeConnect();

    return 0;
}
posted @ 2019-09-18 19:10  小大大小  阅读(11207)  评论(0编辑  收藏  举报