首页 > 数据库 >C++使用MySQL官方的C API访问MySQL数据库

C++使用MySQL官方的C API访问MySQL数据库

时间:2024-10-15 19:53:35浏览次数:3  
标签:error int printf stmt buffer API C++ mysql MySQL

这篇文章是一个简单的C++使用MySQL官方的C API访问MySQL数据库的代码示例。

//main.h
#ifndef _H_
#define _H_

#include<stdio.h>
#include<Windows.h>
#include<mysql.h>

#pragma comment(lib,"libmysql.lib")

#define insert_prepare "insert into test_tb value(? , ? , ?)"

//菜单函数
void f_printmenu(void);
//新建函数
int f_insert(MYSQL* mysql);
//删除函数
int f_delete(MYSQL* mysql);
//修改函数
int f_modify(MYSQL* mysql);
//查询函数
int f_select(MYSQL* mysql);

#endif

//数据表包含商品编号、名称、价格

//main.cpp
#include"main.h"

int main()
{
#if 1
	enum { _insert = 1, _delete, _modify, _select };
#else
	const int _insert = 1, _delete = 2, _modify = 3, _select = 4;
#endif
	int choose = 0;
	MYSQL* mysql;//mysql句柄

	//初始化mysql句柄
	mysql = mysql_init(NULL);
	if (mysql == NULL)
	{
		printf("mysql_init error\n");
		system("pause");
		return -1;
	}
	printf("mysql_init ok\n");

	//连接mysql数据库
	mysql = mysql_real_connect(mysql, "localhost", "xxx", "xxx", "test_db", 3306, NULL, 0);//返回值和参数mysql是相同值
	if (mysql == NULL)
	{
		printf("mysql_real_connect error\n");
		system("pause");
		return -1;
	}
	printf("mysql_real_connect ok");

	//获取当前进程/会话使用的字符集
	printf("before,字符集:%s\n", mysql_character_set_name(mysql));

	/*设置当前进程/会话的默认字符集
	mysql_set_character_set(mysql,"utf8");
	printf("after,字符集:%s\n", mysql_character_set_name(mysql));*/

	f_printmenu();
	scanf("%d", &choose);
	system("cls");
	while (choose)
	{
		switch (choose)
		{
		case _insert:
			f_insert(mysql);
			break;
		case _delete:
			f_delete(mysql);
			break;
		case _modify:
			f_modify(mysql);
			break;
		case _select:
			f_select(mysql);
			break;
		default:
			printf("输入错误\n");
			break;
		}
		f_printmenu();
		scanf("%d", &choose);
		system("cls");
	}

	//关闭mysql句柄
	mysql_close(mysql);
	system("pause");
	return 0;
}

//菜单函数
void f_printmenu(void)
{
	printf("\
		   ******************\n\
		   *      菜单      *\n\
		   *      1.新建    *\n\
		   *      2.删除    *\n\
		   *      3.修改    *\n\
 		   *      4.查询    *\n\
		   *      0.退出    *\n\
		   ******************\n");
}

//新建函数
int f_insert(MYSQL* mysql)
{
	int number = 0;
	char* tpye = (char*)malloc(20);
	float price = 0;
	int num = 0;
	int iden = 0;
	MYSQL_STMT* stmt = NULL;
	int param_count = 0;
	MYSQL_BIND my_bind[3];
	unsigned long len = 0;

	do
	{
		printf("请输入编号\n");
		scanf("%d", &number);
		printf("请输入类型\n");
		scanf("%s", tpye);
		printf("请输入价格\n");
		scanf("%f", &price);
		len = strlen(tpye);

		//初始化预处理环境句柄mysql_stmt
		stmt = mysql_stmt_init(mysql);
		if (stmt == NULL)
		{
			printf("mysql_stmt_init error:%s\n", mysql_error(mysql));
			system("pause");
			return -1;
		}
		printf("mysql_stmt_init ok\n");

		//向初始化后的环境句柄mysql_stmt添加sql命令
		if (mysql_stmt_prepare(stmt, insert_prepare, strlen(insert_prepare)))
		{
			printf("mysql_stmt_prepare error:%s\n", mysql_stmt_error(stmt));
			system("pause");
			return -1;
		}
		printf("mysql_stmt_prepare ok\n");

		//获取需要绑定变量的个数,即?数量
		param_count = mysql_stmt_param_count(stmt);
		if (param_count != 3)
		{
			printf("mysql_stmt_param_count error:%s\n", mysql_stmt_error(stmt));
			system("pause");
			return -1;
		}
		printf("mysql_stmt_param_count ok\n");

		//设置需要绑定的实参
		memset(my_bind, 0, sizeof(my_bind));
		my_bind[0].buffer_type = MYSQL_TYPE_LONG;
		my_bind[0].buffer = (char*)&number;
		my_bind[0].is_null = 0;
		my_bind[0].length = 0;

		my_bind[1].buffer_type = MYSQL_TYPE_STRING;
		my_bind[1].buffer = tpye;
		my_bind[1].is_null = 0;
		my_bind[1].length = &len;

		my_bind[2].buffer_type = MYSQL_TYPE_FLOAT;
		my_bind[2].buffer = (char*)&price;
		my_bind[2].is_null = 0;
		my_bind[2].length = 0;

		//绑定?对应的实参
		if (mysql_stmt_bind_param(stmt, my_bind))
		{
			printf("mysql_stmt_bind_param error:%s\n", mysql_stmt_error(stmt));
			system("pause");
			return -1;
		}
		printf("mysql_stmt_bind_param ok\n");

		//执行预处理的sql命令
		if (mysql_stmt_execute(stmt))
		{
			printf("mysql_stmt_execute error:%s\n", mysql_stmt_error(stmt));
			system("pause");
			return -1;
		}
		printf("mysql_stmt_execute ok\n");

		//获取影响的行数
		num = mysql_stmt_affected_rows(stmt);
		printf("新建%d行记录\n", num);

		printf("继续新建输入1,返回菜单输入0\n");
		scanf("%d", &iden);
	} while (iden);

	//关闭预处理的环境句柄mysql_stmt
	if (mysql_stmt_close(stmt))
	{
		printf("mysql_stmt_close error:%s\n", mysql_stmt_error(stmt));
		system("pause");
		return -1;
	}
	printf("mysql_stmt_close ok\n");

	return 0;
}

//删除函数
int f_delete(MYSQL* mysql)
{
	int number = 0;
	char* cnumber = (char*)malloc(10);
	char* buffer = (char*)malloc(100);
	int iden = 0;

	do
	{
		printf("请输入编号\n");
		scanf("%d", &number);
		itoa(number, cnumber, 10);
		strcpy(buffer, "delete from test_tb where test_tb.number=");
		strcat(buffer, cnumber);

		//开启事务处理,并且设置手动commit
		mysql_query(mysql, "start transcation");
		mysql_query(mysql, "set autocommit=0");

		//向mysql发送操作命令
		int ret = mysql_query(mysql, buffer);
		if (ret == 0)
		{
			printf("mysql_query ok\n");

			//获取影响的行数
			int num = mysql_affected_rows(mysql);//不能放在commit之后,不然返回的值不对
			printf("删除%d行记录\n", num);

			mysql_query(mysql, "commit");
		}
		else
		{
			printf("mysql_query error:%s\n", mysql_error(mysql));
			mysql_query(mysql, "callback");
		}

		printf("继续新建输入1,返回菜单输入0\n");
		scanf("%d", &iden);
	} while (iden);

	return 0;
}

//修改函数
int f_modify(MYSQL* mysql)
{
	int number = 0;
	char* cnumber = (char*)malloc(10);
	int price = 0;
	char* cprice = (char*)malloc(10);
	char* buffer = (char*)malloc(100);
	int iden = 0;

	do
	{
		printf("请输入编号\n");
		scanf("%d", &number);
		printf("请输入价格\n");
		scanf("%d", &price);
		itoa(number, cnumber, 10);
		gcvt(price, 10, cprice);
		strcpy(buffer, "update test_tb set test_tb.price=");
		strcat(buffer, cprice);
		strcat(buffer, "where test_tb.number=");
		strcat(buffer, cnumber);

		//开启事务处理,并且设置手动commit
		mysql_query(mysql, "start transcation");
		mysql_query(mysql, "set autocommit=0");

		//向mysql发送操作命令
		int ret = mysql_query(mysql, buffer);
		if (ret == 0)
		{
			printf("mysql_query ok\n");

			//获取影响的行数
			int num = mysql_affected_rows(mysql);
			printf("修改%d行记录\n", num);

			mysql_query(mysql, "commit");
		}
		else
		{
			printf("mysql_query error:%s\n", mysql_error(mysql));
			mysql_query(mysql, "callback");
		}

		printf("继续新建输入1,返回菜单输入0\n");
		scanf("%d", &iden);
	} while (iden);

	return 0;
}

//查询函数
int f_select(MYSQL* mysql)
{
	MYSQL_RES* res = NULL;
	MYSQL_ROW row;
	MYSQL_FIELD* field = NULL;
	int number = 0;
	char* buffer = (char*)malloc(100);
	char* cnumber = (char*)malloc(10);
	int iden = 0;

	do
	{
		printf("请输入编号\n");
		scanf("%d", &number);
		itoa(number, cnumber, 10);
		strcpy(buffer, "select * from test_tb where number = ");
		strcat(buffer, cnumber);

		//向mysql发送命令
		int ret = mysql_query(mysql, buffer);
		if (ret == 0)
		{
			printf("mysql_query ok\n");
		}
		else
		{
			printf("mysql_query error:%s\n", mysql_error(mysql));
		}

		//从mysql句柄中获取列数
		//int num = mysql_field_count(mysql);

		//获取结果集
		res = mysql_store_result(mysql);
		if (res == NULL)
		{
			printf("mysql_store_result error: %s\n", mysql_error(mysql));
			system("pause");
			return -1;
		}

		//从结果集中获取列数
		int num = mysql_num_fields(res);

		//获取表头信息
		field = mysql_fetch_fields(res);
		if (field == NULL)
		{
			printf("mysql_fetch_fields error: %s\n", mysql_error(mysql));
		}
		else
		{
			for (int i = 0; i < num; i++)
			{
				printf("%s\t", field[i].name);//my_field[i].name表示列名
			}
			printf("\n");
		}

		//从结果集中获取每一行记录
		while (row = mysql_fetch_row(res))
		{
			for (int i = 0; i < num; i++)//打印每一行记录
			{
				printf("%s\t", row[i]);
			}
			printf("\n");
		}

		//释放结果集
		mysql_free_result(res);

		printf("继续查询输入1,返回菜单输入0\n");
		scanf("%d", &iden);
	} while (iden);

	return 0;
}

标签:error,int,printf,stmt,buffer,API,C++,mysql,MySQL
From: https://blog.csdn.net/2401_85919417/article/details/142929876

相关文章

  • jumpserver堡垒机部署 添加资产主机和MySQL数据库,图解过程
    jumpserver堡垒机部署JumpServer是广受欢迎的开源堡垒机,是符合4A规范的专业运维安全审计系统。JumpServer帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权、事中监察、事后审计,满足等保合规要求。下载软件包JumpServer-开源堡垒机-官网#官方网址......
  • Elasticsearch相关概念对比MySQL
    MySQLElasticsearch说明TableIndex索引(index),就是文档的集合,类似数据库的表(table)RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)SchemaMappingMappi......
  • Elasticsearch相关概念对比MySQL
    Elasticsearch和MySQL是两种不同的数据管理系统,各自有其独特的概念和应用场景。以下是它们在几个关键概念上的对比:o数据模型Elasticsearch:。文档(Document):基本的数据单元,存储为JSON格式。。索引(Index):类似于数据库,包含多个文档。。类型(Type):在7.x版本后已被弃用,之前用于逻......
  • c++不同容器之间的转换
    在C++中,不同容器之间的转换主要依赖于标准库的迭代器。大部分标准容器提供了兼容的构造函数或函数接口来从其他容器转换或初始化数据。下面是几种常见容器的转换方式:1.vector到set的转换#include<iostream>#include<vector>#include<set>intmain(){std::vec......
  • 实验1 现代C++编程初体验
    实验任务1代码#include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingnamespacestd;template<typenameT>voidoutput(constT&c);intrand_int_1......
  • Recaptcha3 协议识别 API 对接说明
    Recaptcha3协议识别API对接说明本文将介绍一种Recaptcha3协议识别API对接说明,它可让用户无需识别和点选Recaptcha3验证码图片,仅需通过提交WebsiteKey即可实现后台自动解码,完成验证。接下来介绍下Recaptcha3协议识别API的对接说明。注册链接点击链接注册......
  • 五官定位 API 对接说明
    五官定位API对接说明本文将介绍一种五官定位API对接说明,它可以通过输入图片,对请求图片进行五官定位(也称人脸关键点定位),计算构成人脸轮廓的90个点,包括眉毛(左右各8点)、眼睛(左右各8点)、鼻子(13点)、嘴巴(22点)、脸型轮廓(21点)、眼珠[或瞳孔](2点)。接下来介绍下五官......
  • 实验1 现代C++编程初体验
    一、实验目的体验现代C++标准库、算法库用法灵活组合使用现代C++基础语言特性(数据表示、分支、循环、函数)和标准库,编程解决简单、基础问题编程代码过程中,注意编码素养。关注代码表达,提升代码的可读性、易于维护性二、实验准备系统浏览教材以下章节,对现代c++基础语言特性和......
  • C++的仿函数functor
    C++的仿函数functor详细内容仿函数(Functor)是C++中的一种设计模式,也叫函数对象。仿函数是一个重载了operator()的类或结构体,它可以像普通函数一样被调用。这使得它具有类似函数的行为,但实际上它是一个对象,因此可以拥有状态(成员变量)和更多的灵活性。仿函数的主要用途是:可以......
  • mysql:赋予表格数据、用 cmd 运行 mysql 访问数据。
    前言:mysql:新建数据库与数据表,并用cmd运行mysql成功访问到了数据。-CSDN博客(一)创建表格数据打开MySQLWorkbench,跟据以下步骤操作。完成以上步骤,表格数据提交成功,现在打开cmd命令符运行mysql。(二)借助cmd运行mysql数据mysql-uroot-p(运行) showdatabase......