C++在mysql中一次执行多sql语句并遍历结果集

C++在mysql中一次执行多sql语句并遍历结果集,第1张

1、MySQL 5.1支持在单个查询字符串中指定的多语句的执行。

要想与给定的连接一起使用该功能,打开连接时,必须将标志参数中的CLIENT_MULTI_STATEMENTS选项指定给mysql_real_connect()。

也可以通过调用mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON),为已有的连接设置它。

在默认情况下,mysql_query()和mysql_real_query()仅返回第1个查询的状态,并能使用mysql_more_results()和mysql_next_result()对后续查询的状态进行处理。

多语句功能可与mysql_query()或mysql_real_query()一起使用。

它不能与预处理语句接口一起使用。

按照定义,预处理语句仅能与包含单个语句的字符串一起使用。

2、多sql语句执行测试用表结构(我们使用前面三个字段进行测试):

测试代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
using namespace chrono;

int main()
{
	//1.初始化环境
	MYSQL* mySql = mysql_init(NULL);
	if (mySql == NULL)
	{
		printf("数据库环境初始化失败!\n");
		return -1;
	}

	//Connect to server with option CLIENT_MULTI_STATEMENTS
	mySql = mysql_real_connect(mySql, "localhost", "root", "root", "zzc", 3306, NULL, CLIENT_MULTI_STATEMENTS);
	if (mySql == NULL)
	{
		printf("数据库连接失败!\n");
		return -1;
	}

	mysql_set_character_set(mySql, "gbk");

	int status = mysql_query(mySql, "truncate table student;\
	insert student(id, name, time) values(1001, '张三', '2022-04-15 11:05:33');\
	insert student(id, name, time) values(1002, 'lisi', '2022-04-15 11:06:22');\
	select id, name, time from student;\
	select id, name from student where id = 1001");

	do
	{
		MYSQL_RES * result = NULL;
		result = mysql_store_result(mySql);
		if (result)
		{
			//循环获取结果集每一行数据数据
			MYSQL_ROW m_row = nullptr;
			//获取结果集字段总数
			int fieldCount = mysql_num_fields(result);
			//获取结果集一行数据的字段信息
			MYSQL_FIELD *fields = mysql_fetch_fields(result);

			printf("本次结果集中共 %lld 行数据:\n", mysql_num_rows(result)); 
			while (m_row = mysql_fetch_row(result))
			{
				for (int i = 0; i < fieldCount; ++i)
				{
					if (!strcmp(fields[i].name, "name"))
					{
						char* val = m_row[i];
						unsigned long length = mysql_fetch_lengths(result)[i];
						if (val)
						{
							cout << string(val, length) << "\t";
						}
					}
					else if (!strcmp(fields[i].name, "time"))
					{
						char* val = m_row[i];
						unsigned long length = mysql_fetch_lengths(result)[i];
						if (val)
						{
							cout << string(val, length) << "\t";
						}
					}
					else if (!strcmp(fields[i].name, "id"))
					{
						int val = atoi(m_row[i]);
						cout << val << "\t";
					}
				}
				cout << endl;
			}

			mysql_free_result(result);
		}
		else
		{
			//调用mysql_field_count()来判定mysql_store_result()是否应生成非空结果集
			if (0 == mysql_field_count(mySql))
			{
				printf("%lld 行被影响\n", mysql_affected_rows(mySql));
			}
			else
			{
				printf("发生错误:%s\n", mysql_error(mySql));
			}
		}
		
	} while (!mysql_next_result(mySql));

	//释放资源-数据库
	if (mySql)
	{
		mysql_close(mySql);
	}
	return 0;
}

 测试输出结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存