C/C++ vs2017连接MySQL数据库 - 增删改查(详细步骤)

在开发中,数据库是必不可少,这篇文章将介绍使用C/C++如何进行连接MySQL数据库,并实现增删改查操作!

注意,此篇文章所讲的是C/C++如何操控MySQL进行简单的、常用的“增删改查”的操作!



一、配置Visual Studio

  1. 找到自己安装MySQL的路径,确保有include和lib两个文件夹
    在这里插入图片描述

  2. 打开创建的Visual Studio项目,切换x64平台
    在这里插入图片描述

    注意:如果你的项目中没有x64平台,请严格按照下面图片的步骤进行操作
    a. 点击下拉框,点击配置管理器
    在这里插入图片描述
    b.在弹出的配置管理器页面,创建一个x64平台,并确定
    在这里插入图片描述
    在这里插入图片描述

    c.将两个平台都切换至x64,关闭即可
    在这里插入图片描述
    关闭后,也许你会发现自己的项目中已经没有生成或者重写生成的功能,这问题不大,不影响正常编译运行代码!

  3. 点击项目,属性
    在这里插入图片描述

  4. 依次点击 配置属性 - VC++目录 - 包含目录 - 编辑,将include路径粘贴于此

    在这里插入图片描述
    在这里插入图片描述

  5. 依次点击 配置属性 - VC++目录 - 库目录 - 编辑,将lib路径粘贴于此
    在这里插入图片描述
    在这里插入图片描述

  6. 依次点击 配置属性 - 链接器 - 输入 - 附加依赖项 - 编辑,再次输入字符串 libmysql.lib

    注意,不是将libmysql.lib的路径复制到这里,是将字符串复制到这里!
    在这里插入图片描述
    在这里插入图片描述

  7. 将lib目录下的libmysql.lib文件复制到C:\Windows\System32目录下
    在这里插入图片描述

请严格按照上面图片的步骤进行操作,否则会出现数据库连接不上的问题!
另外,如果你的项目没有x64平台,而是根据步骤2进行创建的,那么你需要在代码中加入此行代码:

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

以防止连接不上数据库的问题!


二、C/C++连接数据库

操纵数据库所用到的函数:

函数解析
mysql_init初始化数据库句柄
mysql_options设置字符编码
mysql_real_connect连接数据库
mysql_select_db选择数据库
mysql_real_query执行sql语句,成功返回0,失败返回非0
mysql_store_result获取查询的结果集
mysql_fetch_row获取查询到的一行数据
mysql_free_result释放结果集
mysql_close关闭数据库
mysql_error获取数据库当前操作失败的原因

操纵数据库所用到的变量类型:

类型解析
MYSQL数据库句柄
MYSQL_RES查询结果集
MYSQL_ROW记录结果集结构体

当然除了这些,还有许多其他的,但是不常用,我这里列举的都是项目中比较常用的mysql函数;有兴趣的朋友可以自己去了解一下mysql的其他函数!


根据自己的项目需求提前创建好数据库和表:
例如我这里提前创建好了数据库:connect_c_cpp_text
表:student
表的字段设置如下:
在这里插入图片描述


1. 连接数据库 与 选择数据库

bool connectDB(MYSQL &mysql) {
	// 1.初始化数据库句柄
	mysql_init(&mysql);
	
	// 2.设置字符编码
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

	// 3.连接数据库										// 账号	  密码         数据库名
	MYSQL *ret = mysql_real_connect(&mysql, "127.0.0.1", "root", "yang", "connect_c_cpp_text", 3306, NULL, 0);
	if (ret == NULL) {
		printf("数据库连接失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据连接成功!\n");

	// 选择数据库,成功返回0,失败返回非0
	int res = mysql_select_db(&mysql, "connect_c_cpp_text");
	if (res) {
		printf("选择数据库失败!失败原因%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据库选择成功!\n");

	return true;
}

2. 插入表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool addTableData(int id, char *name, int age, char *sex) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "INSERT INTO student VALUES(%d, '%s', %d, '%s');", id, name, age, sex);
	printf("插入sql语句:%s\n", sql);
	// 如果id字段用了auto_increment进行修饰,那么可以使用以下数据库语句:
	// snprintf(sql, SQL_MAX, "INSERT INTO student(name, age, sex) VALUES('%s', %d, '%s');", name, age, sex);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);		
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));		
	printf("执行插入语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("插入表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("插入表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

3. 删除表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool delTableData(int id) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "DELETE FROM student WHERE id = %d;", id);
	printf("删除sql语句:%s\n", sql);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行删除语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("删除表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;

	}
	printf("删除表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

4. 修改表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool altTableData(int id, int age) {
	MYSQL mysql;		// 数据库句柄
	char sql[SQL_MAX];	// sql语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "UPDATE student SET age = %d WHERE id = %d;", age, id);
	printf("修改sql语句:%s\n", sql);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行修改语句,修改返回结果:%d\n", ret);

	if (ret) {
		printf("数据修改失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("修改表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

5. 查询表数据

根据自己的表字段进行设置sql语句,再执行即可!

bool queTableData() {
	MYSQL mysql;		// 数据库句柄
	MYSQL_RES* res;		// 查询结果集
	MYSQL_ROW row;		// 记录结构体
	char sql[SQL_MAX];	// SQL语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "SELECT id, name, age, sex FROM student;");
	printf("查询sql语句:%s\n", sql);

	// 查询数据
	//int ret = mysql_query(&mysql, "select * from student;");		// 等效于下面一行代码
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行查询语句,查询返回结果:%d\n", ret);

	if (ret) {
		printf("数据查询失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("数据查询成功!\n");
	


	// 获取结果集
	res = mysql_store_result(&mysql);

	// 获取查询到的一行数据
	// 给row赋值,判断row是否为空,不为空就打印数据。
	while (row = mysql_fetch_row(res)) {
		printf("%d  ", atoi(row[0]));	// 转换为int类型,打印id
		printf("%s  ", row[1]);			// 打印姓名
		printf("%d  ", atoi(row[2]));	// 转换为int类型,打印年龄
		printf("%s  \n", row[3]);		// 打印性别
	}

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

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

全部测试代码:

#include <stdio.h>
#include <mysql.h> // mysql文件

#define SQL_MAX 256		// sql语句字符数组最大值


// 连接数据库
static bool connectDB(MYSQL &mysql);
// 插入数据
bool addTableData(int id, char *name, int age, char *sex);
// 删除数据
bool delTableData(int id);
// 修改数据
bool altTableData(int id, int age);
// 查询数据
bool queTableData();

int main(void) {
	delTableData(1);

	addTableData(1, (char *)"小明", 20, (char *)"男");

	altTableData(1, 22);

	queTableData();

	return 0;
}


/*****************************************************
 * 功能:连接connect_c_cpp_text数据库,并选择数据库
 *
 * 参数:
 *			mysql - 数据库句柄
 *
 * 返回值:
 *			连接成功返回true,连接失败返回false
 *****************************************************/
bool connectDB(MYSQL &mysql) {
	// 1.初始化数据库句柄
	mysql_init(&mysql);
	
	// 2.设置字符编码
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

	// 3.连接数据库
	MYSQL *ret = mysql_real_connect(&mysql, "127.0.0.1", "root", "yang", "connect_c_cpp_text", 3306, NULL, 0);
	if (ret == NULL) {
		printf("数据库连接失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据连接成功!\n");

	// 选择数据库
	int res = mysql_select_db(&mysql, "connect_c_cpp_text");
	if (res) {
		printf("选择数据库失败!失败原因%s\n", mysql_error(&mysql));
		return false;
	}

	printf("数据库选择成功!\n");

	return true;
}


/****************************************************
 * 功能:向student表中插入一条记录
 * 
 * 参数:
 *			id	 - 对应表字段id,编号
 *			name - 对应表字段name,姓名
 *			age	 - 对应表字段age,年龄
 *			sex	 - 对应表字段sex,性别
 *
 * 返回值:
 *			插入成功返回true,插入失败返回false
 ****************************************************/
bool addTableData(int id, char *name, int age, char *sex) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "INSERT INTO student VALUES(%d, '%s', %d, '%s');", id, name, age, sex);
	printf("插入sql语句:%s\n", sql);
	// 如果id字段用了auto_increment进行修饰,那么可以使用以下数据库语句:
	// snprintf(sql, SQL_MAX, "INSERT INTO student(name, age, sex) VALUES('%s', %d, '%s');", name, age, sex);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);		
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));		
	printf("执行插入语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("插入表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("插入表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}

/*****************************************************
 * 功能:删除student表中id字段等于参数id的记录
 *
 * 参数:
 *			id - 对应表字段id,编号
 *
 * 返回值:
 *			删除成功返回true,删除失败返回false
 *****************************************************/
bool delTableData(int id) {
	MYSQL mysql;			// 数据库句柄
	char sql[SQL_MAX];		// 存储sql语句

		// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言字符串组合
	snprintf(sql, SQL_MAX, "DELETE FROM student WHERE id = %d;", id);
	printf("删除sql语句:%s\n", sql);

	// 执行sql语句,成功返回0
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行删除语句,插入返回结果:%d\n", ret);

	if (ret) {
		printf("删除表数据失败!失败原因:%s\n", mysql_error(&mysql));
		return false;

	}
	printf("删除表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}


/******************************************************
 * 功能:根据参数id,修改对应表记录的年龄为参数age
 *
 * 参数:
 *			id	- 对应表字段id,编号
 *			age - 对应表字段age,年龄
 *
 * 返回值:
 *			修改成功返回true,修改失败返回false
 *******************************************************/
bool altTableData(int id, int age) {
	MYSQL mysql;		// 数据库句柄
	char sql[SQL_MAX];	// sql语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "UPDATE student SET age = %d WHERE id = %d;", age, id);
	printf("修改sql语句:%s\n", sql);

	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行修改语句,修改返回结果:%d\n", ret);

	if (ret) {
		printf("数据修改失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}

	printf("修改表数据成功!\n");

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}


/********************************************************
 * 功能:查询student表中所有数据记录,并输出至控制台
 * 
 * 参数:
 *			无
 *
 * 返回值:
 *			查询成功返回true,查询失败返回false
 ********************************************************/
bool queTableData() {
	MYSQL mysql;		// 数据库句柄
	MYSQL_RES* res;		// 查询结果集
	MYSQL_ROW row;		// 记录结构体
	char sql[SQL_MAX];	// SQL语句

	// 连接数据库
	if (!connectDB(mysql)) {
		return false;
	}

	// C语言组合字符串
	snprintf(sql, SQL_MAX, "SELECT id, name, age, sex FROM student;");
	printf("查询sql语句:%s\n", sql);

	// 查询数据
	//int ret = mysql_query(&mysql, "select * from student;");		// 等效于下面一行代码
	//int ret = mysql_query(&mysql, sql);
	int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
	printf("执行查询语句,查询返回结果:%d\n", ret);

	if (ret) {
		printf("数据查询失败!失败原因:%s\n", mysql_error(&mysql));
		return false;
	}
	printf("数据查询成功!\n");
	


	// 获取结果集
	res = mysql_store_result(&mysql);

	// 获取查询到的一行数据
	// 给row赋值,判断row是否为空,不为空就打印数据。
	while (row = mysql_fetch_row(res)) {
		printf("%d  ", atoi(row[0]));	// 转换为int类型,打印id
		printf("%s  ", row[1]);			// 打印姓名
		printf("%d  ", atoi(row[2]));	// 转换为int类型,打印年龄
		printf("%s  \n", row[3]);		// 打印性别
	}

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

	// 关闭数据库
	mysql_close(&mysql);

	return true;
}


总结
只是简单的写下了C/C++连接数据和和操纵数据库的代码,并没有对其中函数和变量进行讲解;都有注释,自己看吧,看不懂再评论提问吧!

另外,上面sql语句的关键我都使用了大写,为什么呢?就是为了区分作用,使得很好检查sql语句的语法错误!

  • 71
    点赞
  • 365
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 75
    评论
下面是一个使用C++连接MySQL数据库并实现增删改查的示例代码: ```c++ #include <iostream> #include <mysql.h> #include <string> using namespace std; int main() { MYSQL *conn; // MySQL连接 MYSQL_RES *res; // MySQL查询结果集 MYSQL_ROW row; // MySQL查询结果行 // 初始化MySQL连接 conn = mysql_init(NULL); // 连接MySQL数据库 if (!mysql_real_connect(conn, "localhost", "username", "password", "database", 0, NULL, 0)) { cout << "Error: " << mysql_error(conn) << endl; return 1; } // 设置MySQL字符集 mysql_set_character_set(conn, "utf8"); // 插入数据 string insert_sql = "INSERT INTO students (id, name, age) VALUES ('001', 'Tom', 18)"; if (mysql_query(conn, insert_sql.c_str()) != 0) { cout << "Error: " << mysql_error(conn) << endl; return 1; } cout << "Insert success!" << endl; // 查询数据 string select_sql = "SELECT * FROM students"; if (mysql_query(conn, select_sql.c_str()) != 0) { cout << "Error: " << mysql_error(conn) << endl; return 1; } res = mysql_use_result(conn); cout << "ID\tName\tAge" << endl; while ((row = mysql_fetch_row(res)) != NULL) { cout << row[0] << "\t" << row[1] << "\t" << row[2] << endl; } mysql_free_result(res); // 更新数据 string update_sql = "UPDATE students SET age = 20 WHERE id = '001'"; if (mysql_query(conn, update_sql.c_str()) != 0) { cout << "Error: " << mysql_error(conn) << endl; return 1; } cout << "Update success!" << endl; // 删除数据 string delete_sql = "DELETE FROM students WHERE id = '001'"; if (mysql_query(conn, delete_sql.c_str()) != 0) { cout << "Error: " << mysql_error(conn) << endl; return 1; } cout << "Delete success!" << endl; // 关闭MySQL连接 mysql_close(conn); return 0; } ``` 在上面的示例代码中,我们连接了一个名为 `database` 的MySQL数据库,其中包含一个名为 `students` 的表,表中包含 `id`、`name` 和 `age` 三个字段。我们使用了 `mysql_real_connect()` 函数来连接MySQL数据库,并且使用了 `mysql_query()` 函数来执行SQL语句。 在示例代码中,我们实现了插入数据、查询数据、更新数据和删除数据四个操作,分别对应了SQL语句中的 INSERT、SELECT、UPDATE 和 DELETE 命令。同时,我们使用了 `mysql_fetch_row()` 函数来获取查询结果集中的每一行数据,并输出给用户。
评论 75
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值