zoukankan      html  css  js  c++  java
  • 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	", fieldName[i]);
        }
        cout << endl;
    
        MYSQL_ROW row;
        while (row = mysql_fetch_row(m_res))
        {
            for (int i = 0; i < columns; ++i)
            {
                printf("%10s	", 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;
    }
  • 相关阅读:
    qt 问题及处理
    windows 依赖查看
    java基础知识
    Linux 相关
    OutLook中添加Exchange失败问题
    开源协议简介
    grail开发环境的搭建
    node+mongodb+WP构建的移动社交应用源码 分享
    INotifyPropertyChanged接口的详细说明
    WP8.1开发:后台任务详解(求推荐)
  • 原文地址:https://www.cnblogs.com/ming-4/p/11544566.html
Copyright © 2011-2022 走看看