❤️【c++链接mysql系列教程1】MySQL 连接流程与MySQL API简介(附增删改查简单实现)❤️

一、c++ 链接 MySQL 流程

详细流程如下图:
在这里插入图片描述

二、MySQL API

1、常用API数据结构

结构名解析
MYSQL此结构表示一个数据库连接的处理程序。它用于几乎所有的 MySQL 函数。不要试图复制MYSQL结构。无法保证此类副本可用。
MYSQL_RES此结构表示返回行 ( SELECT, SHOW, DESCRIBE, EXPLAIN)的查询结果。从查询返回的信息称为结果集。
MYSQL_ROW这是一行数据的类型安全表示。它目前被实现为一个计数字节字符串数组。(如果字段值可能包含二进制数据,则不能将它们视为以空字符结尾的字符串,因为此类值在内部可能包含空字节。)通过调用 mysql_fetch_row()获取。
MYSQL_FIELD此结构包含元数据:有关字段的信息,例如字段的名称、类型和大小。您可以MYSQL_FIELD通过mysql_fetch_field() 重复调用来获取每个字段的结构。字段值不是这个结构的一部分;它们包含在一个MYSQL_ROW结构中。

2、常用API函数

mysql_init()

描述:
分配或初始化适合mysql_real_connect()的MYSQL对象。如果mysql是一个NULL指针,函数将分配、初始化并返回一个新对象。否则,初始化该对象并返回该对象的地址。如果mysql_init()分配了一个新对象,当调用mysql_close()关闭连接时,它将被释放。

函数声明:

MYSQL *
mysql_init(MYSQL *mysql);

返回值:
成功返回一个初始化的MYSQL处理程序;如果没有足够的内存来分配新对象,则为NULL。

举例:

MYSQL *mysql;
mysql_init(mysql);

mysql_real_connect()

描述:
mysql_real_connect()尝试建立一个连接到运行在主机上的MySQL服务器。客户端程序在执行任何其他需要有效MYSQL连接处理程序结构的API函数之前,必须成功连接到服务器。

函数声明:

MYSQL *
mysql_real_connect(MYSQL *mysql,						//初始化的数据库
                   const char *host,					//主机IP
                   const char *user,					//用户名
                   const char *passwd,					//用户密码
                   const char *db,						//数据库名称
                   unsigned int port,					//端口号(3306)
                   //如果unix_socket不是 NULL,则字符串指定要使用的套接字或命名管道
                   const char *unix_socket,			
                   //client_flag通常为 0
                   unsigned long client_flag);			

返回值:
如果连接成功,则为一个MYSQL*连接处理程序;如果连接不成功,则为NULL。对于成功的连接,返回值与第一个参数的值相同。

举例:

MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",3306,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

mysql_query()

描述:
执行SQL语句。通常情况下,字符串必须由一条没有分号的SQL语句组成。

mysql_query()不能用于包含二进制数据的语句。

函数说明:

int
mysql_query(MYSQL *mysql,			//MYSQL 对象指针
            const char *stmt_str);	//sql语句

返回值:
成功返回0,报错时返回非0。

mysql_store_result()

描述:
在调用mysql_real_query()或mysql_query()之后,对于成功生成结果集(SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE,等等)的每条语句,必须调用mysql_store_result()或mysql_use_result()。在处理完结果集之后,还必须调用mysql_free_result()。

对于其他语句,你不需要调用mysql_store_result()或mysql_use_result(),但是如果你在所有情况下调用mysql_store_result(),它不会造成任何损害或导致任何显著的性能下降。您可以通过检查mysql_store_result()是否返回一个非零值(稍后详细介绍)来检测语句是否有结果集。

要确定语句是否返回结果集,调用mysql_field_count()。参见第5.4.23节,“mysql_field_count()”。

mysql_store_result()将查询的整个结果读取给客户端,分配一个MYSQL_RES结构,并将结果放入这个结构中。
mysql_store_result()如果语句没有返回结果集(例如,如果是一个INSERT语句),或者发生了错误,读取结果集失败,则返回NULL。

如果没有返回行,则返回空结果集。(空结果集不同于作为返回值的空指针。)

在调用mysql_store_result()并得到一个不是空指针的结果之后,可以调用mysql_num_rows()来找出结果集中有多少行。

函数声明:

MYSQL_RES *
mysql_store_result(MYSQL *mysql);	

返回值:
指向带有结果的MYSQL_RES结果结构的指针。如果语句没有返回结果集或发生错误,则为NULL。要确定是否发生错误,请检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非零,或mysql_field_count()是否返回零。

mysql_close()

描述:
关闭先前打开的连接。如果处理程序是由mysql_init()或mysql_connect()自动分配的,Mysql_close()也会释放mysql所指向的连接处理程序。关闭处理程序后不要使用它。

函数声明:

void
mysql_close(MYSQL *mysql);		

返回值:

三、常用的mysql增删改查操作实例

1、在数据库中添加数据

int main()
{
	......
	
	// 增加数据测试
	const char* sql1 = "insert into user values (NULL, 'song', '99')";
	mysql.ExecuteSql(sql1);

	......
	return 0;
}

// 执行sql语句, 包括增加、删除、更新数据
bool MySQLManager::ExecuteSql(const char * sql)
{
	if (mysql_query(&m_mysql, sql))
	{
		std::cout << "执行sql语句失败,错误信息为: " << mysql_error(&m_mysql) << endl;
		return false;
	}
	else
	{
		std::cout << "执行sql语句成功!" << endl;
	}

	return true;
}

2、在数据库中删除数据

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

	......
	return 0;
}

3、在数据库中修改数据

int main()
{
	......
	
	// 修改数据测试
	const char* sql3 = "update user set grade='22' where name = 'wu'";
	mysql.ExecuteSql(sql3);

	......
	return 0;
}

4、在数据库中查询数据

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

	......
	return 0;
}

// 查询数据
MYSQL_RES* MySQLManager::QueryData(const char* sql)
{
	if (mysql_query(&m_mysql, sql))
	{
		std::cout << "查询语句执行失败,错误信息为: " << mysql_error(&m_mysql) << endl;
		return nullptr;
	}
	else
	{
		std::cout << "查询语句执行成功!" << endl;
	}
	// 存储查询结果
	m_res = mysql_store_result(&m_mysql);
	return m_res;
}

5、打印数据库查询结果

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

	// 字段列数组
	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)
	{
		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;
	}
}

-----------------------------------------------------------------------------------------------------------------------------------------------------
如果本文对你有所帮助,请不要忘了点赞、收藏哦!!!
-----------------------------------------------------------------------------------------------------------------------------------------------------

参考文档

更多详细内容请查阅官方文档,网址如下:
MySQL官方网站:https://dev.mysql.com/doc/c-api/8.0/en/mysql-close.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值