C++对Mysql数据库实现增删改查操作+常用API函数解释
本文是在简单学习过SQL语句后,打算使用C++语言对Mysql数据库实现相同功能。因为在项目中数据库的建立,表的创建都是最开始就定好的,可以在MySQL中直接执行SQL语句建立,并且项目过程中很少会对表的结构再做修改,所以自己练习只是实现一些C++对MySQL的简单操作,熟悉在C++中对MySQL操作的流程和方法。后期加入网络通讯自动接收并存储进数据库中。
目录
2.2.5 FreeConnect释放MySQL连接与查询结果集合
一、前言(下载地址)
本文是在简单学习过SQL语句后,打算使用C++语言对Mysql数据库实现相同功能。因为在项目中数据库的建立,表的创建都是最开始就定好的,可以在MySQL中直接执行SQL语句建立,并且项目过程中很少会对表的结构再做修改,所以自己练习只是实现一些C++对MySQL的简单操作,熟悉在C++中对MySQL操作的流程和方法。后期加入网络通讯自动接收并存储进数据库中。
下载地址:
通过API函数对Mysql数据库实现增、删、改、查操作C++实现-C++文档类资源-CSDN下载
二、代码
2.1 MysqlManager.h头文件
#pragma once
#include<iostream>
using namespace std;
#include<mysql.h>
#include<iomanip>
class MysqlManager
{
public:
bool Init(); // 初始化数据库连接
void FreeConnect(); // 释放连接
bool RunSql(const char* sql); // 执行对Mysql的增、删、改sql语句
bool SelectData(const char* sql); // 查询select
void PrintData(); // 打印结果集合,在QueryData()后使用
public:
const char* m_host; // 主机地址
const char* m_username; // 用户名
const char* m_password; // 密码
const char* m_database; // 连接的数据库名称database
unsigned int m_port; // Mysql端口号,默认3306
const char* m_unix_socket; // unix连接标识
unsigned long m_clientflag; // 客户端连接标志
private:
MYSQL* m_Mysql = new MYSQL(); // Mysql连接句柄
MYSQL_RES* m_SelectResult; // 用于存储Mysql查询结果集合
};
2.2 MysqlManager.cpp实现
2.2.1 包含头文件
#include "MysqlManager.h"
2.2.2 Init初始化函数
- 初始化过程中,先使用 mysql_init函数初始化MySQL句柄,之后通过mysql_real_connect函数输入ip,用户名,密码,数据库名称,端口号等进行连接。连接成功后,该MySQL句柄可以对设定的ip数据库进行操作。
bool MysqlManager::Init() {
// Mysql初始化函数,返回Mysql句柄
mysql_init(m_Mysql);
// 连接Mysql数据库,检测是否连接成功,成功返回连接句柄,失败返回 NULL
if (!mysql_real_connect(m_Mysql, m_host, m_username, m_password,
m_database, m_port, m_unix_socket, m_clientflag)) {
return false;
}
// 连接成功
return true;
}
MYSQL *mysql_init(MYSQL *mysql)
- 这个函数用来分配或初始化一个MySQL对象,用于连接MySQL服务端。
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag)
2.2.3 RunSql增、删、改操作
- 成功连接到MySQL数据库后就可以开始执行SQL语句,对数据库进行一些简单操作了,这里将增删改和查的函数分开,因为查询语句后要显示结果,所以分隔开。
bool MysqlManager::RunSql(const char* sql) {
// mysql_query数据库操作函数,传入SQL语句执行。成功返回0
if (mysql_query(m_Mysql, sql))
{
// 输出警告和错误信息给程序的使用者
// cerr错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符
cerr << "Error: " << mysql_error(m_Mysql) << endl;
return false;
}
else
{
cout << "Mysql数据库操作成功!" << endl;
}
return true;
}
int mysql_query(MYSQL *mysql, const char *query)
- 执行由“Null终结的字符串”表示的SQL语句。字符串必须包含1条SQL语句,并且不需要以分号结束。如果查询成功,返回0。如果出现错误,返回非0值。需要注意返回值,成功的时候是0而不是1.
cerr是 一个iostream对象,关联到标准错误,默认情况下,写到cerr的数据是不缓冲的,直接显示到屏幕,每个流插入到cerr都会被立即输出。
2.2.4 SelectData查询select操作
- 执行查询SQL语句和 增、删、改操作区别就在于查询后的输出结果部分,在拿到结果后,对结果的格式输出。
bool MysqlManager::SelectData(const char* sql) {
if (mysql_query(m_Mysql, sql))
{
// 输出警告和错误信息给程序的使用者
// cerr错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符
cerr << "Error: " << mysql_error(m_Mysql) << endl;
return false;
}
else
{
cout << sql << "查询结果如下:" << endl;
}
// 获得结果集
m_SelectResult = mysql_store_result(m_Mysql);
// 显示输出
this->PrintData();
return true;
}
void MysqlManager::PrintData() {
// 如果mysql_fetch_row(m_SelectResult)为空表示没有查询结果
if (mysql_fetch_row(m_SelectResult) == NULL)
{
cout << "Empty set." << endl;
return;
}
// 首先打印表头字段名
MYSQL_FIELD* field = nullptr; // 定义字段列数组
int len = 12; // 定义输出格式最大宽大,不够用空格补齐
// mysql_fetch_field每次返回下一个字段名
while (field = mysql_fetch_field(m_SelectResult)) {
cout << setw(len) << field->name; // 设置输出格式
}
cout << endl;
// 打印字段值,表信息
int num_field = mysql_num_fields(m_SelectResult); // 获取列数
MYSQL_ROW row;
// mysql_fetch_row每次取出一行信息并打印
while (row = mysql_fetch_row(m_SelectResult))
{
for (int i = 0; i < num_field; ++i)
{
if (row[i] == NULL) {
cout << setw(len) << "NULL";
}
else {
cout << setw(len) << row[i];
}
}
cout << endl;
}
}
MYSQL_RES *mysql_store_result(MYSQL *mysql)
- 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result()返回结果集合。mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
- 查询结果集中的列字段信息,也就是表头的相关信息。每次返回一个列的字段信息,每调用一次mysql_fetch_field,会向后移动一个字段。当重新使用查询是,会重新回到第一个字段信息。当指向最后一列后,再次调用返回为NULL。
cout << setw(len)
- 用于调整输出格式,将每列对齐,len表示最大长度,不够时将用空格补齐
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
- 检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。用于查询结果集中的字段值。与前面使用的mysql_fetch_field对应,一个查看字段名信息(表头),一个查看具体字段值。也是每调用一个会返回新的一行的数据。
2.2.5 FreeConnect释放MySQL连接与查询结果集合
- 释放MySQL连接时,需要对查询的数据和MySQL句柄一起释放,释放空间和连接。
void MysqlManager::FreeConnect() {
// 释放存储的查询结果集合
mysql_free_result(m_SelectResult);
// 释放Mysql连接资源
mysql_close(m_Mysql);
}
void mysql_free_result(MYSQL_RES *result)
- 释放结果集。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。释放完成后,不要尝试访问结果集。
void mysql_close(MYSQL *sock)
- 关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。
2.3 main
#include<iostream>
using namespace std;
#include"MysqlManager.h"
int main() {
MysqlManager Mysql; // 初始化一个Mysql管理类对象
Mysql.m_host = "localhost"; // 主机地址
Mysql.m_username = "root"; // 用户名
Mysql.m_password = "123456"; // 密码
Mysql.m_database = "test"; // 连接的数据库名称database
Mysql.m_port = 3306; // Mysql端口号,默认3306
Mysql.m_unix_socket = NULL; // unix连接标识
Mysql.m_clientflag = 0; // 客户端连接标志
// mysql连接
if (!Mysql.Init())
{
return -1;
}
// 增、删、改模板
// const char* sql1 = "此处填入 增、删、改SQL语句,不需要分号结尾";
// Mysql.RunSql(sql1);
// 查询数据测试
//const char* sql4 = "此处查询的SQL语句,不需要分号结尾";
//Mysql.SelectData(sql4);
// 释放mysql资源
Mysql.FreeConnect();
return 0;
}
更多推荐
所有评论(0)