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; }