小言_互联网的博客

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

531人阅读  评论(0)

在开发中,数据库是必不可少,这篇文章将介绍使用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 数据库句柄
MYSQL_RES 查询结果集
MYSQL_ROW 记录结果集结构体

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);

	// 执行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);

	// 执行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语句的语法错误!


转载:https://blog.csdn.net/cpp_learner/article/details/116171955
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场